Если нужно подробно, то:
Рабочий:
Код: Выделить всё
#define F_CPU 8000000UL //obyavleniye chastoty CPU mk
#include <avr/io.h> //podklucheniye biblioteki mk
#include <avr/interrupt.h> //podklucheniye biblioteki zaderjek
#include <util/delay.h> //podklucheniye zaderjek
#include <stdio.h>
volatile unsigned int static Sch=0;
ISR(TIMER1_COMPA_vect) //функция, выполняемая автоматически, при совпадении числел - счетчика и установленного значения
{
PORTC=~PORTC;
}
int main(void)
{
sei();
DDRC=0xFF;
Sch=1000; //в реале период / 2
TCCR1B|=(1<<WGM12); //бит режима работы таймера - по совпадению
TIMSK|=(1<<OCIE1A);
TCCR1A|=0; //регистр управления таймером/счетчиком
TCNT1|=0; //Регистр таймера/счетчика
OCR1A=Sch; //значение сравнения, до 16 бит
TCCR1B|=(1<<CS12); //установка делителя (=64, стр. 145)
while (1)
{
if (!(PINE &= (1<<PE4)))
{
cli();
}
if (!(PINE &= (1<<PE3)))
{
sei();
}
}
}
Не рабочий:
Код: Выделить всё
#define F_CPU 8000000UL //obyavleniye chastoty CPU mk
#include <avr/io.h> //podklucheniye biblioteki mk
#include <avr/interrupt.h> //podklucheniye biblioteki zaderjek
#include <util/delay.h> //podklucheniye zaderjek
#include <stdio.h>
volatile unsigned int static Sch=0;
volatile void ti_ini (void)
{
Sch=1000; //в реале период / 2
TCCR1B|=(1<<WGM12); //бит режима работы таймера - по совпадению
TIMSK|=(1<<OCIE1A);
TCCR1A|=0; //регистр управления таймером/счетчиком
TCNT1|=0; //Регистр таймера/счетчика
OCR1A=Sch; //значение сравнения, до 16 бит
TCCR1B|=(1<<CS12); //установка делителя (=64, стр. 145)
}
ISR(TIMER1_COMPA_vect) //функция, выполняемая автоматически, при совпадении числел - счетчика и установленного значения
{
PORTC=~PORTC;
}
int main(void)
{
sei();
DDRC=0xFF;
ti_ini(); //инициализация таймера
while (1)
{
if (!(PINE &= (1<<PE4)))
{
cli();
}
if (!(PINE &= (1<<PE3)))
{
sei();
}
}
}