- Materiale necesare:
- Ce sunt întreruperile și unde să le utilizați:
- Schema și explicația circuitului:
- Simularea întreruperilor în microcontrolerul PIC:
- Explicatie cod:
- Funcționarea PIC16F877A întrerupe:
În acest tutorial vom învăța cum să folosim o întrerupere externă în microcontrolerul PIC și de ce / unde vom avea nevoie de ele. Aceasta este o parte a secvenței Tutoriale PIC în care am început să învățăm microcontrolerele PIC de la zero; prin urmare, acest tutorial presupune că sunteți familiarizat cu modul de programare a unui PIC MCU utilizând MPLABX și cum să interfațați un LCD cu PIC. Dacă nu, vă rugăm să vă întoarceți la linkurile lor respective și să le citiți mai jos, pentru că voi sări peste majoritatea informațiilor care erau deja acoperite acolo.
Materiale necesare:
- PIC16F877A Perf Board
- Afișaj LCD 16x2
- Apasa butonul
- Conectarea firelor
- Pâine
- PicKit 3
Ce sunt întreruperile și unde să le utilizați:
Înainte de a intra în modul de programare a întreruperilor microcontrolerului PIC, permiteți-ne să înțelegem ce este de fapt o întrerupere și unde ar trebui să le folosim. Mai mult, există o mulțime de tipuri de întreruperi în microcontroler și PIC16F877A are aproximativ 15 dintre ele. Să nu le confundăm pe toate în capul nostru deocamdată.
Asa de! ce este o întrerupere în microcontrolere?
După cum știm cu toții, microcontrolerele sunt utilizate pentru a efectua un set de activări predefinite (programate) care declanșează ieșirile necesare pe baza intrării. Dar, în timp ce microcontrolerul dvs. este ocupat cu executarea unei bucăți de cod, ar putea exista o situație de urgență în care altă bucată din codul dvs. are nevoie de atenție imediată. Această altă bucată de cod care necesită atenție imediată ar trebui tratată ca o întrerupere.
De exemplu: Lăsați-ne să considerăm că jucați jocul preferat de pe telefonul mobil, iar controlerul (presupunerea) din telefonul dvs. este ocupat să arunce toate elementele grafice necesare pentru a vă bucura de joc. Dar, deodată, prietena ta sună la numărul tău. Acum, cel mai rău lucru care se întâmplă este controlerul dvs. mobil pentru a neglija apelul prietenelor dvs., deoarece sunteți ocupat să jucați un joc. Pentru a preveni acest coșmar să se întâmple, folosim ceva numit întreruperi.
Aceste întreruperi vor fi întotdeauna listări active pentru a se întâmpla anumite acțiuni și atunci când apar, execută o bucată de cod și apoi revin la funcția normală. Această bucată de cod se numește rutină de întrerupere (ISR). Un proiect practic în care întreruperea este obligatorie este „Vitezometrul digital și circuitul contorului de kilometraj folosind microcontrolerul PIC”
În microcontrolere există două tipuri principale de întreruperi. Sunt întreruperi externe și întreruperi interne. Întreruperile interne apar în interiorul Microntrollerului pentru efectuarea unei sarcini, de exemplu întreruperi temporizate, întreruperi ADC etc. Aceste întreruperi sunt declanșate de software pentru a finaliza operația Timer sau respectiv operația ADC.
Întreruperea externă este cea care poate fi declanșată de utilizator. În acest program vom învăța cum să folosim o întrerupere externă utilizând un buton pentru a declanșa o întrerupere. Vom folosi un ecran LCD pentru a afișa numerele care cresc de la 0 la 1000 și atunci când se declanșează o întrerupere, ar trebui să anunțăm despre aceasta din ISR de rutină de întrerupere a serviciilor și apoi să continuăm înapoi la incrementarea numerelor.
Schema și explicația circuitului:
Schema circuitului pentru utilizarea întreruperilor PIC16F877 este dată în imaginea de mai sus. Trebuie pur și simplu să conectați ecranul LCD la PIC, așa cum am făcut în interfața tutorialului LCD.
Acum, pentru a conecta pinul de întrerupere, ar trebui să ne uităm la foaia tehnică pentru a ști care pin al PIC este utilizat pentru întreruperea externă. În cazul nostru în PIC16F877A, al 33- lea pin RBO / INT este utilizat pentru întreruperea externă. Nu puteți utiliza alt pin decât acesta. Conexiunea Pin pentru această diagramă de circuit este prezentată în tabelul de mai jos.
S. Nu: |
Numarul pin |
Nume PIN |
Conectat la |
1 |
21 |
RD2 |
RS de LCD |
2 |
22 |
RD3 |
E de LCD |
3 |
27 |
RD4 |
D4 de LCD |
4 |
28 |
RD5 |
D5 de LCD |
5 |
29 |
RD6 |
D6 de LCD |
6 |
30 |
RD7 |
D7 de LCD |
7 |
33 |
RBO / INT |
Apasa butonul |
Am activat rezistențele interne de tragere pe PORT B, prin urmare putem conecta direct pinul RB0 la masă printr-un buton Push. Deci, ori de câte ori acest pin devine LOW, se va declanșa o întrerupere.
Conexiunile pot fi făcute pe o placă de pâine așa cum se arată mai jos.
Dacă ne-ați urmărit tutorialele, ar fi trebuit să vă familiarizați cu acest Perf Board pe care l-am folosit aici. Dacă nu, nu trebuie să vă gândiți prea mult la aceasta, pur și simplu urmați schema circuitului și veți face lucrurile să funcționeze.
Simularea întreruperilor în microcontrolerul PIC:
Simularea pentru acest proiect se face folosind Proteus.
Când simulați proiectul, ar trebui să vedeți o secvență de numere care se incrementează pe afișajul LCD. Acest lucru se întâmplă în bucla principală și ori de câte ori este apăsat butonul, LCD-ul ar trebui să afișeze că a intrat în ISR. Puteți face modificările în cod și puteți încerca să îl testați aici.
Explicatie cod:
Codul complet pentru acest proiect poate fi găsit la sfârșitul acestui tutorial. Cu toate acestea, programul este împărțit în bucăți importante și explicat mai jos pentru o mai bună înțelegere.
Ca toate programele, trebuie să începem codul prin definirea configurației pinului pentru pinii pe care îi folosim în programul nostru. De asemenea, aici trebuie să definim că folosim RB0 / INT ca pin extern de întrerupere și nu ca pin de intrare sau ieșire. Linia de cod de mai jos permite rezistența de tragere internă de pe portul B, făcând cel de-al 7- lea bit 0.
OPTION_REG = 0b00000000;
Apoi activăm întreruperile globale / periferice și declarăm că folosim RB0 ca pin extern de întrerupere.
GIE = 1; // Activați Global Interrupt PEIE = 1; // Activați întreruperea periferică INTE = 1; // Activați RB0 ca pin extern de întrerupere
Odată ce pinul RB0 este definit ca un pin de întrerupere extern, de fiecare dată când devine scăzut, semnalizatorul de întrerupere extern INTF va deveni 1 și codul din funcția de întrerupere nulă va fi executat, deoarece va fi apelată rutina de întrerupere a serviciului (ISR).
void interrupt ISR_example () {if (INTF == 1) // Întrerupere externă detectată {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("ISR introdus"); INTF = 0; // ștergeți semnalizatorul de întrerupere după ce ați terminat __delay_ms (2000); Lcd_Clear (); }}
După cum puteți vedea, am numit funcția de întrerupere ca ISR_example. Îl puteți numi după dorința dvs. În interiorul funcției de întrerupere vom verifica dacă semnalizatorul INTF este ridicat și vom efectua acțiunile necesare. Este foarte important să ștergeți semnalizatorul de întrerupere după ce ați terminat rutina. Numai atunci programul va reveni la funcția principală nulă. Această compensare trebuie făcută de software folosind linia
INTF = 0; // ștergeți semnalizatorul de întrerupere după ce ați terminat
În interiorul funcției principale, incrementăm un număr pentru fiecare 500 ms și îl afișăm pe ecranul LCD. Nu avem nicio linie specifică pentru a verifica starea pinului RB0. Întreruperea va rămâne întotdeauna activă și ori de câte ori este apăsat butonul, acesta va sări din principalul gol și va executa liniile din ISR.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("În interiorul buclei principale"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Număr:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __delay_ms (500); număr ++;
Funcționarea PIC16F877A întrerupe:
După ce ați înțeles cum funcționează întreruperea, o puteți încerca pe hardware și lăsați-o în jur. Acest program prezentat aici este un exemplu foarte simplu de întrerupere externă, în care doar schimbă afișarea ecranului LCD atunci când este detectată o întrerupere.
Funcționarea completă a proiectului poate fi găsită în videoclipul prezentat mai jos. Sper că ați înțeles despre întreruperi și unde / cum să le utilizați. Dacă aveți nelămuriri, puteți să mă contactați prin forumuri sau prin secțiunea de comentarii.