Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Микропроцессорные системы. Применение микроконтроллеров семейства AVR для управления внешними устройствами

.pdf
Скачиваний:
1
Добавлен:
07.09.2026
Размер:
2 Мб
Скачать
☆
31
TIMSK0 &= ~(1<<OCF0A);
Прерывание по совпадению генерируется в случае, когда содер-
жимое регистра совпадения OCR0A равно значению счетного регистра TCNT0. При этом выставляется флаг прерывания по переполнению OCF0A в регистре TIFR0. Если прерывания по переполнению разреше-
ны установкой флага OCF0A в регистре TIMSK0, а также прерывания разрешены глобально (флаг I регистра SREG установлен), то происхо­дит вызов процедуры обработки прерывания с вектором номер 10, рас-
положенным по адресу 0x0028 памяти программ. С помощью установки бит WGM00 и WGM01 регистра TCCR0A можно запрограммировать несколько вариантов поведения таймера-
счетчика 0 при возникновении содержимого регистров OCR0A и со­держимого счетного регистра TCNT0. Если биты WGM01=0 и WGM00=0, то при совпадении значение счетного регистра не изменяет­ся. Если биты WGM01=1 и WGM00=0 равны нулю, то при совпадении счетный регистр TCNT0 становится равным 0. Такой режим работы таймера называется «сброс при совпадении» (clear on compare match) и позволяет ограничить счет не максимальным значением (в нашем случае 2
8
–1), а содержимым регистра OCR0A. Остальные комбинации бит WGM00 и WGM01 используются в режимах ШИМ (см. ниже). Если необходимо, чтобы таймер-счетчик 0 генерировал прерыва-
ния по совпадению счетного регистра с регистром сравнения, то следует в программе описать обработчик прерывания, например, так, как пока-
зано ниже:
ISR ( TIMER0_OCF0A_vect ) { // Обработчик прерывания по совпадению
// счетного регистра с регистром сравнения // от таймера-счетчика 0
}
Затем необходимо разрешить прерывания от таймера-счетчика 0
по совпадению счетного регистра с регистром сравнения во время ини-
циализации программы:
TIMSK0 |= (1<<OCF0A);
Запретить прерывания по совпадению счетного регистра с реги-
стром сравнения от таймера-счетчика 0 можно следующей командой:
32
TIMSK0 &= ~(1<<OCF0A);
Другой способ контролировать возникновение событий перепол-
нения счетного регистра или совпадения счетного регистра с регистром сравнения – это контроль регистра флагов прерываний TIFR0. Флаги
выставляются даже в том случае, когда прерывания запрещены. Контроль флага прерывания по переполнению осуществляется следующим образом:
if( TIFR0 & (1<<TOV0)){ // Произошло переполнение! } // Сброс флага прерывания по переполнению TIFR0 |= (1<<TOV0);
Обратите внимание, что флаги в регистре TIFR0 сбрасываются ав-
томатически, только если разрешены соответствующие прерывания. Ес­ли прерывания от таймера 0 запрещены, то флаги надо сбрасывать так,
как показано в примере, – записью единицы в соответствующий бит. Контроль флага прерывания по совпадению счетного регистра с регистром сравнения осуществляется следующим образом:
if( TIFR0 & (1<<OCF0A)){ // Совпадение TIMSK0==OCR0A } // Сброс флага прерывания по совпадению TIFR0 |= (1<<OCF0A);
Рассмотрим основные режимы работы таймера-счетчика 0.
5.1. Таймер-счетчик в режиме отсчета временных интервалов
Отсчет временных интервалов производится с помощью отсчета импульсов тактового генератора. Поскольку эти импульсы имеют постоянную частоту, то их коли­чество прямо пропорционально времени отсчета. Младшие три бита регистра TCCR0A, названные как CS02, CS01
и CS00, определяют, к какому источнику импульсов подключен счетный
вход таймера-счетчика 0. Возможные источники тактовых импульсов таймера-счетчика 0 показаны в табл. 3.
33
Таблица 3
Источники тактовых импульсов таймера-счетчика 0
Значение
CS02
CS01
CS00
Источник
0 0 0 0 Вход отключен (счетчик остановлен)
1 0 0
1 F 2 0 1
0
F/8
3 0 1
1
F/64
4 1 0
0
F/256
5 1 0
1
F/1024
6 1 1 0 Внешний сигнал T0, спад
7 1 1 1 Внешний сигнал T0, фронт
Источники импульсов могут быть внутренние, получаемые деле-
нием тактовой частоты микроконтроллера F на константу, или внеш-
ние – сигнал T0, поступающий на вывод PG4 микроконтроллера. В слу-
чае, когда все три бита – CS02, CS01 и CS00 обнулены, счетный вход
таймера-счетчика 0 отключен от источников импульсов и таймер­счетчик остановлен. Поскольку тактовая частота микроконтроллера составляет до
16МГц, то при отсчете достаточно длительных временных промежутков
неудобно пользоваться непосредственно тактовой частотой генератора. Вычислим, какой максимальный временной интервал может от­считать таймер-счетчик 0 при тактовой частоте микроконтроллера 16 МГц. Счетный регистр таймера 0 имеет размер 8 бит, и, следовательно,
полный цикл счета составляет 28 = 256 импульсов, поступающих на счетный вход. Таким образом, максимальный временной интервал, ко­торый может отсчитать таймер 0 при тактовой частоте микроконтролле-
ра 16 МГц, составляет:
8
6
6
2
16 10 с,
16 10 Гц
=
или 16 микросекунд. Если нам необходимо отсчитывать временные ин­тервалы порядка секунд или десятых долей секунды, то можно пойти двумя путями – организовать программный счетчик или воспользовать­ся тем, что имеются источники счетных импульсов с частотой меньше
тактовой. Если мы воспользуемся в качестве источника счетных импульсов
тактовой частотой, деленной на 1024, для чего биты CS02, CS01 и CS00
34
регистра TCCR0A должны быть установлены соответственно в состоя-
ние 1, 0, 1, например, так:
TCCR0A = (TCCR0A & ~ (1<<CS01) ) | (1<<CS02) | (1<<CS00);
то максимальный временной интервал, который может отсчитать таймер
0 при тактовой частоте микроконтроллера 16 МГц, составит:
8
6
6
2 1024
16384 10 с,
16 10 Гц
=
или 16 384 микросекунды, что в 1024 раза больше, чем предыдущий ва­риант. Таким образом, видно, что интервал времени длительностью бо­лее чем примерно 16 миллисекунд с помощью таймера-счетчика 0 при
тактовой частоте микроконтроллера 16 МГц аппаратно отсчитать невоз-
можно. Если необходим отсчет более длительных временных интервалов, то в процедуре обработки прерывания от таймера-счетчика организуется программный счетчик. Счетный регистр TCNT0 допускает запись, что позволяет в любой
момент изменять его значение. Такая возможность позволяет организо­вать генерацию прерывания по переполнению не только через каждые 256 импульсов, но и через любое произвольное число импульсов в диа­пазоне от 1 до 256. Это достигается тем, что в обработчике прерывания задается значение регистра TCNT0, равное TCNT = 256 – N, где N – число импульсов, которое будет отсчитано до следующего прерывания. Приведем пример, в котором прерывания по переполнению вызываются
через каждые 1000 импульсов тактовой частоты микроконтроллера. Выбираем в качестве источника счетных импульсов тактовую ча­стоту, деленную на 8:
TCCR0A = (TCCR0A & ~ ((1<<CS02) | (1<<CS00))) | (1<<CS01);
Чтобы прерывания происходили каждые 1000 импульсов тактовой
частоты микроконтроллера, необходимо, чтобы счетный регистр счетчи-
ка до прерывания отсчитывал
1000
125
8
счетных импульсов. Поэтому
обработчик прерываний по переполнению должен выглядеть так:
35
ISR ( TIMER0_OVF_vect ) { // Задаем количество импульсов до // следующего переполнения равным TCNT=131 TCNT0 = 256 – 125; // или TCNT0 =131 // продолжаем обработку прерывания // ……………………………………….. }
В общем случае, частота прерываний по переполнению опреде­лится следующим образом:
,
( 1)
ovf
F
F
С TCNT

где F
ovf
– частота вызова прерываний по переполнению; F – тактовая ча-
стота микроконтроллера; OCR0A – значение регистра сравнения; С –
константа-делитель, определяемая битами CS02, CS01 и CS00. Согласно табл. 3, константа С принимает значения 1, 8, 64, 256, 1024. TCNT – зна-
чение, которое заносится в регистр TCNT0, при входе в процедуру об-
работки прерывания, TCNT=[0…255]. Другой возможностью отсчитать произвольное количество им-
пульсов является использование регистра совпадения OCR0A и обра­ботка прерывания по совпадению. Регистр совпадения OCR0A дает возможность отсчитывать с помощью таймера любое количество им­пульсов от 1 до 255. Таким образом, с помощью данного регистра воз­можно отсчитывать интервалы времени в диапазоне, рассчитанные по
формуле:
0
,
OCR A C
T
F
где F – тактовая частота микроконтроллера; OCR0A – значение регистра
сравнения; С – константа-делитель, определяемая битами CS02, CS01 и
CS00. Согласно табл. 3, константа С принимает значения 1, 8, 64, 256,
1024. Для того чтобы таймер-счетчик 0 генерировал периодические пре­рывания с заданным периодом, необходимо:
задать значение регистра сравнения OCR0A; задать значение константы C битами CS02, CS01 и CS00 регистра
TCCR0A;
задать режим «сброса счетного регистра при совпадении», уста-
новив биты регистра TCCR0A в значения COM0A0=0 и
36
COM0A1=1. Данный режим вызывает сброс значения счетного ре­гистра TCNT0 в нулевое значение, в случае когда значения реги­стров TCNT0 и OCR0A равны. Это позволяет отсчитывать не 256,
а OCR0A импульсов;
установить обработчик прерывания по совпадению, как это было
показано выше, и разрешить прерывание по совпадению, устано-
вив бит OCF0A=1 в регистре TIMSK0.
После указанных действий, если глобальный флаг разрешения
прерываний установлен, обработчик совпадения прерывания будет вы-
зываться с заданным периодом.
5.2. Таймер-счетчик в режиме счета импульсов
Режим счета импульсов ничем принципиально не отличается от
режима отсчета временных интервалов, за исключением того, что счет­ные импульсы могут быть непериодическими и источником этих им-
пульсов может служить внешний сигнал (см. строки 6 и 7 табл. 3). Количество пришедших импульсов всегда можно прочитать из счетного регистра TCNT0. Поскольку счетчик 8-разрядный, то макси-
мальное количество импульсов, которое он может сосчитать, составляет 2
8
= 256.
5.3. Таймер-счетчик в режиме ШИМ
Широтно-импульсная модуляция (ШИМ) позволяет осуществлять
цифроаналоговое преобразование с помощью программного изменения скважности импульсов. Рассмотрим принцип действия ШИМ. Про­стейший цифроаналоговый преобразователь (ЦАП) на основе ШИМ по-
казан на рис. 16.
Рис. 16. АЦП на основе ШИМ
37
По сути, ЦАП на основе ШИМ представляет собой фильтр ниж-
них частот, подключенный к активному выходу микроконтроллера. Ана­логовое напряжение на выходе ШИМ U
вых
(t) определяется по формуле:
0
вых
()
( ) ,
tt
U t E
T

где U
вых
(t) – напряжение на выходе ШИМ в диапазоне от 0 до E; Т – пе­риод ШИМ; E – напряжение питания микроконтроллера; t0 – время за­полнения ШИМ в диапазоне от 0 до T. Принцип формирования выход­ного напряжения ШИМ показан на рис. 17. На выход микроконтроллера подается периодический сигнал, часть которого «заполнена» уровнем напряжения питания, а остальная часть – нулевым уровнем. Поскольку период сигнала постоянный, то напряжение на выходе фильтра нижних частот U
вых
(t) прямо пропорционально коэффициенту заполнения пери-
ода сигнала. Коэффициент заполнения K определяется как
0
t
K
T
и по-
казывает, какая часть периода сигнала «заполнена» уровнем напряжения
питания.
Рис. 17. Принцип формирования выходного напряжения ШИМ
Изменяя во времени коэффициент заполнения K, можно генериро­вать аналоговый сигнал произвольной формы. Параметры фильтра нижних частот (в нашем примере – сопротив-
ление резистора R и емкость конденсатора C) подбираются такими, чтобы
постоянная времени фильтра была в несколько раз больше, чем период ШИМ, т. е. выполнялось условие  >> T. Для нашего примера  = R·C. Таймер-счетчик 0 микроконтроллера ATMega169 имеет режим ра-
боты ШИМ. В данном режиме тайм-счетчик управляет состоянием вы-
38
ходной линии OC0A, которая выведена на вывод PB4 порта B. Чтобы сигнал ШИМ поступал на выходную линию, она должна быть запро-
граммирована в качестве линии вывода:
DDRB = DDRB | (1 << 4);
Для включения режима ШИМ биты WGM00 и WGM01 регистра TCCR0A должны быть установлены в состояние логической единицы. Имеется два режима работы ШИМ – прямой и инверсный. Они
отличаются инверсией «заполнения» уровнем напряжения питания. Другими словами, если в прямом режиме ШИМ в течение временного интервала t0 выход микроконтроллера имеет потенциал напряжения пи­тания E, а остальное время – нулевой потенциал, то в инверсном режиме картина прямо противоположная: в течение временного интервала t0 выход микроконтроллера имеет нулевой потенциал, а остальное время –
потенциал напряжения питания E. Для включения прямого режима ШИМ необходимо выставить би-
ты регистра TCCR0A следующим образом: COM0A0=0 и COM0A1=1.
Пример – включаем прямой ШИМ:
TCCR0A = (TCCR0A & ~(COM0A0<<1)) |(WGM01<<1) | (WGM00<<1) | (COM0A1<<1);
Для включения инверсного режима ШИМ необходимо выставить
биты регистра TCCR0A следующим образом: COM0A0=1 и
COM0A1=1. Пример – включаем инверсный ШИМ:
TCCR0A = TCCR0A |(WGM01<<1) | (WGM00<<1) | (COM0A1<<1) | (COM0A0<<1);
После того, как ШИМ включен, коэффициент заполнения импульса
задается регистром совпадения OCR0A. Таким образом, задавая значение регистра OCR0A от 0 до 255, можно получить коэффициент заполнения K
от 0 до 1 (прямой режим ШИМ) или от 1 до 0 (инверсный режим ШИМ).
Приведем пример инициализации и управления ШИМ: void main(){
// Линия ШИМ – выход DDRB = DDRB | (1 << 4);
// Входная частота таймера F - // тактовая частота микроконтроллера TCCR0A = (TCCR0A & ~ ((1<<CS02) | (1<<CS01))) | (1<<CS00);
39
// Включаем прямой ШИМ
TCCR0A = (TCCR0A & ~(COM0A0<<1)) |
(WGM01<<1) |(WGM00<<1) | (COM0A1<<1);
// Уровень сигнала на выходе – 0 OCR0A=0;
// Уровень сигнала на выходе – 0.5 * E // Половина напряжения питания (128 = 255*0.5) OCR0A=128;
// Уровень сигнала на выходе – 0.1 * E // 26 = 255 * 0.1 OCR0A=26;
// Уровень сигнала на выходе – E // Напряжение питания OCR0A=255;
//………………………………………………….
}
Рассмотрим, какие характеристики имеет ШИМ микроконтроллера
ATMega169 на базе таймера-счетчика 0. Допустим, что таймер имеет ча-
стоту счетных импульсов F = 8 МГц (такую частоту можно задать на пла-
те AVR Butterfly). Период ШИМ T
ШИМ
составит
ШИМ
N
T=
F
, где N – число
импульсов в периоде счетчика, F – частота счетных импульсов. Для
нашего примера
8
ШИМ
6
2
32 мкc.
8 10
T = =
Если постоянную времени филь-
тра ШИМ выбрать, исходя из условия >> T, = 5Т = 160 мкс, то макси-
мальная частота аналогового сигнала составит приблизительно
сигнала
1
30 кГц.
τ
F 
Заметим, что максимальная частота звуковых сигналов, воспри-
нимаемая человеком, составляет не более 20 кГц. Следовательно, ШИМ микроконтроллера AVR ATMega169 на базе таймера 0 подходит для
синтеза звуковых сигналов.
40
6. Последовательный интерфейс UART
UART представляет собой последовательный интерфейс дуплекс-
ной передачи данных. Логически, протокол передачи данных UART полностью совпадает с протоколом интерфейса RS232 [2–4]. Физически, интерфейсы UART и RS232 отличаются уровнями электрических сиг­налов. Интерфейс UART имеет линию передачи данных TxD и линию приема данных RxD. Передача и прием данных могут осуществляться одновременно, поскольку для передачи и приема используются различ-
ные линии. UART является очень распространенным интерфейсом передачи
данных между микропроцессорными устройствами, поскольку протокол передачи данных, используемый UART, используется также и другими
интерфейсами, например, такими как RS232, RS485, токовая петля. Рассмотрим передачу данных по интерфейсу UART в асинхрон­ном режиме (рис. 18). Когда передача данных не ведется – на линии выставлен уровень лог. 1. В начале передачи каждого байта всегда передается стартовый бит, всегда имеющий значение лог. 0. С учетом того, что линия до этого находилась в состоянии лог. 1, то признаком начала передачи является переход линии из состояния лог. 1 в состояние лог.0. Стартовый бит
служит для обозначения начала передачи очередного байта данных. По­сле приема стартового бита происходит прием битов данных (обычно
используются 8-битные байты). После передачи всех битов данных пе­редается один или несколько стоп-битов. Стоп-биты всегда имеют зна-
чение лог. 1 и служат для того, чтобы обеспечить наличие признака
начала передачи при приеме следующего байта данных.
Рис. 18. Временные диаграммы передачи данных по интерфейсу UART
С точки зрения программиста, UART микроконтроллера AVR
ATMega169 представляет собой несколько регистров управления – UCSRA, UCSRB, UCSRC, PORTE, DDRE, UBRR, PCMSK0 и регистр
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]