 IBAH (14.09.2015 09:10, просмотров: 651) ответил Олдфаг на Кажется, теперь инкремент таймера спрятался так, что программа его никогда не найдет?
 IBAH (14.09.2015 09:10, просмотров: 651) ответил Олдфаг на Кажется, теперь инкремент таймера спрятался так, что программа его никогда не найдет?
О!Понедельник... О! Утро... О! Непереносимая тяжесть бытия...  
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();
}