Edellisessä opetusohjelmassa opimme LED-merkkivalon vilkkumisesta PIC-mikrokontrollerilla ja rakensimme saman piirin Perf-kortille. Sitten käytimme PICkit 3: ta, ICSP: tä ja MPLAB IPE: tä ohjelman upottamiseen Perf-levylle. Nyt tässä opetusohjelmassa edistämme itseämme käyttämään enemmän nastoja PIC-mikrokontrollerissa. Käytämme 7 lähtöä (LEDiä) ja yhtä tuloa. Tässä opetusohjelmassa käytämme vanhaa Perf-levyä (esitetty alla) ja lisäämme berg-tikkuja vetämään tarvittavat nastat toiselle LED-levylle. Tämän opetusohjelman lopussa luomme vilkkuvien LEDien sarjan PIC-mikrokontrollerilla PIC16F877A ja opimme käyttämään useita tuloja ja lähtöjä, joitain perustietoja silmukan ja toimintojen kutsumisesta.
LED-kortti ei ole muuta kuin toinen perf-levy, jolle juotamme LEDit virtaa rajoittavalla vastuksella (esitetty alla). Lisäämme myös painikkeen aloittaaksesi LED-merkkivalon vilkkumisen.
Piirikaavio:
PIC-mikrokontrolleri PIC16F877A LED vilkkuva sekvenssikoodi ja toimiva selitys:
Täydellinen koodi on annettu alla (tarkista lopussa), täällä saamme sen läpi rivi riviltä. Tämä koodi alkaa palaa LED-valoja peräkkäin, kun painat painiketta. Katso sekvenssit ymmärtämällä videota opetusohjelman lopussa. Suosittelen, että vertaat videossa näkyvää lähtöä alla olevaan koodiin ja yrität ymmärtää ohjelmaa.
Katsotaanpa koodia rivi kerrallaan. Muutama ensimmäinen rivi on tarkoitettu määritysbittien määrittämiseen, jotka selitettiin edellisessä opetusohjelmassa, joten ohitan ne toistaiseksi. Paras tapa ymmärtää mitä tahansa ohjelmaa on aloittaa main ( void main () ) -toiminnosta, joten tehdään se
TRISB0 = 1; // Ohje MCU: lle, että PORTB-nasta 0 käytetään painikkeen tulona. TRISD = 0x00; // Ohjaa MCU: ta, että kaikki nastat ovat PORTD = 0x00; // Alusta kaikki nastat arvoon 0
Sanaa TRIS käytetään määrittelemään, käytetäänkö nastaa tulona / lähtöä, ja sanaa PORT käytetään nastan tekemiseen korkea / matala. Rivi TRISB0 = 1 tekee PORT B: n 0. nastan tuloksi. Tämä on meidän painike. Viivat TRISD = 0x00; PORTD = 0x00; tekee kaikki portin D nastat ulostuloksi ja määrittää näille nastoille alkuarvon LOW.
Koska sanoimme, että B0: ta käytetään tulona, yhdistämme painonapin toisen pään tapiin B0 ja toisen pään maahan. Siihen asti aina kun painamme painiketta, tappi pidetään maadoitettuna yllä olevan kytkentäkaavion mukaisesti. Mutta tämän toteuttamiseksi meidän on käytettävä ylösvetovastusta, jotta tappi pysyy korkealla, kun painiketta ei paineta. Vedettävä vastus on jotain tällaista.
Mutta PIC MCU: lla on sisäinen heikko vetovastus, joka voidaan aktivoida ohjelmistolla, mikä säästää paljon vaivaa (kun lisää painikkeita on kytkettävä).
Mikä on heikko vetovoima?
Vetovastuksia on kahden tyyppisiä, yksi on heikko vetovoima ja toinen voimakas vetovoima. Heikot vetovastukset ovat arvokkaita ja antavat siten heikon virran kulkea ja vahvat ylösvetovastukset ovat pieniarvoisia, jolloin voimakas virta virtaa. Kaikki MCU: t käyttävät enimmäkseen heikkoja vetovastuksia. Tämän aktivoimiseksi PIC MCU: ssa meidän on etsittävä OPTION_REG (optiorekisteri) -taulukkoamme alla olevan kuvan mukaisesti.
Kuten on esitetty, bitti 7 käsittelee heikkoa vetovastusta. Sen aktivoimiseksi tulisi tehdä nolla. Tämä tapahtuu valitsemalla OPTION_REG <7> = 0 . Tämä käsittelee erityisesti bittiä 7, jolloin muut bitit jätetään oletusarvoihinsa. Tämän avulla pääsemme while-silmukkaamme, jossa se tarkistaa, painetaanko näppäintä käyttämällä if (RB0 == 0). Jos ehto täyttyy, kutsumme toimintoamme parametreilla 1, 3, 7 ja 15.
sblink (1); // FUNCTION CALL 1 parametrilla 1 sblink (3); // FUNCTION CALL 3 parametrilla 3 sblink (7); // FUNCTION CALL 7 parametrilla 7 sblink (15); // FUNCTION CALL 4 parametrilla 15
Miksi käytämme toimintoja?
Toimintoja käytetään koodin rivien määrän vähentämiseen. Tämän useimmat meistä olisivat tienneet. Mutta miksi meidän on vähennettävä rivien määrää, varsinkin kun kyseessä on MCU-ohjelmointi. Syynä on rajoitetusti tilaa meidän Ohjelmamuisti. Jos emme optimoi koodia kunnolla, muistitila saattaa loppua. Tämä on kätevää, kun kirjoitamme pitkiä sivuja koodeja.
Kaikilla toiminnoilla on funktio Definition (tapauksessamme sblink (int get) ) ja funktio Call (tapauksessamme sblink (1) ). Funktion ilmoitus on valinnainen, sen välttämiseksi olen sijoittanut funktion määritelmän ennen kuin kutsun toiminnon päätoimintoihini.
Funktioparametrit ovat arvo, joka välitetään funktion kutsusta funktion määrittelyyn. Meidän tapauksessamme kokonaislukuarvot (1, 3, 7, 15) ovat parametreja, jotka välitetään funktion kutsusta ja muuttuja "get" saa parametrien arvon funktion määrittelyyn niiden käsittelemiseksi. Funktiolla voi olla useampi kuin yksi parametri.
Kun funktio on kutsuttu, funktion määrittelyn alla olevat rivit suoritetaan.
for (int i = 0; i <= 7 && RB0 == 0; i ++) {PORTD = saa << i; // LED-siirto vasemmalle jaksolle __viive_ms (50); } for (int i = 7; i> = 0 && RB0 == 0; i--) {PORTD = get << i; // LED-siirto vasemmalle jaksolle __viive_ms (50); }
Nyt tämä rivi näyttää olevan pariton: PORTD = get << i . Selitän, mitä täällä todella tapahtuu.
"<<" on vasen siirto-operaattori, joka siirtää kaikki bitit vasempaan asentoonsa. Nyt kun kutsumme sblink (int get) -funktiota parametrilla '1' sblink (1), se tekee arvon 'get' arvoksi 1, joka binäärisenä on 0b00000001. Siksi tämä rivi on kuin PORTD = 0b00000001 << i .
"I": n arvo vaihtelee 0: sta 7: een, koska olemme käyttäneet "for loop" -sisältöä (int i = 0; i <= 7 && RB0 == 0; i ++). 'I': n arvo välillä 0 - 7 muuttaa tulosta seuraavasti:
Kuten näette, olemme sytyttäneet yhden LED: n kerrallaan (vasemmalta oikealle) pitämällä loput pois päältä. Seuraava (silmukkaa varten) (int i = 7; i> = 0 && RB0 == 0; i--) , tekee myös saman, mutta tällä kertaa LED syttyy oikealta vasemmalle peräkkäin, kun aloitimme 7: stä alaspäin 0: een. Olemme käyttäneet 200 ms: n viivettä, jotta voimme visualisoida LED: n kytkemisen päälle ja pois.
Nyt kun välitämme arvon 3 sblink (int get) -funktiossa, suoritetaan funktio sblink (3) , joka tekee 'get' -arvoksi arvon 0b00000011, joten PORTD: n tulos on:
Joten tällä kertaa kaksi LEDiä syttyy milloin tahansa käyttämällä sblink (3). Vastaavasti sblink (7) ja sblink (15), kolme ja neljä lediä palavat peräkkäin. Kun tämä on valmis, saamme kaikki LED- valot palamaan käyttämällä linjaa PORTD = 0xFF . Katso alla oleva video esittelyä varten.
Toivottavasti olet ymmärtänyt koodin ja siten oppinut käyttämään funktioita 'for' ja 'while' -silmukkaa saadaksesi haluamasi lähdöt. Nyt voit säätää koodia ympäri saadaksesi erilaisen LED-sarjan vilkkumaan. Mene eteenpäin koota koodisi ja pudota se MCU: lle ja nauti tuotoksesta. Voit käyttää kommenttiosaa, jos juutut jonnekin. Olen myös liittänyt simulaatio- ja ohjelmatiedostot tähän.
Se on toistaiseksi seuraavassa opetusohjelmassa opimme käyttämään PIC16F877A-ajastimia viivetoimintojen sijaan. Voit selata kaikkia PIC-mikrokontrollerioppaita täältä.