Vediamo ora come gestire più interrupt
contemporaneamente.
Utilizzando sempre come base il source precedente INTRB.ASM proviamo a gestire anche l'interrupt sulla fine
conteggio del registro TMR0. Ovvero facciamo lampeggiare il LED 3
in corrispondenza di ogni fine conteggio di TMR0.
Il source da utilizzare è DBLINT.ASM.
Compiliamo e scarichiamo il programma DBLINT.ASM nella scheda PicTech e vediamo che oltre a LED
1 che lampeggia con la solita frequenza, c'é il LED 3 che
lampeggia contemporaneamente con una frequenza più elevata.
Premendo un tasto qualsiasi, inoltre, otteniamo la solita
accensione per tre cicli del LED 2. L'effetto finale che otteniamo è
l'esecuzione di tre compiti ad una velocità tale da sembrare in esecuzione parallela.
Analizziamo ora il source
DBLINT.ASM.
Le modifiche maggiori riguardano l'interrupt handler
all'inizio del quale viene effettuato un controllo su quale evento abbia generato
l'interrupt. Con le istruzioni:
btfsc INTCON,T0IF
goto IntT0IF
btfsc INTCON,RBIF
goto IntRBIF
viene controllato il flag T0IF e RBIF
per vedere rispettivamente se l'evento che ha scatenato l'interrupt proviene dal registro TMR0
o dalle porta RB4-RB7. Quindi vengono lanciate in esecuzione le relative
subroutine di gestione a partire dalle label IntT0IF e IntRBIF.
Prima di ridare il controllo al programma principale
vengono azzerati i flag T0IF e RBIF assicurarsi che i
successivi eventi possano scaturire nuovamente gli interrupt. |