Interruzioni (Interrupt) 16F84 Come utilizzare il funzionamento ad interrupt nel microcontrollore 16F84 Interrupt - P IC 16F84A 1. L’interrupt rappresenta un evento esterno al microcontrollore che determina una interruzione dell’esecuzione del main() del programma. 2. Quando si verifica questa particolare condizione il programma “salta” alla cosiddetta ISR (Interrupt Service Routine) ovvero routine di servizio dell’interruzione. 3. Eseguita tutta la ISR l’esecuzione riprende dalla istruzione del main che era stata interrotta. Analogia con un fatto quotidiano Sto preparando il pane Squilla il telefono, mi fermo e vado a rispondere Riprendo la preparazione del pane dal punto in cui mi sono interrotto Parlo al telefono per il tempo necessario Riaggancio la cornetta P erché si usano gli interrupt? Accesso all’I/O in Polling • Per effettuare la lettura di un dato si acquisisce continuamente lo stato della periferica in attesa che il dato risulti disponibile: nel caso di periferiche lente (stampante) o pilotate direttamente dall'uomo (tastiera/mouse) l'attesa del dato determina inevitabilmente una grave inefficienza. E sempio del pulsante usato in ese 4 • • • • • • while(1) { while (RA2==0); while (RA2==1); i++; PORTB=i; • } //Attende il fronte di salita /Attende il fronte di discesa //Visualizzazione del valore //sui led Se premo il pulsante ogni secondo quante volte viene eseguita l’istruzione while (RA2==0); fra una “pressione” e l’altra? N.B. Supponiamo che while (RA2==0); venga eseguita in un ciclo istruzione del microcontrollore (Fclock=8MHz) Interrupt - P IC 16F84A Accesso all’I/O a Interrupt Il microcontrollore può effettuare le operazioni all’interno del main() e quando si verifica l’interrupt, ad esempio, leggere il dato che arriva dalla stampante o da un pulsante. Interrupt - P IC 16F84A void main(void){ ..... …. K++; J++; PORTA=0; …. } 1 INTERRUPT 2 void interrupt isr(void){ i++; 3 PORTB=i; } Sequenza eventi: 1. L’interruzione accade in corrispondenza dell’istruzione k++ del main. 2. Il programma salta alla isr e la esegue tutta. 3. L’esecuzione del main riprende dall’istruzione j++. S alvataggio contesto attuale 1. Per far sì che tutto funzioni in modo corretto quando il programma viene interrotto bisogna salvare le condizioni del momento (contesto attuale) e ripristinarlo quando finisce la ISR. 2. Questo modo di operare di una funzione in termini informatici è detto “rientrante” (RETI). Vettore interrupt periferiche Il vettore di interruzione è alla locazione 0004h P eriferiche che generano interrupt nel 16F84A Le sorgenti di interrupt sono 4: • External RB0/INT pin • TMR0 timer overflow • PORTB<7:4> interrupt-on-change • Data EEPROM write complete N.B. Le sorgenti sono 4 ma la ISR è una sola. Interrupt Abilitazione e Flag • La gestione software degli interrupt avviene: 1. Tramite un bit di abilitazione generale GIE che permette l’abilitazione/disabilitazione di tutte le interruzioni. 2. Mediante singoli bit di abilitazione INTE, RBIE, (TOIE, EEIE) . 3. Mediante i Flag INTF, RBIF, (TOIF, EEIF). 4. Per l’interrupt su RBO/INT c’è anche il bit INTEDG per decidere se attivarlo sul fronte di discesa o di salita. Funzionamento bit di Flag • • • Ciascuno dei 4 flag viene messo a 1 dal microcontrollore quando la sorgente corrispondente ha generato un’interruzione. Ad es. se interrupt su RB0/INT INTF=1. oppure se interrupt è causato da un cambiamento su RB7-RB4 RBIF=1 C ome viene usato il bit di Flag dell’interruzione 1. All’interno della ISR per capire quale sorgente ha generato l’interruzione. 2. Sempre all’interno della ISR per riabilitare l’interruzione, ovvero il flag deve essere riazzerato per abilitare successive interruzioni. O verflow Timer 0 • Un overflow del timer 0, cioè un passaggio • FFh 00 del registro TMR0, mette a 1 il flag T0IF. • L’interrupt può essere abilitato/disabilitato mettendo a 1 o a 0 il bit T0IE. INTE R R UP T S U R B0/INT • L’interrupt viene generato quando in ingresso alla linea RB0/INT arriva un fronte di salita o discesa. • Se il bit INTEDG è a 1 l’ingresso è sensibile al fronte di salita, viceversa con INTEDG=0 è sensibile al fronte di discesa. • L’interrupt può essere abilitato/disabilitato mettendo a 1 o a 0 il bit INTE. • Questo interrupt può “svegliare” il 16F84 da una condizione di SLEEP. C ambiamento stato R B 7-R B 4 • Un cambiamento di stato delle linee di ingresso del porto B RB7, RB6, RB5 o RB4 causa il settaggio del flag RBIF. • L’interrupt può essere abilitato/disabilitato mettendo a 1 o a 0 il bit RBIE. • N.B. Affinché la variazione sia riconosciuta l’impulso deve durare almeno 1 Tcycle. C ambiamento stato R B 7-R B 4 Nel data sheet del 16F84 viene specificato che per riazzerare l’interrupt il programmatore nella ISR deve: 1. Effettuare una scrittura o lettura del PORTB. 2. Azzerare il bit di flag RBIF. • • Questo tipo di interruzione inoltre può “svegliare” il 16F84 da una condizione di SLEEP. Si raccomanda gli studenti di leggere almeno una volta la parte del data-sheet dedicata a questo tipo di interrupt. S crittura su E E P R O M • Quando viene completato un ciclo di scrittura dei dati sulla EEPROM del 16F84 il bit di flag EEIF viene posto a 1. • L’interrupt può essere abilitato/disabilitato mettendo a 1 o a 0 il bit EEIE. Registri per la gestione interruzioni nel 16F84 Registri OPTION e INTCON Registro Option Register: RB0/INT Registro INTCON: abilitazioni Abilitazioni Registro INTCON: Flag Flag Interrupt on-change RB7-RB5 Come si dichiara la ISR Per usare una funzione come ISR: Prototipo/Dichiarazione: void interrupt nome_funzione(void); Definizione: void interrupt nome_funzione(void){ .................... } Pratico (programma funzionante da non modificare) • Indentare in modo corretto il programma • Commentare e Intestare in modo adeguato il programma • Usare il debugger: step into, step over, step out, watch variabili, stopwatch • Creazione stimulus tipo asincrono e clock
© Copyright 2024 ExpyDoc