Регистры общего назначения предназначены для временного хранения данных в процессе вычислений. Разрядность регистров определяет разрядность вычислений и, в конечном счете, разрядность самого микроконтроллера. Количество регистров может быть произвольным. Обычно в этих регистрах хранится информация, обрабатываемая в арифметико-логическом устройстве и полученный в нем результат вычислений. На некоторые из регистров могут быть возложены ещё какие либо дополнительные функции. В большинстве архитектур один из регистров отличается от других большими возможностями. Он обычно называется аккумулятор или рабочий регистр. В этом регистре может храниться одна из переменных, обрабатываемых в арифметико-логическом устройстве, и туда же помещается результат операции.
Например, ядро AVR имеет 32 регистра общего назначения(GPR - General purpose registers). Каждому регистру (рис. 3.1) соответствует дополнительно адрес в памяти данных, отображающий их в первых 32 ячейках пространства данных. Хотя они не используются как физические ячейки SRAM, такая организация памяти обеспечивает гибкое обращение к регистрам.
Рис.3.1. Файл регистров общего назначения ядра AVR
Все инструкции, в которых происходит обращение к регистрам, выполняются процессорным ядром AVR в течении одного тактового цикла.
Самые общие арифметические и логические инструкции между двумя регистрами или с одним регистром используют для записи результата тоже регистры этого регистрового файла.
Шесть из 32 регистров ( R26 …. R31), кроме обычной для прочих регистров функций, выполняют функцию 16-битных указателей адреса при косвенной адресации памяти данных и памяти программ . Эти три регистра косвенной адресации определяются как регистры X, Y и Z. При этом в четных регистрах хранятся младшие байты 16-битных переменных, а в нечетных- старшие (рис. 3.3).
Рис. 3.3 Регистры косвенной адресации архитектуры AVR
Регистры ввода/вывода
Регистры ввода/вывода предназначены для управления функциональными блоками микроконтроллера, энергонезависимой памятью данных и программ. В различных операциях регистры могут участвовать целиком или отдельными битами. Отдельный бит регистра обычно именуется флагом (flag). Обращение к регистрам в различных архитектурах организуется различным образом. Обычно обращение к ним осуществляется как к элементам процессорного ядра по присвоенным в архитектуре именам и адресам, в ряде случаев к ним обращаются с помощью специальных команд ввода/вывода.
Например, в микроконтроллере АТтеда163 предусмотрено 64 регистра ввода/вывода (Input/output registers). Все они размещены в пространстве ввода/вывода процессорного ядра по адресам от $00 по $3F. Для обращения к регистрам можно использовать специальные инструкции (IN) и вывода (OUT). При этом в инструкции необходимо указывать адрес регистра. Одновременно регистры ввода/вывода представлены также в адресном пространстве памяти данных (рис. 2.2) и к ним можно адресоваться как к обычным ячейкам SRAM с адресами от $20 до $5F. Адрес SRAM получается простым добавлением $20 к непосредственному адресу регистра. В дальнейшем, при описании регистров, адрес SRAM приводится в круглых скобках после непосредственного адреса регистра ввода/вывода. Регистры побитно адресуются специальными командами работы с битами: установки бита в регистре и очистки бита в регистре. Состояние каждого отдельного бита этих регистров может быть проверено командами переходов. Каждый регистр микроконтроллера имеет своё оригинальное имя. Все регистры микроконтроллера ATmega163 представлены в следующей таблице.
Таблица 3.1.
Регистры ввода/вывода микроконтроллера АТтеда163
I/O адрес (SRAM адрес) | Имя | Функция регистра |
$3F ($5F) | SREG | Status Register |
$3E ($5E) | SPH | Stack Pointer High |
$3D ($5D) | SPL | Stack Pointer Low |
$3B ($5B) | GIMSK | General Interrupt Mask Register |
$3A ($5A) | GIFR | General Interrupt Flag Register |
$39 ($59) | TIMSK | Timer/Counter Interrupt Mask Register |
$38 ($58) | TIFR | Timer/Counter Interrupt Flag Register |
$37 ($57) | SPMCR | SPM Control Register |
$36 ($56) | TWCR | 2-wire Serial Interface Control Register |
$35 ($55) | MCUCR | MCU general Control Register |
$34 ($54) | MCUSR | MCU general Status Register |
$33 ($53) | TCCR0 | Timer/Counter0 Control Register |
$32 ($52) | TCNT0 | Timer/Counter0 (8-bit) |
$31 ($51) | OSCCAL | Oscillator Calibration Register |
$30 ($50) | SFIOR | Special Function I/O Register |
$2F ($4F) | TCCR1A | Timer/Counter1 Control Register A |
$2E ($4E) | TCCR1B | Timer/Counteri1Control Register B |
$2D ($4D) | TCNT1H | Timer/Counter1 High-byte |
$2C ($4C) | TCNT1L | Timer/Counter1 Low-byte |
$2B ($4B) | OCR1AH | Timer/Counter1Output Compare Register A High-byte |
$2A ($4A) | OCR1AL | Timer/Counter1 Output Compare Register A Low-byte |
$29 ($49) | OCR1BH | Timer/Counter1 Output Compare Register B High-byte |
$28 ($48) | OCR1BL | Timer/Counter1 Output Compare Register B Low-byte |
$27 ($47) | ICR1HT/C1 | Input Capture Register High-byte |
$26 ($46) | ICR1LT/C1 | Input Capture Register Low-byte |
$25 ($45) | TCCR2 | Timer/Counter2 Control Register |
$24 ($44) | TCNT2 | Timer/Counter2 (8-bit) |
$23 ($43) | OCR2 | Timer/Counter2 Output Compare Register |
$22 ($42) | ASSR | Asynchronous Mode Status Register |
$21 ($41) | WDTCR | Watchdog Timer Control Register |
$20 ($40) | UBRRHI | UART Baud Rate Register High-byte |
$1F($3F) | EEARH | EEPROM Address Register High-byte |
$1Е($ЗЕ) | EEARL | EEPROM Address Register Low-byte |
$1D($3D) | EEDR | EEPROM Data Register |
$1С($ЗС) | EECR | EEPROM Control Register |
$1В($ЗВ) | PORTA | Data Register, Port A |
$1А ($3A) | DDRA | Data Direction Register, Port A |
$19 ($39) | PINA | Input Pins, Port A |
$18 ($38) | PORTB | Data Register, Port B |
$17 ($37) | DDRB | Data Direction Register, Port B |
$16 ($36) | PINB | Input Pins, Port B |
$15 ($35) | PORTC | Data Register, Port C |
$14 ($34) | DDRC | Data Direction Register, Port C |
$13 ($33) | PINC | Input Pins, Port C |
$12 ($32) | PORTD | Data Register, Port D |
$11 ($31) | DDRD | Data Direction Register, Port D |
$10 ($30) | PIND | Input Pins, Port D |
$0F ($2F) | SPDR | SPI I/O Data Register |
$0E ($2E) | SPSR | SPI Status Register |
$0D ($2D) | SPCR | SPI Control Register |
$0C ($2C) | UDR | UART I/O Data Register |
$0B ($2B) | UCSRA | UART Control and Status Register A |
$0A ($2A) | UCSRB | UART Control and Status Register B |
$09 ($29) | UBRR | UART Baud Rate Register |
$08 ($28) | ACSR | Analog Comparator Control and Status Register |
$07 ($27) | ADMUX | ADC Multiplexer Select Register |
$06 ($26) | ADCSR | ADC Control and Status Register |
$05 ($25) | ADCH | ADC Data Register High |
Зарезервированные (не указанные в таблице) адреса при программировании микроконтроллера АТтеда163 использовать не допускается.