Таймер1

Материал из Automata.

(Различия между версиями)
Перейти к: навигация, поиск
м (Полностью удалено содержимое страницы)
м (Правки Kern (обсуждение) откачены к версии Mrsnaut)
 
Строка 1: Строка 1:
 +
#include <stdint.h>
 +
#include <avr/io.h>
 +
#include <avr/interrupt.h>
 +
//обработчик прерывания от первого таймера;
 +
ISR (TIMER1_COMPA_vect)//по достижении счета числа, записанного в OCR1A;
 +
{
 +
PORTB &= 0xfe;//включаем светодиод на плате контроллера;
 +
}
 +
 +
//обработчик прерывания от первого таймера;
 +
ISR (TIMER1_COMPB_vect)//по достижении счета числа, записанного в OCR1B;
 +
{
 +
PORTB |= 0x01;//выключаем светодиод на плате контроллера;
 +
}
 +
 +
//главная функция;
 +
int main (void)
 +
{
 +
DDRB = 0xff;//порт В настраиваем на выход;
 +
PORTB = 0x01;//отправляем на выводы логический "0", кроме PB0;
 +
SREG = 0x80;//глобальное разрешение прерываний;
 +
TCCR1B = _BV(WGM12) | _BV(CS12);//настраиваем таймер в режим CTC - "сброс при совпадении",
 +
//задаем предделитель в 256;
 +
TIMSK = _BV(OCIE1A) | _BV(OCIE1B);//разрешаем прерывания от первого таймера при совпадении значения
 +
//в его счетном регистре TCNT1 со значением в регистрах OCR1A или OCR1B;
 +
OCR1A = 31250;
 +
OCR1B = 15625;
 +
//светодиод будет гореть каждые полсекунды;
 +
}

Текущая версия

#include <stdint.h>
#include <avr/io.h>
#include <avr/interrupt.h>
//обработчик прерывания от первого таймера;
ISR (TIMER1_COMPA_vect)//по достижении счета числа, записанного в OCR1A;
{
    PORTB &= 0xfe;//включаем светодиод на плате контроллера;
}
//обработчик прерывания от первого таймера;
ISR (TIMER1_COMPB_vect)//по достижении счета числа, записанного в OCR1B;
{
    PORTB |= 0x01;//выключаем светодиод на плате контроллера;
}
//главная функция;
int main (void) 
{
    DDRB   = 0xff;//порт В настраиваем на выход;
    PORTB  = 0x01;//отправляем на выводы логический "0", кроме PB0;
    SREG   = 0x80;//глобальное разрешение прерываний;
    TCCR1B = _BV(WGM12) | _BV(CS12);//настраиваем таймер в режим CTC - "сброс при совпадении",
                                    //задаем предделитель в 256;
    TIMSK  = _BV(OCIE1A) | _BV(OCIE1B);//разрешаем прерывания от первого таймера при совпадении значения
                                       //в его счетном регистре TCNT1 со значением в регистрах OCR1A или OCR1B;
    OCR1A  = 31250;
    OCR1B  = 15625;
    //светодиод будет гореть каждые полсекунды;
}
Личные инструменты
Микроконтроллеры