2k likes | 2.43k Views
Семейства микроконтроллеров AVR Стандартные семейства:. tinyAVR Флеш-память 8 Кб, SRAM 512 б, EEPROM 512 б Число линий В/В 6-18 (общее количество выводов 8-32) Ограниченный набор периферийных устройств megaAVR Флеш-память 256 Кб, SRAM 8 Кб, EEPROM 4 Кб
E N D
Семейства микроконтроллеров AVRСтандартные семейства: tinyAVR Флеш-память 8 Кб, SRAM 512 б, EEPROM 512 б Число линий В/В 6-18 (общее количество выводов 8-32) Ограниченный набор периферийных устройств megaAVR Флеш-память 256 Кб, SRAM 8 Кб, EEPROM 4 Кб Число линий В/В 23-86 (общее количество выводов 28-100) Аппаратный умножитель Расширенная система команд и периферийных устройств XMEGA AVR Флеш-память 384 Кб, SRAM 32 Кб, EEPROM 4 Кб 4-ех канальный DMA-контроллер Инновационная система обработки событий Примечание: здесь приведены максимальные значения объёмов памяти На основе стандартных семейств выпускаются микроконтроллеры адаптированные под конкретные приложения: со встроенными интерфейсами USB, CAN, контроллером LCD; со встроенным радио приёмо-передатчиком – серии ATAхxxx, ATAMxxx; для управления электродвигателями – серия AT90PWMxxxx; для автомобильной электроники; для осветительной техники.
Сравнительные характеристики памяти
Микроконтроллеры AVR Общая структурная схема
Диаграмма зависимости тока потребления от напряжения питания и тактовой частоты
Предельные характеристики • Диапазон рабочих температур от -40°C до +105°C • Диапазон температур хранения от -65°C до +150°C • Напряжение на любом выводе относительно земли от -1,0 В до +7,0 В • Максимальное рабочее напряжение 6,6 В Потребление по постоянному току 300 мА
Адресное пространство статической памяти данных (SRAM)
Способы тактирования МК AVR с использованием: а — кварцевого резонатора; б — внешнего генератора; в — RC-цепочки
Установка конфигурационных ячеек CKSEL в зависимости от режимов тактирования
Периферийные устройства • Порты ввода-вывода • Таймеры-счетчики • Аналоговый компаратор • Аналого-цифровой преобразователь • Последовательные порты • UART • Интерфейс SPI • Интерфейс TWI (I2С) • Универсальный последовательный интерфейс USI
Порты ввода вывода Порты ввода/вывода позволяют микроконтроллеру обмениваться информацией с внешним миром. Посредством данного модуля микроконтроллер может как выдавать информацию на различные внешние устройства (светодиоды, семисегментные индикаторы, пьезоизлучатели, реле ….), так и принимать ее от различных источников (кнопки, ИК-приемники, датчики …). Регистр направления данных
Функциональная схема работы линии порта X PORTx- регистр данных порта; PINx – диапазон адресов для чтения входа
Аналоговый компаратор ANA Управляющий регистр –AnalogComparatorControlandStatusRegister– ACSR. Биты управления: Бит 3 – ACIE (AnalogComparatorInterruptEnable) – бит разрешения прерывания аналогового компаратора 1 – разрешено, 0 – запрещено.Биты 1,0 – ACIS1, ACIS0 (AnalogComparatorInterruptModeSelect) – состояние данных битов определяет событие, по которому формируется прерывание:ACIS1=0, ACIS0=0 – прерывание при изменении выходного напряжения компаратора;ACIS1=0, ACIS0=1 – не используется;ACIS1=1, ACIS0=0 – прерывание по спадающему фронту;ACIS1=1, ACIS0=1 – прерывание по нарастающему фронту.Биты состояния:Бит 4 – ACI (AnalogComparatorInterruptFlag) – флаг устанавливается автоматически при возникновении события, обусловленного битами ACIS1, ACIS0. Сбрасывается автоматически при переходе по соответствующему вектору прерывания или программно, записью в него лог. 1.
Аналого–цифровой преобразователь (АЦП) ADC Управляющий регистр – ADC ControlandStatusRegister A – ADCSRA. Биты управления:Бит 3 – ADIE (ADC InterruptEnable) – бит разрешения прерывания аналого–цифрового преобразователя : 1 – разрешено, 0 – запрещено.Биты состояния:Бит 4 – ADIF (ADC InterruptFlag) – устанавливается автоматически при условии окончания цикла аналого–цифрового преобразования и обновлении содержимого регистра данных АЦП. Сбрасывается автоматически при переходе по соответствующему вектору прерывания или программно, записью в него лог.1.
Универсальный синхронный приемопередатчик USART Управляющий регистр – USART ControlandStatusRegister B – UCSRB Биты управления:Бит 7 – RXCIE: RX CompleteInterruptEnable– бит разрешения прерывания по завершении приема.): 1 – разрешено, 0 – запрещено.Бит 6 – TXCIE: TX CompleteInterruptEnable– бит разрешения прерывания по завершению передачи. Если данный бит установлен в 1, то при установке флага ТХС регистра UCSRA генерируется прерывание «передача завершена».Бит 5 – UDRIE: USART DataRegisterEmptyInterruptEnable– бит разрешения прерывания при очистке регистра данных UART. Если данный бит установлен в 1, то при установке флага UDRE регистра UCSRA генерируется прерывание «регистр данных пуст».Биты состояния:Биты состояния прерываний модуля USART собраны в один флаговый регистр UCSRA – USART ControlandStatusRegister A
Биты состояния прерываний модуля USART собраны в один флаговый регистр UCSRA – USART ControlandStatusRegister A Бит 7 – RXC: USART ReceiveComplete – флаг устанавливается в 1 при наличии непрочитанных данных в буфере приемника (регистр данных UDR). Сбрасывается флаг аппаратно после опустошения буфера.Бит 6 – TXC: USART TransmitComplete – флаг устанавливается в 1 после передачи всех битов посылки из сдвигового регистра передатчика при условии, что в регистр данных UDR не было загружено новое значение. Сбрасывается автоматически при переходе по соответствующему вектору прерывания или записью в него лог. 1.Бит 5 – UDRE: USART DataRegisterEmpty – флаг устанавливается в 1 при наличии непрочитанных данных в буфере приемника (регистр данных UDR). Сбрасывается флаг аппаратно после опустошения буфера.
Последовательный интерфейс SPI Управляющий регистр – SPI ControlRegister– SPCR Биты управления:Бит 7 – SPIE: SPI InterruptEnable– бит разрешения прерывания по окончании передачи по SPI: 1– разрешено, 0 – запрещено.Биты состояния:Флаг состояния прерывания от SPI находится в регистре – SPI StatusRegister– SPSR
Флаг состояния прерывания от SPI находится в регистре – SPI StatusRegister – SPSR Bit 7 – SPIF: SPI InterruptFlag – флаг устанавливается в 1 по окончании передачи очередного байта. Также флаг SPIF устанавливается в 1 при переводе микроконтроллера из режима Master в режим Slave посредством вывода SS. Флаг сбрасывается аппаратно либо при старте подпрограммы обработки прерывания, либо после чтения регистра состояния SPI с последующим обращением к регистру данных SPI (SPDR)
Последовательный интерфейс TWI Управляющий регистр – TWI ControlRegister– TWCR Биты управления:Бит 0 – TWIE: TWI InterruptEnable – бит разрешения прерывания от модуля TWI: 1 – прерывание разрешено, 0 – запрещено.Биты состояния:Бит 7 – TWINT: TWI InterruptFlag – флаг прерывания от модуля TWI. Устанавливается аппаратно после выполнения очередной операции, когда модуль ожидает отклика со стороны программы. Сброс флага может быть осуществлен только записью в него лог. 1
EEPROM Управляющий регистр –The EEPROM ControlRegister– EECR Биты управления:Бит 3 – EERIE: EEPROM ReadyInterruptEnable – бит управления генерацией прерывания, возникающего при завершении цикла программирования EEPROM: 1 – прерывание разрешено, 0 – запрещено.
Прерывания, использующиеся при самопрограммировании Управляющий регистр – StoreProgramMemoryControlRegister – SPMCR Биты управления:Бит 7 – SPMIE: SPM InterruptEnable– бит разрешения прерывания «Готовность SPM»:1 – разрешено, 0 – запрещено. Прерывание генерируется все время, пока бит SPMEN регистра сброшен в 0.
Программирование AVR в AVR Studio (Интегрированная отладочная среда AVR Studio фирмы Atmel – IDE (Integrated Development Environment)) Первым делом подключаем файл описаний для микроконтроллера (ATmega8 – m8def.inc). • .include "m8def.inc“Далее добавляем таблицу векторов прерываний, которую можно скопировать из официальной технической документации на контроллер. Никакие прерывания, кроме основного RESET нам не потребуются, поэтому их закомментируем, а вместо них ставим пустую команду «nop»: • rjmp RESET; External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset - эта команда выполнится сразу после подачи питания, то есть произойдет переход на метку RESET, по которой и расположим основную программуnop ; rjmp INT0; External Interrupt Request 0nop ; rjmprjmp INT1; External Interrupt Request 1nop ; rjmp TIMER2_COMP; Timer/Counter2 Compare Matchnop ; rjmp TIMER2_OVF; Timer/Counter2 Overflownop ; rjmp TIMER1_CAPT; Timer/Counter1 Capture Eventnop ; rjmp TIMER1_COMPA; Timer/Counter1 Compare Match Anop ; rjmp TIMER1_COMPB; Timer/Counter1 Compare Match Bnop ; rjmp TIMER1_OVF; Timer/Counter1 Overflownop ; rjmp TIMER0_OVF; Timer/Counter0 Overflownop ; rjmp SPI_STC; Serial Transfer Completenop ; rjmp USART_RXC; USART, Rx Completenop ; rjmp USART_UDRE; USART Data Register Emptynop ; rjmp USART_TXC; USART, Tx Completenop ; rjmp ADC; ADC Conversion Completenop ; rjmp EE_RDY; EEPROM Readynop ; rjmp ANA_COMP; Analog Comparatornop ; rjmp TWI; Two-wire Serial Interfacenop ; rjmp SPM_RDY; Store Program Memory Ready
Есть и более короткий способ оформления таблицы векторов прерываний (он актуален для старших Mega, где число прерываний может достигать нескольких десятков, а из-за четырехбайтового формата команды jmp заменить ее на reti просто так не получается). Способ основан на использовании директивы org, которая устанавливает абсолютный адрес в памяти программ. В inc-файлах есть специальные определения констант для адресов прерываний, например (из файла 8515def.inc):.equ INT0addr=$001; External Interrupt0 Vector Address. . . . . . . . . . ..equURXCaddr=$009; UART Receive Complete Interrupt Vector Address.equUDREaddr=$00a; UART Data Register Empty Interrupt Vector Address.equUTXCaddr=$00b; UART Transmit Complete Interrupt Vector Address. . . . . . . . . . .Тогда, если вам, к примеру, никакие иные прерывания не требуются, кроме прерываний URXC и UDRE для UART, то начало программы может быть таким, как в листинге на слайде.
;Установка векторов прерываний .org 0 ;начало программы после сбросаrjmp RESET.orgUDREaddr ;адрес прерывания UDRE rjmpTransUART.orgURXCaddr ;адрес прерывания URXC rjmpReceiveUART.org $0D ;только для 8515 Classic. . . . . . . . . . .[программа]. . . . . . . . . . .
Программирование AVR в AVR Studio (Интегрированная отладочная среда AVR Studio фирмы Atmel).Продолжение. • Первым делом, в основном теле программы необходимо инициализировать используемые порты: • RESET:; метка на которую мы адресовали программный счетчик в таблице прерыванийser r16 ; заносим в r16 значение 11111111out DDRC, r16 ; порт С - в режим выходаclr r16; очищаем r16out DDRB, r16; порт B – в режим входа • Далее будет идти блок ожидания нажатия кнопки и включения диода: • wait_on: ; метка ожидания включенияsbis PINB,0 ;пропускаем следующую строчку, если нажата кнопкаrjmpwait_on ;на метку ожидания включенияsbi PORTC,0 ;установить нулевой бит порта С , то есть зажечь светодиод
Программирование AVR в AVR Studio • После того как нажатие кнопки прошло и светодиод загорелся необходимо ожидать повторного нажатия. • wait_off: ; метка ожидания выключенияsbis PINB,0 ;пропускаем следующую строчку, если ;нажата кнопкаrjmpwait_off ;на метку ожидания выключенияcbi PORTC,0 ;сбросить нулевой бит порта С – то есть ;погасить светодиод • Так как мы условились, что включение и выключение светодиода будем осуществлять по нажатию кнопки, то необходимо ввести временную задержку после каждой операции. Микроконтроллер выполняет около 1 млн. операций в секунду (по умолчанию в свойствах микроконтроллера в Proteus тактовая частота = 1 МГц). И пока кнопка будет нажата, даже очень короткое время, допустим 0,1 секунду он успеет выполнить 100 000 операций, то есть светодиод будет очень быстро моргать и не известно, в каком состоянии остановится. Введем задержку на 1 секунду. При тактовой частоте в 1 МГц, за 1 секунду микроконтроллер выполнит 1 млн. операций. Пусть микроконтроллер после включения досчитает до 1 млн. и только потом ожидает следующего нажатия. Максимальное число, которое может поместиться в восьмибитном регистре – 256. Для того, чтобы микроконтроллер досчитал до 1 млн. ему понадобится 3 регистра: 256*256*16 = 1 048 256. Получится не 1 млн., а чуть больше, что в итоге даст задержку не на 1 секунду, а на 1,048 с. Оформим задержку подпрограммой delay:
delay:clr r16; очищаем все регистры, в которых будем производить подсчет времениclr r17clr r18d1: ;метка d1inc r16;прибавляем единицу к r16breq d2; если регистр r16 переполнился, то переходим на метку d2rjmp d1; иначе на метку d1d2: ;метка d2inc r17;прибавляем единицу к r17breq d3; если регистр r17 переполнился, то переходим на метку d3rjmpd2; иначе на метку d2d3: ;метка d3inc r18;прибавляем единицу к r18cpi r18,16; сравниваем r18 с числом 16, если равноbreq d4; то на метку d4rjmpd3; иначе на метку d3d4: ;метка d4ret ;выход из подпрограммы
Так как у нас в каждой метке d1, d2 выполняется по 3 операции, а в метке d3 – 4 операции, то общее время подпрограммы delay примерно в 4 раза больше необходимого. Поэтому будем сравнивать регистр r18 не с числом 16 а с числом 4. Тогда метка d3 примет вид: • d3: ;метка d3inc r18;прибавляем единицу к r18cpi r18,4; сравниваем r18 с числом 4, если равноbreq d4; то на метку d4rjmp d1; иначе на метку d1
Результирующая программа .include "m8def.inc" ;подключаем файл описаний для микроконтроллера ATmega8 • ;Таблица векторов прерыванийrjmp RESET; ExternalPin, Power-onReset, Brown-outReset, andWatchdogResetnop ; rjmp INT0; ExternalInterruptRequest 0nop ; rjmprjmp INT1; ExternalInterruptRequest 1nop ; rjmp TIMER2_COMP; Timer/Counter2 CompareMatchnop ; rjmp TIMER2_OVF; Timer/Counter2 Overflownop ; rjmp TIMER1_CAPT; Timer/Counter1 CaptureEventnop ; rjmp TIMER1_COMPA; Timer/Counter1 CompareMatch Anop ; rjmp TIMER1_COMPB; Timer/Counter1 CompareMatch Bnop ; rjmp TIMER1_OVF; Timer/Counter1 Overflownop ; rjmp TIMER0_OVF; Timer/Counter0 Overflownop ; rjmp SPI_STC; SerialTransferCompletenop ; rjmp USART_RXC; USART, RxCompletenop ; rjmp USART_UDRE; USART DataRegisterEmptynop ; rjmp USART_TXC; USART, TxCompletenop ; rjmp ADC; ADC ConversionCompletenop ; rjmp EE_RDY; EEPROM Readynop ; rjmp ANA_COMP; AnalogComparatornop ; rjmp TWI; Two-wireSerialInterfacenop ; rjmp SPM_RDY; StoreProgramMemoryReady
;Основное тело программы RESET:; метка на которую мы адресовали программный счетчик в таблице прерываний;Инициализация портовser r16 ; заносим в r16 значение 11111111out DDRC, r16 ; порт С - в режим выходаclr r16; очищаем r16out DDRB, r16; порт B - в режим входа;Ожидание включенияwait_on: ; метка ожидания включенияsbis PINB,0 ;пропускаем следующую строчку если нажата кнопкаrjmpwait_on ;на метку ожидания включенияsbi PORTC,0 ;установить нулевой бит порта С - то есть зажечь светодиод; Вызываем задержкуrcalldelaywait_off: ; метка ожидания выключенияsbis PINB,0 ;пропускаем следующую строчку если нажата кнопкаrjmpwait_off ;на метку ожидания выключенияcbi PORTC,0 ;сбросить нулевой бит порта С - то есть погасить светодиод
; Вызываем задержкуrcalldelayrjmpwait_on ;на метку ожидания включения; Подпрограмма задержкиdelay:clr r16; очищаем все регистры, в которых будем производить подсчет времениclr r17clr r18d1: ;метка d1inc r16;прибавляем единицу к r16breq d2; если регистр r16 переполнился, то переходим на метку d2rjmp d1; иначе на метку d1d2: ;метка d2inc r17;прибавляем единицу к r17breq d3; если регистр r17 переполнился, то переходим на метку d3rjmpd2; иначе на метку d2d3: ;метка d3inc r18;прибавляем единицу к r18cpi r18,4; сравниваем r18 с числом 4, если равноbreq d4; то на метку d4rjmpd3; иначе на метку d3d4: ;метка d4ret ;выход из подпрограммы задержки
РЕАЛИЗАЦИЯ И ПРОВЕРКА В PROTEUS VSM (ФАЙЛ 11.asm) Простое нажатие – отпускание кнопки с задержкой и выводом на светодиод (верхняя кнопка)
.device AT90S2313 • .include "2313def.inc" • .def temp=r19 • .def temp1=r20 • rjmp RESET; External Pin, Power-on Reset, Brown-out Reset, and Watchdog Reset • nop; rjmp INT0addr=$001 ;External Interrupt0 Vector Address • nop; rjmp INT1addr=$002 ;External Interrupt1 Vector Address • nop; rjmp ICP1addr=$003 ;Input Capture1 Interrupt Vector Address • nop; rjmp OC1addr =$004 ;Output Compare1 Interrupt Vector Address • nop; rjmp OVF1addr=$005 ;Overflow1 Interrupt Vector Address • nop; rjmp OVF0addr=$006 ;Overflow0 Interrupt Vector Address • nop; rjmpURXCaddr=$007 ;UART Receive Complete Interrupt Vector Address • nop; rjmpUDREaddr=$008 ;UART Data Register Empty Interrupt Vector Address • nop; rjmpUTXCaddr=$009 ;UART Transmit Complete Interrupt Vector Address • nop; rjmpACIaddr =$00a ;Analog Comparator Interrupt Vector Address
RESET: • ldi r21,RAMEND • out SPL,r21 • ser r16 • out DDRB, r16;11111111 in DDRB navihod • out PORTB,r16 • clr r16 • out DDRD, r16;00000000 in DDRD navhod • ser r16 • out PORTD,r16;11111111 in PORTD podkluchenieresistorov • wait_on: • sbis PIND,0;propustit esli bit0=0 navhodeporta (nagataknopka --=0) • rjmpwait_on • ldi temp,0b00000001 • out PORTB,temp;ochistit PORTB bit0=0 (zagechsvetodiod) • rcall delay; perehodnazadergqu • wait_off: • sbic PIND,0; propustitesli bit0=1 navhodeporta (otpuschenaknopka --=1) • rjmpwait_off; cikl • cbi PORTB,0; ustanovit PORTB bit0=1 (pogasitsvetodiod) • rcall delay; perehodnazadergqu • rjmpwait_on
delay: • clr r16; • clr r17 • clr r18 • d1: • inc r16 • breq d2 • rjmp d1 • d2: • inc r17 • breq d3 • rjmp d2 • d3: • inc r18 • cpi r18,4 • breq d4 • rjmp d3 • d4: • ret
РЕАЛИЗАЦИЯ И ПРОВЕРКА В PROTEUS VSM (ФАЙЛ 12.asm) • Простое нажатие кнопки + подсчет нажатий и вывод значений счетчика на светодиоды • Задержка реализована программно без использования таймера микроконтроллера