ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
18 апреля
619328 Топик полностью
IBAH (14.09.2015 09:10, просмотров: 470) ответил Олдфаг на Кажется, теперь инкремент таймера спрятался так, что программа его никогда не найдет?
О!Понедельник... О! Утро... О! Непереносимая тяжесть бытия...   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(); }