Таймер в микроконтроллере AVR
Добавлено: 19 фев 2012, 15:28
Работа выполняется с таймером T0 микроконтроллера ATtiny2313 (D1), используя несколько изменённую схему второго задания. По ходу работы исследуются режимы работы таймера, его регистров, выхода и прерываний. Схема для работы :
R1-10 - 1 кОм; R11 - 10 кОм.
К выводам PORTВ подключёна светодиодная шкала (VD1), на которую постоянно выводится состояние счётного регистра TCNT0 таймера (см. код программы). Крайние светодиоды шкалы показывают состояние выхода таймера OC0B (вывод PD5) и состояние вывода PD6, который является индикатором работы в прерывании. Для тактирования таймера к входу T0 (вывод PD4) подключается тактовый генератор. Возможно, индикацию выводов OC0B (PD5) и PD6 будет удобней (для наглядности) выполнять не через светодиоды шкалы, а через отдельные светодиоды.
Например, режим работы таймера Normal, прерывание по сравнению.
R1-10 - 1 кОм; R11 - 10 кОм.
К выводам PORTВ подключёна светодиодная шкала (VD1), на которую постоянно выводится состояние счётного регистра TCNT0 таймера (см. код программы). Крайние светодиоды шкалы показывают состояние выхода таймера OC0B (вывод PD5) и состояние вывода PD6, который является индикатором работы в прерывании. Для тактирования таймера к входу T0 (вывод PD4) подключается тактовый генератор. Возможно, индикацию выводов OC0B (PD5) и PD6 будет удобней (для наглядности) выполнять не через светодиоды шкалы, а через отдельные светодиоды.
Например, режим работы таймера Normal, прерывание по сравнению.
- Код: выделить все
//ATtiny2313
//f_cpu=8000000
#include <avr/io.h>
#include <avr/interrupt.h>
SIGNAL(SIG_OUTPUT_COMPARE0B)
{
TCNT0 = 0;
PORTD ^= 0b01000000; //инверсия на PD6
}
int main(void)
{
// порты ввода/вывода
PORTA = 0b11111111;
DDRA = 0b00000000;
// PD6 - выход на светодиод для индикации прерывания; D5 - выход OC0B; PD4 - вход T0
PORTD = 0b10011111;
DDRD = 0b01100000;
PORTB = 0b00000000;
DDRB = 0b11111111; // PB0-PB7 - аноды индикатора
//таймер T0
TCCR0A = 0b00010000; // Normal; состояние вывода OC0B меняется на противоположное
TCCR0B = 0b00000111; //подключение вывода T0, счёт по нарастающему фронту
TIMSK = 0b00000100; //прерывание по сравнению OCR0B
OCR0B = 8;
sei();
while (1) {
PORTB = TCNT0;
};
}