Citat:
Bope: Uredjaj koji pokusavam da napravim na svom izlazu (nazovimo ga "ekran") prikazuje nekoliko razlicitih animacija koje se smenjuju. Glavna while petlja poziva jednu po jednu animaciju, svaka ima neku svoju petlju koja se ponavlja X puta. Razmisljao sam da pritiskom na dugme omogucim da se istog momenta prekine postojeca animacija i zapocne sledeca, zato mi ne bi odgovaralo da na mnogo mesta u kodu dodajem proveru stanja tastera, vec da pomocu interapta "ocistim" "ekran" i zapocnem sledecu animaciju.
pravilno razmisljanje. Interapt jeste ono sto ti treba. E sad, ako imas vise od 3 tastera koja hoces da obradis dok "masina nesto radi" stavis jedan veliki OR ili veliki AND zavisno od toga da li su ti dugmici dignuti na Vdd sa pull up-om ili povuceni na Vss sa pull down-om.
Na primer ako su ti dugmici pull up a na prekidac ih spajas sa Vss (dakle na ulazu u mcu ti je logicki 1 kada taster nije pritisnut i logicka 0 kada je taster pritisnut) onda ti treba veliki AND. Tu ti recimo posao zavrsava odlicno 74HC30. To je NAND kolo sa 8 ulaza. Vezes ga kao na semi na slici i sta je fora, sa svojih 8 tastera vodis signal na 8 pinova a izlaz sa NAND kola vozis na INTERRUPT pin. Dok su svi tasteri otpusteni interrupt pin je nula ali cim stisnes neki taster interrupt ce da ode na keca. To ce da prekine tvoj program i zovne tvoju interrapt rutinu. Onda u iterrupt rutini proveris stanje na pinovima 1-8 da vidis koji taster je izazvao interrupt (koji taster je pritisnut) tako sto proveris stanje registara koji cuvaju vrednosti ulaznih pinova. Naravno ako neces 8 tastera ili iskoristi NAND sa manje ulaza (ima ih sa 2, 3, 4 i 8 ako se dobro secam), ili samo neiskoristene ulaze vezi direkt na Vdd.
Citat:
Bope:
Ovo mi je sve taaako konfuzno, ja sam se do sada bavio C# programiranjem tako da....pfff
nije ni cudo, C# i ostale .not tehnologije su napravljene da bi te odvojile od masine te da bi pisao neke bloated virtualne gluposti ... ovde se razmislja na nivou gde je koji bit setovan a ne na nivou "to ce garbage colector pocistit, bas me briga kad i kako" :)
Citat:
Bope:
Recimo, nasao sam ovaj kod za set-up interapta.
GICR |= _BV(INT0);
MCUCR |= (1<<ISC00);
sei();
Znam cemu sluzi "sei", znam sta je interapt, ali do dajvola, cime se pune GICR i MCUCR registri i zasto? :D Sta je ono "_BV"? I ako je vec pomocu tog "_BV" odredjeno koji pin ce da izaziva spoljni interapt, sta jos onda ima da se upise u "MCUCR" registar?
Samo lagano :D
_BV je MAKRO. Znaci Bit Value. i to je u stvari:
Code:
#define _BV(bit) (1 << (bit))
Sta je fora AVR nema bit_set i bit_clear instrukcije te se odredjeni bit setuje tako sto se procita sadrzaj registra/mem lokacije pa vrati nazad, dakle ceo bajt.
Kada uradis GICR |= _BV(INT0);
desava se sledece
INT0 je "pozicija bita koji definise da li je INT0 upaljen ili ne u registru GICR" (u ovom slucaju 6)
_BV(INT0) kreira byte vrednost u kojoj je taj bit setovan (u ovom slucaju 0b01000000 )
GICR se procita u memorisku lokaciju
oruje se sa malopre napravljenim bajtom koji ima setovan INT0 bit (dakle upalimo taj bit)
i snimi se rezultat nazad u GICR registar.
Cime se puni GICR .. za atmega32 ti pise na 44 strani i 67 strani :D tacnije GICR je na 47moj. GICR ima 5 bitnih bitova (3 se ne koriste)
IVSEL (bit na poziciji 1) definise gde se nalaze interapt vektori (bitno ako koristis bootloader)
IVCE (bit na poziciji 0) ti definise da li mozes ili ne da pomeris gde se nalaze interapt vektori
cemu sluzi MCUCR, pogledaj data sheet, strana 66
bit 0 i bit 1 definisu kada ce INT0 da generise interapt, da li na "level low" (00), bilo koju ivicu (01), padajucu ivicu (10) ili rastucu ivicu (11)
bit 2 i 3 radi isto to samo za INT1
bitovi 4,5,6,7 su vezani za stvari koje nemaju veze sa interaptima
onda imas MCUCSR (strana 67) gde bit6 definise da li se INT2 okida na rastucu ili opadajucu ivicu, ali tu sada imas dodatne opcije posto INT2 nije "klasican interapt"
pa onda imas GIFR (strana 68) gde ti je flag koji interapt se desio (koji proveravas i cistis u interrupt rutini)
Dakle pomocu _BV(n) samo od generises bajt sa setovanim n-tim bitom. Ako hoces da setujes n-ti bit u nekoj "varijabli/registru"
x |= _BV(n);
Ako hoces da clearujes (upises nulu) u n-ti bit u nekoj varijabli onda:
x &= !_BV(n);
(nadam se da znas da x |= y; znac x = x | y; odnosno x &= y; znaci x = x & y;)
Aj sad probaj da okacis na INT0 da ti pozove tvoj interapt onda kada ti se stisne neki od tastera (preko onog NAND kola) i da saznas koji je :D