- Materiali richiesti:
- Cosa sono gli interrupt e dove usarli:
- Schema del circuito e spiegazione:
- Simulazione di interruzioni nel microcontrollore PIC:
- Spiegazione del codice:
- Funzionamento degli interrupt PIC16F877A:
In questo tutorial impareremo come utilizzare un interrupt esterno nel microcontrollore PIC e perché / dove ne avremo bisogno. Questa è una parte della sequenza di tutorial PIC in cui abbiamo iniziato a imparare da zero i microcontrollori PIC; quindi questo tutorial presume che tu abbia familiarità con come programmare un MCU PIC usando MPLABX e come interfacciare un LCD con PIC. In caso contrario, torna ai rispettivi link e leggili attraverso, perché salterò la maggior parte delle informazioni che erano già state trattate lì.
Materiali richiesti:
- Scheda PIC16F877A Perf
- Display LCD 16x2
- Premi il bottone
- Collegamento dei cavi
- Tagliere per il pane
- PicKit 3
Cosa sono gli interrupt e dove usarli:
Prima di entrare nel modo in cui programmare gli interrupt del microcontrollore PIC, cerchiamo di capire cos'è effettivamente un interrupt e dove avremmo bisogno di usarli. Inoltre, ci sono molti tipi di interrupt nel microcontrollore e PIC16F877A ne ha circa 15. Non confondiamoli tutti nella nostra testa per ora.
Così! cos'è un interrupt nei microcontrollori?
Come tutti sappiamo, i microcontrollori vengono utilizzati per eseguire una serie di attivazioni predefinite (programmate) che innesca le uscite necessarie in base all'ingresso. Tuttavia, mentre il tuo microcontrollore è impegnato con l'esecuzione di un pezzo di codice, potrebbe esserci una situazione di emergenza in cui un altro pezzo del tuo codice richiede attenzione immediata. Questo altro pezzo di codice che richiede attenzione immediata dovrebbe essere trattato come un interrupt.
Ad esempio: consideriamo che stai giocando al tuo gioco preferito sul tuo cellulare e il controller (presupposto) all'interno del tuo telefono è impegnato a lanciare tutta la grafica necessaria per goderti il gioco. Ma all'improvviso la tua ragazza chiama il tuo numero. Ora, la cosa peggiore che accada è che il controller del tuo cellulare trascuri la chiamata della tua ragazza dal momento che sei impegnato a giocare. Per evitare che questo incubo accada, usiamo qualcosa chiamato interrupt.
Questi interrupt saranno sempre l'elenco attivo per alcune azioni particolari che avvengono e quando si verificano eseguono un pezzo di codice e poi tornano alla normale funzione. Questa parte di codice è chiamata interrupt service routine (ISR). Un progetto pratico in cui l'interruzione è obbligatoria è "Circuito contachilometri e contachilometri digitale con microcontrollore PIC"
Nei microcontrollori ci sono due tipi principali di interruzioni. Sono interrupt esterno e interrupt interno. Gli interrupt interni si verificano all'interno del Microntroller per eseguire un'attività, ad esempio interrupt timer, interrupt ADC ecc. Questi interrupt vengono attivati dal software per completare rispettivamente l'operazione timer o operazione ADC.
L'interrupt esterno è quello che può essere attivato dall'utente. In questo programma impareremo come utilizzare un interrupt esterno utilizzando un pulsante per attivare un interrupt. Useremo un LCD per visualizzare i numeri che aumentano da 0 a 1000 e quando viene attivato un interrupt dovremmo notificarlo dall'ISR di routine del servizio di interrupt e quindi continuare a incrementare i numeri.
Schema del circuito e spiegazione:
Lo schema del circuito per l'utilizzo degli interrupt PIC16F877 è mostrato nell'immagine sopra. Devi semplicemente collegare l'LCD al PIC come abbiamo fatto nel tutorial sull'interfacciamento dell'LCD.
Ora per collegare il pin di interrupt, dovremmo guardare il datasheet per sapere quale pin del PIC viene utilizzato per l'interrupt esterno. Nel nostro caso nel PIC16F877A il 33 ° pin RBO / INT viene utilizzato per l'interrupt esterno. Non puoi usare nessun altro pin diverso da questo pin. La connessione Pin per questo schema elettrico è mostrata nella tabella seguente.
S.No: |
Codice PIN |
Nome pin |
Collegato a |
1 |
21 |
RD2 |
RS di LCD |
2 |
22 |
RD3 |
E di LCD |
3 |
27 |
RD4 |
D4 di LCD |
4 |
28 |
RD5 |
D5 di LCD |
5 |
29 |
RD6 |
D6 di LCD |
6 |
30 |
RD7 |
D7 di LCD |
7 |
33 |
RBO / INT |
Premi il bottone |
Abbiamo abilitato resistenze pull up interne sulla PORTA B, quindi possiamo collegare direttamente il pin RB0 a terra tramite un pulsante. Quindi ogni volta che questo pin diventa BASSO verrà attivato un interrupt.
I collegamenti possono essere effettuati su una breadboard come mostrato di seguito.
Se hai seguito i nostri tutorial dovresti aver familiarizzato con questa Perf Board che ho usato qui. In caso contrario, non è necessario pensarci molto, basta semplicemente seguire lo schema del circuito e le cose funzioneranno.
Simulazione di interruzioni nel microcontrollore PIC:
La simulazione per questo progetto è realizzata utilizzando Proteus.
Quando simuli il progetto dovresti vedere una sequenza di numeri che viene incrementata sul display LCD. Ciò accade all'interno del loop principale e ogni volta che si preme il pulsante il display LCD dovrebbe visualizzare che è entrato in ISR. Puoi apportare le tue modifiche nel codice e provare a testarlo qui.
Spiegazione del codice:
Il codice completo per questo progetto può essere trovato alla fine di questo tutorial. Tuttavia, il programma è suddiviso in parti importanti e spiegato di seguito per una migliore comprensione.
Come tutti i programmi, dobbiamo iniziare il codice definendo la configurazione dei pin per i pin che utilizziamo nel nostro programma. Anche qui dobbiamo definire che stiamo usando RB0 / INT come pin di interrupt esterno e non come pin di input o output. Il sotto riga di codice consente resistenza interna di pull-up su PORTB rendendo il 7 ° bit come 0.
OPTION_REG = 0b00000000;
Quindi abilitiamo gli interrupt globali / periferici e dichiariamo che stiamo usando RB0 come pin di interrupt esterno.
GIE = 1; // Abilita interrupt globale PEIE = 1; // Abilita l'interrupt periferico INTE = 1; // Abilita RB0 come pin di interrupt esterno
Una volta che il pin RB0 è definito come pin di interrupt esterno, ogni volta che si abbassa il flag di interrupt esterno INTF diventerà 1 e il codice all'interno della funzione di interrupt void verrà eseguito poiché verrà chiamata la routine di servizio interrupt (ISR).
void interrupt ISR_example () {if (INTF == 1) // Rilevato interrupt esterno {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("ISR inserito"); INTF = 0; // cancella il flag di interrupt dopo averlo terminato __delay_ms (2000); Lcd_Clear (); }}
Come puoi vedere, ho chiamato la funzione di interruzione come ISR_example. Puoi nominarlo secondo i tuoi desideri. All'interno della funzione di interrupt controlleremo se il flag INTF è alto ed eseguiremo le azioni necessarie. È molto importante cancellare il flag di interruzione una volta terminata la routine. Solo allora il programma tornerà alla funzione principale annullata. Questa cancellazione deve essere eseguita dal software utilizzando la linea
INTF = 0; // cancella il flag di interruzione dopo averlo terminato
All'interno della funzione principale, incrementiamo semplicemente un numero ogni 500 ms e lo visualizziamo sullo schermo LCD. Non abbiamo una linea specifica per controllare lo stato del pin RB0. L'interrupt rimarrà sempre attivo e ogni volta che si preme il pulsante salterà fuori dal vuoto principale ed eseguirà le linee nell'ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("Inside Main Loop"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Number:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); numero ++;
Funzionamento degli interrupt PIC16F877A:
Una volta capito come funziona l'interrupt, puoi provarlo sull'hardware e giocherellare con esso. Questo programma qui fornito è un esempio molto semplice di interruzione esterna in cui cambia semplicemente la visualizzazione dello schermo LCD quando viene rilevata un'interruzione.
Il funzionamento completo del progetto può essere trovato nel video riportato di seguito.Spero che tu abbia capito le interruzioni e dove / come usarle. Se hai dubbi puoi contattarmi tramite i forum o tramite la sezione commenti.