IBAH (14.09.2015 09:10, просмотров: 516) ответил Олдфаг на Кажется, теперь инкремент таймера спрятался так, что программа его никогда не найдет?
О!Понедельник... О! Утро... О! Непереносимая тяжесть бытия...
volatile char timer_st; //системный таймер
struct ton
{
unsigned char en; //запуск таймера
unsigned char q; //выход таймера
unsigned short pt; //порог таймера
unsigned short et; //счетчик таймера
unsigned char timer_st0; //хначение системного таймера при пошлом входе
} ; //класс таймер
void timer(struct ton*); //метод таймера
main()
{
//инициализация
TCCR1A=0;
TCCR1B=(1<<WGM12)|(1<<CS10);
TCCR1C=0;
TIMSK1=1<<OCIE1A;
OCR1A=16384;
_SEI();
while(1)//главный цикл
{
//Задача номер 1, мультвибратор с периодом 2 секунды скважность 2
{
static struct ton t1,t2;
t1.pt=1000;//иницилизация таймеров
t2.pt=1000;
timer(&t1);//вызов экземпляра
timer(&t2);
t2.en=t1.q;
t1.en=!t2.q;//обратная связь
}
//Задача номер 2, генератор строба с периодом 100мС
{
static struct ton t3;
t3.pt=100;
timer(&t3);
t3.en=!t3.q;
}
}
}
//системный таймер, с периодом 1мС
#pragma vector=TIMER1_COMPA_vect
__interrupt void ton_i(void)
{
timer_st++;
return;
}
//метод таймера
void timer(struct ton* t)
{
_CLI();
if (t->en!=0)// разрешение есть
{
if(t->q == 0)// и таймер не сработал
{
t->et =(t->et)+(timer_st-(t->timer_st0));//инкремент таймера
}
if((t->et)>=(t->pt)) t->q=!0; //если таймер вывод в 1
}
else //разрешение нет -> выход в 0
{
t->q=0;
t->et=0;
}
t->timer_st0=timer_st;
_SEI();
}