Гарвардская RISC-архитектура в микроконтроллерах AVR. Средства ввода-вывода, хранения и обработки цифровой и аналоговой информации в микроконтроллерах
.pdfфлага I. Когда происходит переход к обработке прерывания, флаг I сбрасывает-
ся. Он может быть установлен обработчиком прерывания для разрешения вло-
женных прерываний. I устанавливается командой возврата из прерывания
IRET. Регистр PC помещается в стек перед входом в прерывание и извлекается из стека командой IRET.
|
|
|
Таблица 1 |
|
|
Таблица векторов прерываний и сброса |
|
|
|
|
|
№ |
Адрес |
Источник |
Описание |
1 |
0x00 |
RESET |
Сброса |
2 |
0x01 |
INT0 |
Запрос внешнего прерывания INT0 |
3 |
0x02 |
INT1 |
Запрос внешнего прерывания INT1 |
4 |
0x03 |
Таймер T2, COMP |
Совпадение таймера Т2 |
5 |
0x04 |
Таймер T2, OVF |
Переполнение таймера Т2 |
6 |
0x05 |
Таймер T1, CAPT |
Захват таймера Т1 |
7 |
0x06 |
Таймер T1, COMPA |
Совпадение канала A таймера Т1 |
8 |
0x07 |
Таймер T1, COMPB |
Совпадение канала B таймера Т1 |
9 |
0x08 |
Таймер T1, OVF |
Переполнение таймера Т1 |
10 |
0x09 |
Таймер T0, OVF |
Переполнение таймера Т0 |
11 |
0x0A |
SPI, STC |
Завершение передачи SPI |
12 |
0x0B |
USART, RXC |
Завершение приема USART |
13 |
0x0C |
USART, UDRE |
Регистр данных USART пуст |
14 |
0x0D |
USART, TXC |
Завершение передачи USART |
15 |
0x0E |
ADC, Conversion Complete |
Завершение преобразования ADC |
16 |
0x0F |
EEPROM |
Готовность EEPROM |
17 |
0x10 |
Аналоговый компаратор |
Событие аналогового компаратора |
18 |
0x11 |
TWI |
Завершение текущей операции TWI |
19 |
0x12 |
INT2 |
Запрос внешнего прерывания INT2 |
20 |
0x13 |
Таймер T0 |
Совпадение таймера Т0 |
21 |
0x14 |
SPM_RDY |
Готовность памяти команд для записи |
Управляет размещением таблицы векторов прерываний, а также маскиро-
ванием внешних прерываний регистр GICR (General Interrupt Control Register).
Флаги внешних прерываний содержит регистр GIFR (General Interrupt Flag Register).
21
Таймеры микроконтроллера ATmega8535
Всостав микроконтроллера ATmega8535 входят таймеры:
—8-битный таймер T0;
—16-битный таймер T1;
—8-битный таймер T2.
Всостав каждого таймера входит определенное множество регистров,
обеспечивающих его функциональность:
— счетный регистр, который считает внутренние (возможно, с делением ча-
стоты) и внешние такты (на входах Т0 и Т1 соответствующих таймеров);
—регистр сравнения, значение которого сравнивается со счетным регистром в каждом такте (у таймера T1 их два: A и B);
—регистр управления, который задает режим работы таймера и вид выходно-
го сигнала, выбирает входной тактовый сигнал (у таймера T1 их также два);
— регистр захвата (только для таймера T1), в который записывается значение счетного регистра при наступлении соответствующего события.
Кроме того, имеются два регистра, являющихся общими для всех тайме-
ров:
—регистр TIMSK (Timer/Counter Interrupt Mask Register), с помощью которого разрешаются или запрещаются прерывания таймеров;
—регистр TIFR (Timer/Counter Interrupt Flag Register), который содержит фла-
ги прерываний, устанавливающиеся при наступлении соответствующих со-
бытий.
Каждому таймеру соответствует два события, при наступлении которых может быть сгенерировано прерывание: переполнение счетного регистра и сов-
падение значений счетного регистра и регистра сравнения. У таймера T1 имеет-
ся еще одно событие, по которому может быть сгенерировано прерывание — захват.
Также к работе таймеров имеют отношение два младших бита регистра
SFIOR (Special Function IO Register):
— бит 1 — PSR2 (Prescaler Reset Timer/Counter2); 22
— бит 0 — PSR10 (Prescaler Reset Timer/Counter1 and Timer/Counter0).
Когда в бит PSR записывается единица, делитель частоты соответствую-
щего таймера сбрасывается. После завершения операции бит сбрасывается ап-
паратно.
Пример программы работы с таймером:
;осуществляется подсчет событий по входу T0 и сдвиг единички
;в порте C по прошествии определенного их числа
.include "m8535def.inc"
.equ cnt = 0x04
.org 0x00
|
rjmp RESET |
|
|
.org 0x13 |
|
|
|
|
rjmp T0_COMP |
|
|
.org 0x15 |
|
|
|
RESET: |
clr r17 |
|
|
|
ldi r18, 0x01 |
|
|
|
ser r16 |
; инициализация портов |
|
|
out DDRB, r16 |
|
|
|
out DDRC, r16 |
|
|
|
ldi r16, low(RAMEND) |
; инициализация стека |
|
|
out spl, r16 |
|
|
|
ldi r16, high(RAMEND) |
|
|
|
out sph, r16 |
|
|
|
ldi r16, cnt |
|
; инициализация таймера |
|
out OCR0, r16 |
|
|
|
ldi r16, (1<<OCIE0) |
|
|
|
out TIMSK, r16 |
|
|
|
ldi r16, 0x1E |
|
|
|
out TCCR0, r16 |
|
|
|
sei |
|
; разрешение прерываний |
main: |
rjmp main |
|
|
T0_COMP: |
in r19, SREG |
|
|
|
out SREG, r18 |
|
|
rol r17
in r18, SREG out PORTC, r17 out SREG, r19 reti
23
Последовательные интерфейсы микроконтроллера ATmega8535
Интерфейс SPI (Serial Peripheral Interface)
SPI содержит следующие регистры:
—SPDR, SPI Data Register, регистр данных SPI;
—SPCR, SPI Control Register, регистр управления SPI, содержит биты разре-
шения SPI и прерывания SPI, задает порядок передачи битов, режим работы
(Master/Slave) и некоторые другие параметры;
— SPSR, SPI Status Register, регистр состояния SPI, содержит флаг прерыва-
ния.
SPI может работать в режиме полнодуплексной синхронной передачи данных. Один из SPI является ведущим (Master), другой — ведомым (Slave)
(рис. 3).
Рис. 3. Соединение ведущего и ведомого Ведущий инициирует транзакцию, подавая сигнал низкого уровня на
вход SS# ведомого.
Данные для передачи подготавливаются в сдвиговых регистрах. Затем ведущий генерирует тактовый сигнал на линии SCK для передачи данных.
Данные от ведущего к ведомому передаются по линии MOSI (Master Out – Slave In), а от ведомого к ведущему — по линии MISO (Master In – Slave Out).
После каждой транзакции ведущий для синхронизации с ведомым переводит сигнал SS# на высокий уровень.
Ведущий SPI управляет сигналом SS# не автоматически, а программно.
Когда сигнал SS# переведен ведущим в низкий уровень, запись байта в регистр данных SPI (SPDR) приводит к началу генерации тактового сигнала и передаче
24
байта ведомому. После передачи байта генератор SPI останавливается и уста-
навливается флаг окончания передачи SPIF. Если установлен бит разрешения прерывания SPI (SPIE, SPI Interrupt Enable) в регистре SPCR, то генерируется соответствующее прерывание. Ведущий может записать в SPDR следующий байт или установить сигнал окончания передачи пакета SS#=1.
Ведомый SPI держит выход MISO в третьем состоянии, пока SS# остается на высоком уровне. Данные могут быть записаны в SPDR, но передача не будет осуществлена до тех пор, пока SS# не перейдет в низкий уровень.
Вывод SS# ведомого SPI всегда является входом, а ведущего может быть сконфигурирован как выход или как вход.
Интерфейс USART (Universal Synchronous and Asynchronous Receiver
and Transmitter)
Как следует из названия, USART может работать в двух режимах: син-
хронном и асинхронном. Он аппаратно поддерживает контроль по четности или нечетности. С ним связано три прерывания:
—передача завершена (Tx Complete);
—буферный регистр передатчика пуст (Tx Data Register Empty);
—прием завершен (Rx Complete).
Вкаждой группе передаваемых битов содержится один старт-бит, от 5 до
9 битов данных, один или два стоп-бита, а также может содержаться бит кон-
троля по четности или нечетности (рис. 4).
Рис. 4. Формат передаваемой группы битов Старт-бит всегда имеет значение логического нуля, стоп-бит — единицы.
USART содержит следующие регистры:
25
— UDR , USART Data Register, регистр данных USART, на самом деле это два буферных регистра: передачи и приема, которые имеют один адрес в про-
странстве ввода-вывода;
—три управляющих регистра: UCSRA, UCSRB, UCSRC;
—UBRRH и UBRRL (USART Baud Rate Registers).
Регистры UCSRC и UBRRH занимают один и тот же адрес в пространстве ввода-вывода. При записи выбор регистра осуществляется старшим битом
(URSEL). Если он равен единице, то записывается UCSRC, а если нулю —
UBRRH. При чтении вначале всегда читается UBRRH. Если необходимо прочи-
тать UCSRC, то сначала надо прочитать UBRRH, а затем сразу UCSRC:
USART_ReadUCSRC: ; чтение UCSRC
in r16,UBRRH in r16,UCSRC ret
USART содержит три блока: тактовый генератор, передатчик и приемник.
Передатчик и приемник включают сдвиговые и буферные регистры. Буферные регистры передатчика и приемника имеют один адрес и доступны как регистр
UDR. Приемник содержит два буферных регистра, организованных по принци-
пу FIFO. Поэтому принимаемые данные могут быть прочитаны из UDR только один раз.
Тактовый генератор поддерживает четыре режима тактирования:
—нормальный асинхронный (Normal asynchronous);
—асинхронный удвоенной скорости (Double Speed asynchronous);
—синхронный ведущий (Master synchronous);
—синхронный ведомый (Slave synchronous).
Выбор между синхронным и асинхронным режимом осуществляется с помощью бита UMSEL регистра UCSRC. Удвоенная скорость (только для асинхронного режима) устанавливается битом U2X регистра UCSRA. В син-
хронном режиме (UMSEL = 1) USART может быть ведущим (Master mode) или
26
ведомым (Slave mode). В первом случае вывод XCK является выходом, во вто-
ром — входом. Направление необходимо установить битом 0 регистра DDRB,
который соответствует выводу XCK.
Инициализация USART включает установку скорости и формата переда-
чи данных и разрешение приемника и передатчика. Прерывания во время про-
цесса инициализации должны быть запрещены. Реинициализацию нельзя про-
водить во время передачи. Для проверки завершения передачи и приема можно использовать флаги TxC и RxC регистра UCSRA.
При выводе передаваемого байта в UDR он записывается в буферный ре-
гистр передатчика, из него в сдвиговый регистр и затем передается по выводу
TxD. Если UDR записывается не в обработчике прерывания UDRE, то необхо-
димо убедиться, что буфер передатчика пуст:
USART_Transmit:
;ожидание очистки буфера передатчика sbis UCSRA,UDRE
rjmp USART_Transmit
;запись данных в буфер и их передача out UDR,r16
ret
Приемник начинает прием данных, когда обнаруживает действительный старт-бит. Последующие биты записываются в сдвиговый регистр, пока не встретится стоп-бит. После этого принятые данные из сдвигового регистра за-
писываются в буфер приемника и могут быть прочитаны из UDR. При этом устанавливается флаг завершения приема RXC. Установленный RXC говорит о том, что в буфере приемника имеются непрочитанные данные. Если разрешено соответствующее прерывание (RXCIE=1), то выполнится обработчик прерыва-
ния. Если UDR читается не в обработчике прерывания завершения приема, то это можно сделать так:
USART_Receive:
;ожидание приема данных sbis UCSRA, RXC
rjmp USART_Receive
;чтение принятых данных из буфера
27
in r16, UDR ret
Если принимаются 9-битные данные, то перед чтением UDR необходимо считать девятый бит из RXB8. Если необходимо считать биты статуса: FE,
DOR, PE — то это также необходимо делать до чтения UDR.
Интерфейс TWI (Two-wire Serial Interface)
TWI позволяет создать систему из 128 устройств посредством всего двух двунаправленных линий: тактов (SCL) и данных (SDA) (рис. 5).
Рис. 5. Соединение устройств по интерфейсу TWI
Каждое устройство имеет индивидуальный адрес. Каждый бит на линии
SDA сопровождается тактом на линии SCL (рис. 6). Тактовый сигнал на линии
SCL генерирует ведущий. Во всех режимах пониженного энергопотребления,
кроме Idle, генератор тактовых импульсов TWI выключен.
Рис. 6. Временная диаграмма TWI
Ведущий начинает транзакцию выдачей на шину START-условия и за-
канчивает выдачей STOP-условия. START- и STOP-условия представляют со-
28
бой изменение состояния линии SDA при высоком уровне на линии SCL. Меж-
ду ними на шину выдаются адресный пакет и данные (рис. 7).
Рис. 7. Транзакция TWI
Адресный пакет содержит адрес ведомого и бит READ/WRITE# и обо-
значается SLA+R или SLA+W соответственно. У адресного пакета как бы су-
ществует еще и девятый бит — бит подтверждения ACK, имеющий низкий уровень, который выдает ведомый как результат распознавания своего адреса.
Когда TWI завершает текущую операцию: выдачу START-условия, ад-
ресного пакета или пакета данных — любую, кроме выдачи STOP-условия,
устанавливается флаг TWINT. Линия SCL остается в низком уровне до тех пор,
пока не будет сброшен флаг TWINT.
Когда TWINT установлен, приложение должно проверить статус в реги-
стре TWSR, если он корректный, загрузить регистр TWDR, а затем TWCR с
установленным битом TWINT для выполнения следующей операции.
Роль ведущего не закрепляется жестко, как в SPI, установкой соответ-
ствующего бита в управляющем регистре, а определяется как раз выдачей
START-условия.
Из дополнительных устройств необходимо всего два нагрузочных рези-
стора, по одному для каждой из линий, через которые они подключаются к по-
ложительному полюсу источника питания, поскольку выходы интерфейса TWI
— это выходы с открытым стоком или коллектором. Такое соединение реали-
зует логическую функцию монтажного И, которая является существенным эле-
ментом функционирования интерфейса TWI. Линия TWI находится в состоянии низкого уровня, когда в этом состоянии хотя бы один из выходов, и в состоянии высокого уровня, когда выходы всех устройств находятся в третьем состоянии.
29
Таким образом, каждое устройство с интерфейсом TWI должно запитываться отдельно.
TWI содержит следующие регистры:
—TWBR, TWI Bit Rate Register, регистр скорости передачи данных в режиме ведущего, задает коэффициент деления частоты для генератора SCL;
—TWDR, TWI Data Register;
—TWAR, TWI (Slave) Address Register;
—TWSR, TWI Status Register;
—TWCR, TWI Control Register.
При передаче в TWDR ведущего записываются поочередно адрес ведомо-
го и данные для него. При приеме из TWDR читаются принятые данные. В ре-
гистр TWAR ведомого записывается его адрес.
Существует четыре главных режима работы TWI:
— ведущий передатчик (Master Transmitter, MT), в этом режиме выдается ад-
ресный пакет SLA+W;
— ведущий приемник (Master Receiver, MR), в этом режиме выдается адрес-
ный пакет SLA+R;
—ведомый передатчик (Slave Transmitter, ST);
—ведомый приемник (Slave Receiver, SR).
Для входа в режим ведущего в TWCR необходимо записать число с уста-
новленными битами TWINT, TWSTA и TWEN.
Для входа в режим ведомого в TWAR необходимо записать адрес ведо-
мого, а в TWCR число с установленными битами TWEA и TWEN. Когда ведо-
мый принимает SLA+W, он входит в режим SR, а когда SLA+R — в режим ST.
В режим ведомого TWI может войти и при потере арбитража в режиме ведуще-
го.
Типичный алгоритм передачи в режиме MT можно описать по шагам следующим образом:
1. Ведущий передает START-условие записью в TWCR значения с установ-
ленными битами TWINT, TWSTA и TWEN.
30
