Interrupt
INTERRUPT
SORGENTE
#4
Convertitore ADC
#3
TIMER
#2
Porte B e C
#1
Porta A
#0
NMI
Gli ST dispongono di diverse sorgenti di interrupt.
La sorgente #0 (pin NMI) è non mascherabile ed ha la priorità più alta.
La sorgente #4 (ADC) ha la priorità più bassa.

L'interrupt NMI non è mascherabile via software (è sempre abilitato) e può interrompere in qualsiasi momento sia il programma principale che qualsiasi altro gestore di interrupt.

Gli altri 4 interrupt sono mascherabili e non possono interrompersi a vicenda, se avviene più di una richiesta di interrupt le richieste rimangono pendenti e vengono servite appena possibile in accordo con l'ordine di priorità.

L'NMI è sensibile al fronte di discesa (falling edge), se avviene un altro fronte di discesa mentre è in esecuzione il gestore dell'NMI l'evento viene perso.

Gli interrupt mascherabili, oltre che essere abilitati sulle singole periferiche (ADC, porte di I/O, timer) richiedono un'abilitazione globale gerarchicamente superiore tramite l' Interrupt Option Register:

IOR

GEN è il bit di abilitazione/disabilitazione globale degli interrupt mascherabili, se è a 1 gli interrupt sono abilitati, se è a 0 sono disabilitati (anche se sono abilitati sulle singole periferiche).

LES stabilisce quale deve essere l'evento da considerare come interrupt per la porta A (#1). Se è 0 i pin della porta A abilitati a generare interrupt sono sensibili ai fronti di discesa (falling edge). Se è 1 invece sono "level sensitive", l'interrupt viene cioè generato dalla presenza di un livello 0.

ESB stabilisce quale deve essere l'evento da considerare come interrupt per le porte B e C (#2). Se è 0 i pin abilitati a generare interrupt sono sensibili ai fronti di discesa (falling edge). Se è 1 invece sono sensibili ai fronti di salita (rising edge).

Per poter gestire gli interrupt è necessario definire i vettori di interrupt negli ultimi 16 bytes della EPROM/ROM (come specificato nella pagina delle mappe di memoria). Una possibile definizione completa dei vettori è la seguente:

;------------------------------------------------------------
; GESTORI DI INTERRUPT
;------------------------------------------------------------
NMI_INT:    ...istruzioni gestore int.NMI...
            RETI
A_INT:      ...istruzioni gestore int.porta A...
            RETI
BC_INT:     ...istruzioni gestore int.porte B e C...
            RETI
TIM_INT:    ...istruzioni gestore int.timer...
            RETI
ADC_INT:    ...istruzioni gestore int.ADC...
            RETI
;------------------------------------------------------------
; VETTORI DI INTERRUPT
;------------------------------------------------------------
            .ORG    0FF0H
            JP ADC_INT         ; INTERRUPT ADC CONVERTER (#4)
            JP TIM_INT         ; INTERRUPT TIMER (#3)
            JP BC_INT          ; INPERRUPT PORTE B E C (#2)
            JP A_INT           ; INTERRUPT PORTA A (#1)
            NOP                ; 4 bytes riservati
            NOP
            NOP
            NOP
            JP NMI_INT         ; NMI (#0)
            JP START           ; INTERRUPT DI RESET
            .END
;------------------------------------------------------------

Se un interrupt non è usato al posto di JP xyz si può mettere la coppia di istruzioni NOP e RETI, per esempio se si vuole usare solo l'interrupt del timer i vettori precedenti possono essere anche scritti nel seguente modo:

            .ORG    0FF2H 
            JP TIM_INT         ; INTERRUPT TIMER (#3) 
            NOP 
            RETI 
            NOP 
            RETI 
            NOP 
            NOP 
            NOP 
            NOP 
            NOP 
            RETI 
            JP START           ; INTERRUPT DI RESET 
            .END 


Pagina realizzata da Claudio Fin  -  Ultimo aggiornamento 5-11-1999