- •5.3. Микроконтроллер avr at90s8515 семейства Classic
- •Организация памяти микроконтроллера
- •Память программ
- •Память данных
- •Использование внешнего озу
- •Регистры общего назначения
- •Регистры ввода/вывода
- •Энергонезависимая память данных
- •Сторожевой таймер
- •Последовательный периферийный интерфейс spi
- •Прерывания
- •Обработка прерываний
- •Программирование микроконтроллеров
- •Защита программного кода и данных
- •Система команд и способы адресации памяти данных
- •Прямая адресация
- •Прямая адресация одного регистра общего назначения
- •Прямая адресация двух регистров общего назначения
- •Прямая адресация регистра ввода/вывода
- •Прямая адресация озу
- •Косвенная адресация
- •Простая косвенная адресация
- •Относительная косвенная адресация
- •Косвенная адресация с преддекрементом
- •Косвенная адресация с постинкрементом
- •Система команд
- •Операнды
- •Типы команд
- •Команды арифметических и логических операций
- •Команды пересылки данных
- •Команды передачи управления
- •Команды операций с битами
- •Команды управления системой
- •Пример программы и её оформление
- •Микропроцессорная система управления на базе мк at90s8515
- •7. Микроконтроллер экр1847вг6
- •8. Частотно-регулируемые привода
- •Режимы управления асинхронными электродвигателями
- •Преобразователь частоты 1336Plus
Регистры общего назначения
Все регистры общего назначения объединены в файл. Как уже было сказано, в микроконтроллерах AVR все 32 РОН непосредственно доступны АЛУ. Благодаря этому любой РОН может использоваться в командах и как операнд источник и как операнд-приемник.
Шесть регистров общего назначения R26 -R31 (X, Y, Z) используется в качестве указателей при косвенной адресации памяти данных.
Каждый регистр файла имеет свой собственный адрес в пространстве памяти данных. Поэтому к ним можно обращаться как к памяти, несмотря на то, что физически эти регистры не являются ячейками ОЗУ.
Регистры ввода/вывода
Регистры ввода/вывода располагаются в так называемом пространстве ввода/вывода размером 64 байта. Все РВВ можно разделить на две группы: служебные регистры микроконтроллера и регистры, относящиеся к периферийным устройствам (в т.ч. порты ввода/вывода). Размер каждого регистра - 8 разрядов.
Так же, как и к РОН, к регистрам ввода/вывода можно обращаться двумя способами: как собственно к регистрам (с помощью команд IN и OUT) и как к ячейкам ОЗУ. В первом случае используются адреса РВВ, принадлежащие пространству ввода/вывода ($00...$3F). Во втором случае адрес РВВ необходимо увеличить на $20 (в таблицах и далее в книге при указании адресов РВВ в скобках указываются соответствующие им адреса ячеек ОЗУ).
Каждый бит регистров ввода/вывода с адресами $00…$1F имеет свой адрес, т.е. по отношению к ним можно использовать команды операций с битами.
Адреса регистров ввода/вывода AT90S8515 приведены в табл. 5.18.
Энергонезависимая память данных
Как уже было сказано, микроконтроллеры AVR семейства Classic имеют в своем составе энергонезависимую память (EEPROM). Объем этой памяти в МК AT90S8515 составляет 512 байт. EEPROM-память расположена в своем адресном пространстве и также, как и ОЗУ, организована линейно.
Для обращения к EEPROM-памяти используются три регистра: регистр адреса, регистр данных и регистр управления.
Таблица 5.18. Адреса регистров ввода/вывода AT90S8515
Адрес регистра |
Адрес SRAM |
Наименование |
Обозначение бит в регистрах 7 6 5 4 3 2 1 0 |
Комментарий |
|
$00- -$07 |
Байтовая и битовая адресация в регистрах |
$20-$27 |
Резерв |
|
|
$08 |
$28 |
ACSR |
ACD - ACO ACI ACIE ACIC ACIS1 ACIS0 |
Управление аналоговым компаратором и регистр статуса |
|
$09 |
$29 |
UBRR |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 |
Регистр скорости UART (бод) |
|
$0A |
$2A |
UCR |
RXCIE TXCIE UDRIE RXEN TXEN CHR9 RXB8 TXB8 |
Регистр управления UART |
|
$0B |
$2B |
USR |
RXC TXC UDRE FE OR - - - |
Регистр статуса UART |
|
$0C |
$2C |
UDR |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 |
Регистр вв/выв данных UART |
|
$0D |
$2D |
SPCR |
SPIE SPE DORD MSTR CPOL CPHA SPR1 SPR0 |
Регистр управления SPI |
|
$0E |
$2E |
SPSR |
SPIF WCOL - - - - - - |
Регистр статуса SPI |
|
$0F |
$2F |
SPDR |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 |
Регистр вв/выв данных SPI |
|
$10 |
$30 |
PIND |
PIND7 - - - - - - PIND0 |
Буфер ввода порта D |
|
$11 |
$31 |
DDRD |
DDD7 - - - - - - DDD0 |
Регистр задания направления передачи данных, порт D |
|
$12 |
$32 |
PORTD |
PORTD7 - - - - - - PORTD0 |
Регистр данных, порт D |
|
$13 |
$33 |
PINC |
PINС7 - - - - - - PINС0 |
Буфер ввода порта C |
|
$14 |
$34 |
DDRC |
DDС7 - - - - - - DDС0 |
Регистр задания направления передачи данных, порт C |
|
$15 |
$35 |
PORTC |
PORTС7 - - - - - - PORTС0 |
Регистр данных, порт C |
|
$16 |
$36 |
PINB |
PINВ7 - - - - - - PINВ0 |
Буфер ввода порта B |
|
$17 |
$37 |
DDRB |
DDВ7 - - - - - - DDВ0 |
Регистр задания направления передачи данных, порт B |
|
$18 |
$38 |
PORTB |
PORTВ7 - - - - - - PORTВ0 |
Регистр данных, порт B |
|
$19 |
$39 |
PINA |
PINA7 - - - - - - PINA0 |
Буфер ввода порта A |
|
$1A |
$3A |
DDRA |
DDA7 - - - - - - DDA0 |
Регистр задания направления передачи данных, порт A |
|
$1B |
$3B |
PORTA |
PORTA7 - - - - - - PORTA0 |
Регистр данных, порт A |
|
$1C |
$3C |
EECR |
- - - - - EEMWE EEWE EERE |
Регистр управления EEPROM |
|
$1D |
$3D |
EEDR |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 |
Регистр данных EEPROM |
|
$1E |
$3E |
EEARL |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 |
Регистр адреса младшего байта EEPROM |
|
$1F |
$3F |
EEARH |
- - - - - - - EEAR8 |
Регистр адреса старшего байта EEPROM (только AT90S8515) |
|
$20 |
Байтовая адресация |
$40 |
Резерв |
… |
… |
$21 |
$41 |
WDTCR |
- - - WDTOE WDE WDP2 WDP1 WDP0 |
Регистр управления сторожевым таймером (Watchdog) |
|
… |
… |
Резерв |
… |
… |
|
$24 |
$44 |
ICR1L |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 |
Входной регистр захвата младшего байта T/C1 |
|
$25 |
$45 |
ICR1H |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 |
Входной регистр захвата старшего байта T/C1 |
|
… |
… |
Резерв |
… |
… |
|
$28 |
$48 |
OCR1BL |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 |
Выходной регистр сравнения “В” Т/С1, младший байт |
|
$29 |
$49 |
OCR1BH |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 |
Выходной регистр сравнения “В” Т/С1, старший байт |
|
$2A |
$4A |
OCR1AL |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 |
Выходной регистр сравнения “А” Т/С1, младший байт |
|
$2B |
$4B |
OCR1AH |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 |
Выходной регистр сравнения “А” Т/С1, старший байт |
|
$2C |
$4C |
TCNT1L |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 |
Таймер/счётчик 1, мл. байт |
|
$2D |
$4D |
TCNT1H |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 |
Таймер/счётчик 1, ст. байт |
|
$2E |
$4E |
TCCR1B |
ICNC1 ICES1 - - CTC1 CS12 CS11 CS10 |
Регистр управления B Т/С1 |
|
$2F |
$4F |
TCCR1A |
COM1A1 COM1A0 COM1B1 COM1B0 - - PWM11 PWM10 |
Регистр управления A Т/С1 |
|
… |
… |
Резерв |
… |
… |
|
$32 |
$52 |
TCNT0 |
Bit 7 Bit 6 Bit 5 Bit 4 Bit 3 Bit 2 Bit 1 Bit 0 |
Таймер/счётчик 0 (8 бит) |
|
$33 |
$53 |
TCCR0 |
- - - - - CS02 CS01 CS00 |
Регистр управления Т/С0 |
|
$34 |
$54 |
Резерв |
|
|
|
$35 |
$55 |
MCUCR |
SRE SRW SE SM ISC11 ISC10 ISC01 ISC00 |
Регистр управления MCU |
|
$36 |
$56 |
Резерв |
|
|
|
$37 |
$57 |
Резерв |
|
|
|
$38 |
$58 |
TIFR |
TOV1 OCF1A OCF1B - ICF1 - TOV0 - |
Регистр флагов прерываний Т/С |
|
$39 |
$59 |
TIMSK |
TOIE1 OCIE1A OCIE1B - TICIE1 - TOIE0 - |
Регистр маски прерываний Т/С |
|
$3A |
$5A |
GIFR |
INTF1 INTF0 - - - - - - |
Общий регистр флагов прерываний |
|
$3B |
$5B |
GIMSK |
INT1 INT0 - - - - - - |
Общий регистр маски прерываний |
|
$3C |
$5C |
Резерв |
|
|
|
$3D |
$5D |
SPL |
SP7 SP6 SP5 SP4 SP3 SP2 SP1 SP0 |
Младший байт указателя стека |
|
$3E |
$5E |
SPH |
SP15 SP14 SP13 SP12 SP11 SP10 SP9 SP8 |
Старший байт указателя стека |
|
$3F |
$5F |
SREG |
I T H S V N Z C |
Регистр состояния |
|
В регистр адреса загружается адрес ячейки, к которой будет производится обращение. Регистр реализован на двух РВВ - EEARH (старший байт адреса) и EEARL (младший байт адреса). Эти регистры расположены по адресам $1F ($3F) и $1E ($3E) соответственно и доступны как для записи, так и для чтения.
Регистр ввода/вывода, являющийся регистром данных EEPROM-памяти называется EEDR (EEPROM Data Register), и расположен по адресу $1D ($3D). При записи в этот регистр загружаются данные, которые должны быть помещены в EEPROM по адресу, находящемуся в регистре EEAR (регистрах EEARH и EEARL). При чтении в этом регистре находятся данные, считанные из EEPROM по адресу, находящемуся в регистре EEAR (EEARH и EEARL).
Регистр управления EECR (EEPROM Control Register) используется для управления доступом к EEPROM-памяти и расположен по адресу $1С ($3С).
Порты ввода/вывода
Как и любые другие микроконтроллеры, микроконтроллеры AVR семейства Classic имеют порты ввода/вывода. Каждый порт состоит из определенного числа выводов, через которые микроконтроллер может принимать или передавать цифровые сигналы. Конфигурирование каждой линии порта (задание направления передачи данных) может быть произведено программно в любой момент времени. Для линий, сконфигурированных как входные, также имеется возможность подключения внутреннего подтягивающего резистора сопротивлением 35... 120 кОм между входом и проводом питания VDD. Кроме того, если вывод (вход) с подключенным внутренним подтягивающим резистором подключить к общему проводу, он может служить источником тока.
Максимальная нагрузочная способность выходных буферов портов ввода/вывода при логическом «0» на выходе составляет 20 мА. Благодаря этому микроконтроллер может непосредственно управлять светодиодными индикаторами.
Обращение к портам ввода/вывода
Обращение к портам производится через регистры ввода/вывода, причем под каждый порт в адресном пространстве ввода/вывода зарезервировано по 3 адреса. По этим адресам размещаются три регистра: регистр данных порта PORTx, регистр направления данных DDRx и регистр выводов порта PINx. Разряды этих регистров имеют названия: Px7...Px0 - для регистров PORTx, DDx7...DDx0 - для регистров DDRx и PINx7...PINx0 - для регистров PINx. Действительные названия регистров (и их разрядов) получаются подстановкой названия порта вместо символа «x», соответственно для порта A регистры называются PORTA, DDRA, PINA, для порта В - PORTB, DDRB, PINB и т.д. При сбросе микроконтроллера регистры DDRx и PORTx очищаются, а все выводы портов после сброса устанавливаются в третье (высокоимпедансное) состояние.
«Регистры» PINx на самом деле регистрами не являются (их можно рассматривать как входные буферы), по этим адресам осуществляется доступ к физическим значениям сигналов на выводах порта. Соответственно, они доступны только для чтения, тогда как регистры PORTx и DDRx доступны и для чтения, и для записи.
Конфигурирование портов ввода/вывода
Направление передачи данных определяется содержимым регистра DDRx. Если разряд DDxn этого регистра установлен в «1», соответствующий n-й вывод порта является выходом. Если же разряд DDxn этого регистра сброшен в «0», соответствующий вывод порта является входом.
Управление подтягивающим резистором осуществляется с помощью регистра данных порта PORTx. Если разряд Pxn регистра PORTx установлен в «1» и соответствующий вывод порта является входом, между этим выводом и проводом питания подключается подтягивающий резистор. Чтобы отключить подтягивающий резистор, необходимо либо сбросить соответствующий разряд регистра PORTx, либо сделать вывод порта выходом.
В табл. 5.19 приведены все возможные конфигурации выводов портов ввода/вывода.
Таймеры/счётчики
Микроконтроллер AT90S8515 имеет в своем составе два таймера/счетчика общего назначения.
Первый таймер (Т0, 8-разрядный), имеющийся во всех моделях, может использоваться только для отсчета и измерения временных интервалов или как счетчик внешних событий. При переполнении счетного регистра таймера генерируется запрос на прерывание. Другой таймер (T1, 16-разрядный). Таймер может генерировать запрос на прерывание не только при переполнении счетного регистра, но и при наступлении ряда других событий. Таймер может использоваться в качестве широтноимпульсного модулятора.
Таблица. 5.19. Конфигурирование портов ввода/вывода
DDxn |
Pxn |
Функция вывода
|
Резистор |
Примечания |
0 |
0 |
вход |
отключен |
Третье состояние (Hi-Z) |
0 |
1 |
вход |
подключен |
При подключении вывода к общему проводу он является источником тока
|
1 |
0 |
выход |
отключен |
Выход установлен в «0» |
1 |
1 |
выход |
отключен |
Выход установлен в «1» |
Примечание: n = 7...0 - номер вывода (разряд порта).
Назначение выводов таймеров/счетчиков
Каждый таймер/счетчик использует один или более выводов микроконтроллера. Как правило, эти выводы - линии портов ввода/вывода общего назначения, а функции, реализуемые этими выводами при работе совместно с таймерами/счетчиками, являются их альтернативными функциями. При их использовании линии портов ввода/вывода необходимо сконфигурировать в соответствии с их функциональным назначением (вход/выход).
Выводы микроконтроллера, относящиеся к таймерам/счетчикам общего назначения, сведены в табл. 5.20. Также в этой таблице приводятся функции этих выводов.
Таблица 5.20. Выводы, используемые таймерами/счетчиками общего назначения
Название |
AT90S8515 |
Описание |
T0 |
PB0 |
Вход внешнего сигнала таймера T0 |
T1 |
PB1 |
Вход внешнего сигнала таймера T1 |
ICP |
ICP* |
Вход захвата таймера T1 |
OC1 |
- |
Выход схемы сравнения таймера T1 |
OC1A |
PD5 |
То же |
OC1B |
OC1B* |
То же |
TOSC1 |
- |
Вход для подключения резонатора |
TOSC2 |
- |
Выход для подключения резонатора |
* Выделенный вывод микроконтроллера (не линия порта ввода/вывода)
Таймер/счетчик Т0
Таймер/счетчик Т0 (8-разрядный) может использоваться для формирования временных интервалов или для подсчета числа внешних событий. В состав Т0 входят 2 регистра: регистр управления TCCR0 и счетный регистр TCNT0, а также блок управления таймером. Флаг переполнения счетного регистра таймера TOV0 находится в регистре флагов прерываний от таймеров TIFR. Разрешение и запрещение прерываний от таймера осуществляются установкой/сбросом флага TOIE0 регистра TIMSK.
Таймер/счетчик Т0 может работать в двух режимах:
1. Режим таймера. В этом режиме на вход таймера/счетчика поступают импульсы тактового сигнала микроконтроллера (непосредственно или через предделитель);
2. Режим счетчика событий. В этом режиме инкремент содержимого счетного регистра производится по активному фронту сигнала на входе Т0 микроконтроллера.
Выбор режима работы (источника тактового сигнала), а также запуск и остановка таймера/счетчика осуществляются с помощью разрядов СS02...СS00 регистра управления таймером TCCR0, расположенного по адресу $33 ($53). Соответствие между состоянием этих разрядов и режимом работы таймера/счетчика приведено в табл. 5.21. Остальные разряды регистра доступны только для чтения и содержат «0».
Таймер/счетчик Т1
Таймер/счетчик Т1 (16-разрядный) также как и таймер/счетчик Т0, может использоваться для формирования временных интервалов или для подсчета числа внешних событий. Во-вторых, таймер/счетчик Т1 может по внешнему сигналу сохранять свое текущее состояние в отдельном РВВ. В-третьих, он может выполнять определенные действия при равенстве содержимого счетного регистра заданному значению. И наконец, он может работать как широтно-импульсный модулятор. Причем генерация сигнала с ШИМ «вынесена» в отдельный режим работы таймера/счетчика, в котором недоступны остальные функции (кроме генерации прерываний).
Таблица 5.21. Выбор источника тактового сигнала для таймера/счетчика Т0
СS02 |
СS01 |
СS00 |
Источник тактового сигнала |
0 |
0 |
0 |
Таймер/счетчик остановлен |
0 |
0 |
1 |
СК (тактовый сигнал микроконтроллера) |
0 |
1 |
0 |
СК/8 |
0 |
1 |
1 |
СК/64 |
1 |
0 |
0 |
СК/256 |
1 |
0 |
1 |
СК/1024 |
1 |
1 |
0 |
Вывод Т0, инкремент счетчика производится по спадающему фронту импульсов |
1 |
1 |
1 |
Вывод Т0, инкремент счетчика производится по нарастающему фронту импульсов
|
При записи старшего байта значения в регистр TCNT1H он помещается в регистр ТЕМР. Далее, при записи младшего байта в регистр TCNT1L он объединяется с содержимым регистра ТЕМР и оба байта записываются в регистр TCNT1 одновременно. Из сказанного следует, что для выполнения полного цикла записи в 16-разрядный регистр первым должен быть загружен старший байт (регистр TCNT1H).
При чтении регистра TCNT1L (младший байт) содержимое регистра TCNT1H пересылается в регистр ТЕМР. А при последующем чтении регистра TCNT1H возвращается значение, сохраненное в регистре ТЕМР. Следовательно, для выполнения полной операции чтения 16-разрядного регистра первым должен быть прочитан младший байт (регистр TCNT1L).
Управление таймером/счетчиком Т1 осуществляется с помощью двух регистров управления TCCR1A и TCCR1B.
