Добавил:
ivanov666
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Микропроцессорные системы. Применение микроконтроллеров семейства AVR для управления внешними устройствами
.pdf
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 и регистр
Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]
