/*******************************************
Program :
Compiler : CVAVR
Chip type : ATmega8
System Clock : 8 MHz
*******************************************/
#include <mega8.h>
/* обработчик прерывания по внешнему сигналу на INT0 */
interrupt [EXT_INT0] void ext_int0_isr(void)
{
TCCR2 = 0b00000000; /* остановка таймера/счетчика 2 */
TCNT1 = 0; /* обнуление счетного регистра таймера/счетчика 1 */
TCCR1B = 0b00000101; /* запуск таймера/счетчика 1 с предделителем 1024 */
PORTB |= 0b00000001; /* установить 1 на PB0, включение светодиода */
}
/* обработчик прерывания по переполнению таймера/счетчика 1 */
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
TCNT2 = 0; /* обнуление счетного регистра таймера/счетчика 2 */
OCR2 = 15; /* запись начального значения в регистр сравнения таймера/счетчика 2 */
TCCR2 = 0b00000111; /* запуск таймера/счетчика 2 с предделителем 1024 */
TCCR1B = 0b00000000; /* остановка таймера/счетчика 1 */
}
/* обработчик прерывания по переполнению таймера/счетчика 2 */
interrupt [TIM2_OVF] void timer2_ovf_isr(void)
{
PORTB &= 0b11111110; /* установить 0 на PB0, выключение светодиода */
OCR2 += 2; /* увеличение значения регистра сравнения таймера/счетчика 2 */
if( OCR2 > 240 ) /* если значение регистра сравнения таймера/счетчика 2 больше
240, то ... */
{
TCCR2 = 0b00000000; /* остановка таймера/счетчика 2 */
}
}
/* обработчик прерывания по совпадению таймера/счетчика 2 */
interrupt [TIM2_COMP] void timer2_comp_isr(void)
{
PORTB |= 0b00000001; /* установить 1 на PB0, включение светодиода */
}
void main(void)
{
/* инициализация порта B */
DDRB = 0b00000001; /* PB0 светодиод */
PORTB = 0b00000000;
/* инициализация порта C */
DDRC = 0b00000000;
PORTC = 0b00000000;
/* инициализация порта D */
DDRD = 0b00000000; /* PD2 кнопка */
PORTD = 0b00000100;
/* инициализация таймера/счетчика 1 */
/* регистр управления таймером/счетчиком 1 А */
/* биты: COM1A1 COM1A0 COM1B1 COM1B0 FOC1A FOC1B WGM11 WGM10 */
TCCR1A = 0b00000000;
/* регистр управления таймером/счетчиком 1 В */
/* биты: ICNC1 ICES1 - WGM13 WGM12 CS12 CS11 CS10 */
TCCR1B = 0b00000000;
TCNT1 = 0; /* обнуление счетного регистра таймера/счетчика 1 */
/* инициализация таймера/счетчика 2 */
/* регистр асинхронного режима таймера/счетчика 2 */
/* биты: - - - - AS2 TCN2UB OCR2UB TCR2UB */
ASSR = 0b00000000;
/* регистр управления таймером/счетчиком 2 */
/* биты: FOC2 WGM20 COM21 COM20 WGM21 CS22 CS21 CS20 */
TCCR2 = 0b00000000;
TCNT2 = 0; /* обнуление счетного регистра таймера/счетчика 2 */
OCR2 = 15; /* запись начального значения в регистр сравнения таймера/счетчика 2 */
/* инициализация прерываний таймеров/счетчиков */
/* биты: OCIE2 TOIE2 TICIE1 OCIE1A OCIE1B TOIE1 - TOIE0 */
TIMSK = 0b11000100; /* разрешены прерывания по переполнению таймера/счетчика
1, по переполнению таймера/счетчика 2 и по совпадению таймера/счетчика 2 */
/* инициализация прерываний по внешнему сигналу */
/* биты: SE SM2 SM1 SM0 ISC11 ISC10 ISC01 ISC00 */
MCUCR = 0b00000001; /* флаг прерывания выставляется при изменении логического
уровня на INT0 */
/* биты: INT1 INT0 - - - - IVSEL IVCE */
GICR = 0b01000000; /* разрешение прерывания INT0 */
/* биты: INTF1 INTF0 - - - - - - */
GIFR = 0b01000000; /* сброс флага INT0 */
/* общее разрешение прерываний */
#asm("sei"
while (1)
{
}
} (Отредактировано автором: 15 Января, 2011 - 20:05:00) |