ВходНаше всё Теги codebook 无线电组件 Поиск Опросы Закон Четверг
21 ноября
619323 Топик полностью
IBAH (14.09.2015 08:30, просмотров: 547) ответил Олдфаг на Смешно читать что никто никого не вызывает, когда в комментариях стоит фраза "вызов экземпляра". Ну да ладно. А обнуление счётчиков t->et не требуется?
Не умением поразить тщился, а исключительно повеселить почтеннейшую публику без отладки писал вот и накосячил также поправил шоб по госту 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(); }