dvs1985 0 29 мая, 2008 Опубликовано 29 мая, 2008 · Жалоба Никак не могу придумать эту программу. Ну включил я компаратор, он выдал прерывание которое включило таймер. Не могу придумать теперь как выключить его. Алгоритм программы не могу придумать. Подскажите, плиз!!! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvs1985 0 16 июня, 2008 Опубликовано 16 июня, 2008 · Жалоба Подскажите!!!! Сделал следующее: настройка компаратора на срабатыванию по переднему фронту; когда появляется импульс срабатывает компаратор и включает прерывание, которое включает счет таймером. А вот как выключить таймер по появлению заднего фронта понять не могу... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
lepeksiy 0 16 июня, 2008 Опубликовано 16 июня, 2008 · Жалоба Включаешь прерывание по изменению компаратора (ACIS0=0, ACIS1=0). И в обработчике прерывания проверяешь выход компаратора ACO и либо включаешь, либо выключаешь таймер. if (ACSR & (1 << ACO)) { // код включения } else { // код выключения } Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvs1985 0 16 июня, 2008 Опубликовано 16 июня, 2008 · Жалоба Спасибо. А то уже замучился. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
dvs1985 0 17 июня, 2008 Опубликовано 17 июня, 2008 · Жалоба #include <avr/io.h> #include <util/delay.h> #include <avr/interrupt.h> #include <stdlib.h> //------------------------- unsigned char i,b; //------------------------- const float k = 0.1; //------------------------- //Прерывание по переполнени таймера ISR(TIMER1_OVF_vect) //Если возникает прерывание по переполнению таймера, { i++; //то увеличить значение счетчика переполнений } //------------------------- //Программа для передачи через СОМ порт void USART_Transmit (unsigned char data) { while (!(UCSRA&(1<<UDRE))); //Пока UDRE 0, делать -> UDR=data; } //------------------------- int Sec_USART (unsigned char *p ) { float sec; unsigned int valsec = *p; sec = valsec; //в sec - значение valsec sec = sec * k; char s[5]; //умножить sec на к=0,0048 и результат записать в себя dtostrf (sec, 5, 1, s); /Преобразовать значение секунд типа double в строку символов USART_Transmit (s[0]); USART_Transmit (s[1]); USART_Transmit (s[2]); USART_Transmit (s[3]); USART_Transmit (s[4]); return 0; } //------------------------- ISR (TIMER1_COMPA_vect) { b ++; //Значение счетчика Sec_USART (&b ); } //------------------------ ISR (ANA_COMP_vect) //Прерывание от компаратора if (ACSR & (1 << ACO)) { TCCR1B = TCCR1B|((1<<CS10)|(1<<CS12)); //Коэф. предделителя = 1024 } else { TCCR1B =TCCR1B & 0b11111010; } } //-------------------------- //------------------------- int main() { ACSR|= (1<<ACIE)|(1<<ACBG); //Инициализация компаратора TCCR1B =TCCR1B| (1<<WGM12); TIMSK =TIMSK| (1<<OCIE1A); OCR1A = 39062; //В регистре сравнения 39062 sei(); for(;;) { asm ("nop"); asm ("nop"); } } Почему то в симуляторе он через сом порт передает первое значение 0,1 с, а затем зависает в функции USART_Transmit. Почему так и как это исправить? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться