Preruseni INT0 u PIC18
Lukas Grepl
L.Grepl@sh.cvut.cz
Pátek Srpen 24 10:11:07 CEST 2007
> A proc se nastavuje INTOIF? Proc je to normalni?
No protoze se ten flag (a to plati obecne pro vsechny interrupt flagy)
nastavuje vzdy, kdyz dojde k prislusne udalosti - v tomto pripade zmene
napeti na pinu nebo u jineho k preteceni casovace ci k prijeti znaku na
seriovem portu atd.
Pokud ale neni prislusne preruseni povoleno (INT0IE atd.) nebo jsou
preruseni zakazana globalne (GIEL/GIEH resp. PEIE/GIE), tak je tim
prisluny flag vymaskovan a preruseni se nevyvola. Ale to maskovani
preruseni nema zadny vliv na hodnotu flagu jako takoveho. Ten se nastavi
pri vyvolani prislusne udalosti vzdy.
Proto je mj. vetsinou vhodne/nutne pred povolenim urciteho preruseni
nejprve vymazat jeho flag, protoze casto neni zadouci, aby se vyvolalo
ono preruseni diky udalosti, ktera nastala nekdy drive - cekame na
nejakou novou.
Dale je u vetsiny preruseni mozne, coz se nekdy hodi, vyvolat preruseni
softwarove nastavenim prisluneho flagu (vyvola se samozrejme jen tehdy,
neni li maskovano).
Cely mechanizmus vyvolani preruseni je dobre patrny na obr. 8-1, str. 4
http://ww1.microchip.com/downloads/en/DeviceDoc/31008a.pdf. Ten manual
je pro PIC16, tam je to prehledejsi (a family reference manual pro PIC18
jsem nevim proc nenasel). U PIC18 je to jeste navic okoreneno rozdelenim
do dvou urovni, viz. napr. obr. 9-1, str. 94(pdf)
http://ww1.microchip.com/downloads/en/DeviceDoc/39631D.pdf.
V a v onom kousku kodu z prerusovaci rutiny by melo obecne byt:
void interrupt isr()
{
if (TMR1IF && TMR1IE) // napr. ...
{
// ...
}
if (INT0IF && INT0IE)
{
// ...
}
}
Ve specialnich pripadech, tzn. zejmena tehdy, kdyz jednotliva preruseni
nezakazujete a nepovolujete dynamicky za behu programu, tak to neni
nutne, stejne tak kdyz pouzivate jenom jedno preruseni (pak je tam ta
podminka vicemene uplne zbytecna, ale stejne ji tam ze zvyku pisu).
Lukas Grepl
Další informace o konferenci Hw-list