Подскажите,пожалуйста,никак не могу разобраться, вывожу значение TimeImp на LCD и при первом и иногда 2-м импульсе выводятся разные значения,а с 3-го уже постоянна TimeImp, как можно сделать вывод точного значения при первом импульсе
Код:
Chip type : ATmega8 Program type : Application Clock frequency : 4,000000 MHz Memory model : Small External SRAM size : 0 Data Stack size : 256 *****************************************************/ unsigned int clock,EdgeF,STimeImp[5],TimeImp,EdgeR; char k; #include <mega8> #asm .equ __lcd_port=0x12 ;PORTD #endasm #include <lcd> #include<stdio> interrupt [TIM1_OVF] void timer1_ovf_isr(void) { TCNT1H=0xff; TCNT1L=0xce; clock++; //прерывания каждые 100 микросекунд } interrupt [TIM1_CAPT] void timer1_capt_isr(void) {
TCNT1H=0xff; TCNT1L=0xce; if (k==0){ // Place your code here EdgeR=ICR1; k=1; TCCR1B=0b00000010; //прерывания по низкому уровню }else{ EdgeF=ICR1; k=0; TimeImp=EdgeF-EdgeR; TCCR1B=0b01000010; //прерывания по высокому уровню } } void main(void) { TCCR1A=0x00; TCCR1B=0b01000010; //прерывание по Rising Pulse TCNT1H=0xff; TCNT1L=0xce; // Timer(s)/Counter(s) Interrupt(s) initialization TIMSK=0x24; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; lcd_init(16); #asm("sei") while (1) { sprintf(STimeImp,"%u",TimeImp); lcd_gotoxy(0,1); lcd_puts(STimeImp); }; }
Наверное только обрабатывая 2 события.(TimerIcp & INTi). Перестройка в прерывании не всегда хороша...
_________________ Загружая на вход компьютера "мусор", на выходе получим "мусор^32". PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Наверное только обрабатывая 2 события.(TimerIcp & INTi). Перестройка в прерывании не всегда хороша...
А вот у меня вопрос, в программе же сначала тратится какое-то время на инициализацию или нет?Эт не может как-то повлиять на определение длительности первых импульсов?
у меня вопрос, в программе же сначала тратится какое-то время на инициализацию или нет?Эт не может как-то повлиять на определение длительности первых импульсов?
На 1-й может и да.Предделитель на сколько установлен?
_________________ Загружая на вход компьютера "мусор", на выходе получим "мусор^32". PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
у меня вопрос, в программе же сначала тратится какое-то время на инициализацию или нет?Эт не может как-то повлиять на определение длительности первых импульсов?
На 1-й может и да.Предделитель на сколько установлен?
Предделитель установлен на 8. Хотя,там второй подсчет импульса ненамного от третьего отличается,но вот первый ооочень далеко.
Сложно сказать... Тут еще обин момент, у Вас может налагаются на старте прерывания от переполнения с захватом? Попробуйте "подготовить" таймер, а запуск проводить перед вечным циклом.(в тимск бит разрешения работы ставить)
PS Это реальное железо (МК, ЛСД) или имитация в программе (я про наблюдения Ваши)?
_________________ Загружая на вход компьютера "мусор", на выходе получим "мусор^32". PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Сложно сказать... Тут еще обин момент, у Вас может налагаются на старте прерывания от переполнения с захватом? Попробуйте "подготовить" таймер, а запуск проводить перед вечным циклом.(в тимск бит разрешения работы ставить) PS Это реальное железо (МК, ЛСД) или имитация в программе (я про наблюдения Ваши)?
Я в протеусе эмулирую,да прерывания от переполнения с захватом.
Вот сейчас только понял,кажется, когда пошел импульс, в первом прерывании с захватом происходит подсчет только Edge Rising,а только при втором импульсе идет подсчет EdgeR-EdgeF
Переделал я этот код на прерывания INT0 и INT1, после чего опять импульс первый не определялся, оказалось,что в протеусе частота по-дефолту была выставлена, подправил на 4MHz и заработало.
опять импульс первый не определялся, оказалось,что в протеусе частота по-дефолту была выставлена, подправил на 4MHz и заработало.
Поздравляю. Вот из-за огромного количества "дополнительных условий", я стараюсь перейти как можно быстрее к железу. Только там можно постичь истину
_________________ Загружая на вход компьютера "мусор", на выходе получим "мусор^32". PS. Не работаю с: Proteus, Multisim, EWB, Micro-Cap... не спрашивайте даже
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 8
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения