- Tarvittavat materiaalit:
- Mitä keskeytykset ovat ja missä niitä käytetään:
- Piirikaavio ja selitys:
- Keskeytysten simulointi PIC-mikrokontrollerissa:
- Koodin selitys:
- PIC16F877A-keskeytysten toiminta:
Tässä opetusohjelmassa opit käyttämään ulkoista keskeytystä PIC-mikrokontrollerissa ja miksi / missä tarvitsemme niitä. Tämä on osa PIC-opetusohjelmien sarjaa, jossa aloimme oppia PIC-mikrokontrollereita alusta alkaen; tästä syystä tässä opetusohjelmassa oletetaan, että olet perehtynyt PIC MCU: n ohjelmointiin MPLABX: n avulla ja kuinka LCD-näyttö liitetään PIC: n kanssa. Jos ei, palaa takaisin heidän linkkeihinsä ja lue ne läpi, sillä ohitan suurimman osan tiedoista, jotka siellä jo oli käsitelty.
Tarvittavat materiaalit:
- PIC16F877A Perf Board
- 16x2 LCD-näyttö
- Paina nappia
- Johtojen liittäminen
- Leipälauta
- PicKit 3
Mitä keskeytykset ovat ja missä niitä käytetään:
Ennen kuin perehdyt PIC-mikrokontrollerien ohjelmointiin, anna meidän ymmärtää, mikä keskeytys todellisuudessa on ja missä niitä tarvitsisimme käyttää. Lisäksi mikrokontrollerissa on paljon erityyppisiä keskeytyksiä, ja PIC16F877A: lla on niitä noin 15. Älkäämme sekoittako niitä kaikkia toistaiseksi päämme.
Niin! mikä on keskeytys mikrokontrollereissa?
Kuten me kaikki tiedämme, mikrokontrollereita käytetään suorittamaan joukko ennalta määriteltyjä (ohjelmoituja) aktivointeja, jotka käynnistävät tarvittavat lähdöt tulon perusteella. Mutta vaikka mikrokontrolleri on kiireinen yhden koodinpätkän suorittamisessa, voi olla hätätilanne, jossa toinen koodisi osa tarvitsee välitöntä huomiota. Tätä muuta välitöntä huomiota tarvitsevaa koodia on pidettävä keskeytyksenä.
Esimerkiksi: Katsotaanpa, että pelaat suosikkipeliäsi matkapuhelimellasi ja puhelimesi ohjain (oletus) on kiireinen heittämällä kaikki grafiikat, joita tarvitset pelin nauttimiseen. Mutta yhtäkkiä tyttöystäväsi soittaa numerollesi. Pahin asia on nyt, kun matkapuhelimesi ohjain jättää tyttöystäväsi soittamatta, koska olet kiireinen pelaamassa peliä. Estämään tämän painajaisen tapahtumisen käytämme jotain keskeytyksiä.
Nämä keskeytykset ovat aina aktiivisia luetteloita tiettyjen toimintojen tapahtuessa, ja kun ne tapahtuvat, ne suorittavat koodin ja palaavat sitten normaaliin toimintoon. Tätä koodinpätkää kutsutaan keskeytyspalvelurutiiniksi (ISR). Yksi käytännön projekti, jossa keskeytys on pakollista, on ”Digitaalinen nopeusmittari ja matkamittaripiiri PIC-mikrokontrolleria käyttäen”
Mikrokontrollereissa on kaksi keskeistä keskeytystyyppiä. Ne ovat ulkoisia ja sisäisiä keskeytyksiä. Sisäiset keskeytykset tapahtuvat mikrokontrollerin sisällä tehtävän suorittamiseksi, esimerkiksi ajastinkeskeytykset, ADC-keskeytykset jne. Ohjelmisto laukaisee nämä keskeytykset suorittamaan ajastintoiminnon tai vastaavasti ADC-toiminnon.
Ulkoinen keskeytys on se, jonka käyttäjä voi laukaista. Tässä ohjelmassa opitaan, kuinka ulkoista keskeytystä käytetään painikkeella keskeytyksen käynnistämiseksi. Käytämme nestekidenäyttöä 0-1000: n nousevien numeroiden näyttämiseen, ja kun keskeytys laukaistaan, meidän on ilmoitettava siitä keskeytyspalvelun rutiinin ISR: stä ja jatkettava sitten numeroiden kasvattamista.
Piirikaavio ja selitys:
Piirikaavion käyttäen PIC16F877 katkaisevat on esitetty kuvassa. Sinun tarvitsee vain liittää LCD-näyttö PIC: ään, kuten teimme LCD-opetusohjelmassa.
Nyt yhdistääksesi keskeytysnastan, meidän pitäisi tarkastella datalehteä tietääksesi , mitä PIC-nastaa käytetään ulkoiseen keskeytykseen. Tässä tapauksessa i n PIC16F877A 33 rd tappi RBO / INT käytetään ulkoinen keskeytys. Et voi käyttää muita nastoja kuin tämä tappi. Tämän kytkentäkaavion nastaliitin on esitetty alla olevassa taulukossa.
S. ei: |
Pin koodi |
PIN-nimi |
Yhdistetty |
1 |
21 |
RD2 |
LCD: n RS |
2 |
22 |
RD3 |
LCD-näytön E-osa |
3 |
27 |
RD4 |
LCD-näytön D4 |
4 |
28 |
RD5 |
LCD-näytön D5 |
5 |
29 |
RD6 |
LCD-näytön D6 |
6 |
30 |
RD7 |
LCD-näytön D7 |
7 |
33 |
RBO / INT |
Paina nappia |
Olemme ottaneet käyttöön sisäiset vetovastukset PORT B: ssä, joten voimme liittää RB0-nastan suoraan maahan maadoituspainikkeella. Joten aina kun tämä tappi saa LOW-arvon, laukaistaan keskeytys.
Liitännät voidaan tehdä leipälevylle alla olevan kuvan mukaisesti.
Jos olet seurannut opetusohjelmiamme, sinun olisi pitänyt tutustua tähän Perf Boardiin, jota olen käyttänyt täällä. Jos ei, sinun ei tarvitse ajatella paljoa siitä vain noudattamalla kytkentäkaaviota ja saat asiat toimimaan.
Keskeytysten simulointi PIC-mikrokontrollerissa:
Tämän projektin simulaatio tehdään Proteus-sovelluksella.
Kun simuloit projektia, sinun pitäisi nähdä numerosarja kasvavan nestekidenäytössä. Tämä tapahtuu pääpiirin sisällä, ja aina kun painat painiketta, nestekidenäytön tulisi näyttää, että se on tullut ISR: ään. Voit tehdä muutokset koodiin ja kokeilla sitä täällä.
Koodin selitys:
Tämän projektin täydellinen koodi löytyy tämän opetusohjelman lopusta. Ohjelma on kuitenkin jaettu tärkeisiin paloihin ja selitetty alla ymmärtämisen parantamiseksi.
Kuten kaikki ohjelmat, meidänkin on aloitettava koodi määrittelemällä nastakokoonpano niille nastoille, joita käytämme ohjelmassa. Myös tässä on määriteltävä, että käytämme RB0 / INT: tä ulkoisena keskeytystapina eikä tulo- tai lähtötapina. Alla oleva koodirivi mahdollistaa sisäisen vetovastuksen portissaB tekemällä seitsemännen bitin arvoksi 0.
OPTION_REG = 0b00000000;
Sitten otamme globaalit / perifeeriset keskeytykset käyttöön ja ilmoitamme, että käytämme RB0: ta ulkoisena keskeytystapina.
GIE = 1; // Ota globaali keskeytys käyttöön PEIE = 1; // Ota perifeerinen keskeytys INTE = 1; // Ota RB0 käyttöön ulkoisena keskeytystapina
Kun RB0-nasta on määritelty ulkoiseksi keskeytystapiksi, joka kerta, kun se laskee, ulkoisen keskeytyksen lipusta INTF tulee 1 ja tyhjän keskeytystoiminnon sisällä oleva koodi suoritetaan, koska keskeytyspalvelurutiini (ISR) kutsutaan.
void keskeytä ISR_example () {if (INTF == 1) // Ulkoinen keskeytys havaittu {Lcd_Clear (); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Syötetty ISR"); INTF = 0; // tyhjennä keskeytyslippu, kun olet tehnyt sen __delay_ms (2000); Lcd_Clear (); }}
Kuten näette, olen nimittänyt keskeytysfunktion ISR_esimerkiksi. Voit nimetä sen toiveesi mukaan. Keskeytystoiminnon sisällä tarkistamme, onko INTF-lippu korkea, ja suoritamme tarvittavat toimet. On erittäin tärkeää tyhjentää keskeytyslippu, kun olet suorittanut rutiinin. Vasta sitten ohjelma palaa tyhjään päätoimintoon. Tämä selvitys on suoritettava ohjelmalla, joka käyttää linjaa
INTF = 0; // tyhjennä keskeytyslippu, kun olet tehnyt sen
Päätoiminnon sisällä lisäämme vain 500 ms: n lukua ja näytämme sen LCD-näytöllä. Meillä ei ole mitään erityistä linjaa RB0-nastan tilan tarkistamiseksi. Keskeytys pysyy aina aktiivisena ja aina kun painiketta painetaan, se hyppää tyhjästä pääkohdasta ja suorittaa ISR: n linjat.
Lcd_Set_Cursor (2,1); Lcd_Print_String ("pääpiirin sisällä"); Lcd_Set_Cursor (1,1); Lcd_Print_String ("Luku:"); Lcd_Print_Char (ch1 + '0'); Lcd_Print_Char (ch2 + '0'); Lcd_Print_Char (ch3 + '0'); Lcd_Print_Char (ch4 + '0'); __viive_ms (500); numero ++;
PIC16F877A-keskeytysten toiminta:
Kun olet ymmärtänyt keskeytyksen toiminnan, voit kokeilla sitä laitteistossa ja viipyä sen ympärillä. Tämä tässä annettu ohjelma on hyvin yksinkertainen esimerkki ulkoisesta keskeytyksestä, jossa se vain muuttaa nestekidenäytön näyttöä, kun keskeytys havaitaan.
Projektin täydellinen työskentely löytyy alla olevasta videosta. Jos sinulla on epäilyksiä, voit tavoittaa minut foorumeiden tai kommenttiosion kautta.