Итак если по вызову прерывания подпрограмма определяет, что порт д3 равен 1 то мигаем одной лампочкой, если равен 0 то мигаем другой лампочкой. Но, как видно на видео, при вращении в одну сторону всё верно, а при обратном направлении сначала мигает "нужная" лампочка а потом первая, которая не должна загораться. У кого какие идеи, где я ошибаюсь?
казалось бы, что может быть проще считывать импульсы..... вот код, прошитый в контроллер:
if (PIND.3==0){ PORTC.3=1; delay_ms(100); PORTC.3=0; delay_ms(200); #asm("cli") } /* если по вызову прерывания опредяем, что PINd.3 то выключаем прерывания.
else if (PIND.3==1) { PORTC.4=1; delay_ms(100); PORTC.4=0; }
}
void main(void) { delay_ms(500); SREG=1; PORTC=0x00; // выход на светодиоды DDRC=0xFF;
DDRD=0xC0; // вход, это ж прерывание
GICR=0x40; // включаю прерывания 0 MCUCR=0x02; // по спадающему фронту GIFR=0xC0; ACSR=0x80;
// Global enable interrupts #asm("sei") // PORTC=0x08 ; PORTD.2=1; // включаю подтяжки PORTD.3=1; PORTD.6=1; while (1) { // Place your code here if (PORTD.6==1) {PORTD.6=0; PORTD.7=1; delay_ms(500); } else if (PORTD.7==1) {PORTD.7=0; PORTD.6=1; delay_ms(500); } }; }
Зарегистрирован: 19 мар 2010, 20:11 Сообщения: 468
вообщето при возникновении прерывания прерывания запрещаются (флаг i в sreg падает) то есть команда cli не нужна в обрабодчике. ну и потом вы их уже нигде никогда не включаете но учитывая что вы и схему не от этого МК подсунули, может у вас и прошито что нибудь другое
Добавлено спустя 38 минут 35 секунд: в первой примере 2+12 = 14= 10100 - вы включаете на одном прерывании любое изменение, на втором- только лов левел. mcucr должно быть таким для включения по спаду обоих 0b1010= 0хА пишите лучше в двоичном формате константы, так нагляднее
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 5
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения