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