Zdravim, podle tohoto zadání se snazim napsat program v C: Napište program pro běžící světlo. Svítít bude vždy 1 LED 300ms. Po spuštění programu světlo poběží vpravo. Po každém stisku tlačítka (PD2) s směr změní v opačný. Časový interval realizujte smyčkou.
Program ale nefunguje spravne… po spusteni sviti vsechny diody…
Sice funguje, jak má, ale pro lepší přehlednost použij DDRB a PORTB.
if((PIND & 0x03) == 0)
Sice něco testuje, ale tlačítko PD2 to zcela určitě není.
To by bylo asi takhle: if(PIND & (1<<PD2))
Navíc ti je tato smyčka zcela k ničemu, protože přerušení má vždycky přednost.
Takže se vlastně žádné zpoždění nekoná.
Ve výsledku to vypadá zhruba tak, že je ISR(INT0_vect) voláno stále dokola, velmi ryvhle se přepínají LEDky a ty ti neustále svítí.
Být tebou tak zapomenu na nějaké přerušení a udělám to pořádně v mainu klasickým testováním vstupů.
První věc je zapojení, není jasné jestli tlačítko spíná na L nebo na H.
Další věc je, že jsi uplně mimo zadání. Dioda se má posouvat ve smyčce, takže ten posun zřejmně nesmíš mít v přerušení
while(1)
{
if(smer == 0xFF)
{
//beh hada vlevo
PORT = ~ posledni_bit; //PORTB = 01111111 sviti prvni dioda vlevo
if(posledni_bit == 0x80)posledni_bit = 0x01; //10000000 -->00000001 jestli bude dioda posledni tak zase zpet na 1.
else posledni_bit <<= 1; //jinak posunuj doleva
}
//smer vpravo
if(smer == 0x00)
{
//beh hada vpravo
PORT = ~ posledni_bit; //PORTB = 01111111 sviti prvni dioda vlevo
if(posledni_bit == 0x01)posledni_bit = 0x80; //00000001 -->10000000 jestli bude dioda posledni tak zase zpet na 1.
else posledni_bit >>= 1; //jinak posunuj doprava
}
_delay_ms(300);
}
a do preruseni pak das zmenu smeru
ISR(INT0_vect) //preruseni od INT0 na Portu D
{
smer = ~smer;
}
a dalsi vec, preruseni INT0 rising edge je
GIMSK=0x40;
MCUCR=0x03;
EIFR=0x40;
njn, ted jsem si vsiml, že časový intervel má být realizován smyčkou. Ono jak to tady čtu tyto domaci ukoly tak v tech zadani je vcelku zmatek.
Ono je otazka, jestli vubec muzou pouzit funkci delay a jestli to zpozdeni nemaji udelat treba funci for(;;
PD2 je číslo pinu 2 portu D, což je číslo 2. Makro _BV(PD2) vytvoří číslo (1 << 2), což znamená jednička posunutá o 2 bity doleva. Výsledkem je číslo 4, tedy binárně číslo 00000100b. Operace PIND & 00000100b maskuje hodnotu portu D tímto číslem, to znamená že v závislosti na stavu bitu 2 portu D bude výsledek 00000100b nebo 00000000b (všechny ostatní bity se vynulují). Použije-li se výsledek v podmínce, je podmínka splněna pro nenulová čísla, tedy je-li bit 2 portu D nastavený.