Korábbi oktatóanyagunkban megismertük a LED villogását a PIC mikrovezérlő segítségével, és ugyanezt az áramkört építettük a Perf táblára. Ezután PICkit 3-at, ICSP-t és MPLAB IPE-t használtunk arra, hogy a programot a Perf táblánkra dobjuk. Most ebben az oktatóanyagban tovább fogjuk fejleszteni önmagunkat, hogy több csapot használjon a PIC mikrokontrolleren. 7 kimenetet (LED) és egy bemenetet fogunk használni. Ehhez az oktatóanyaghoz a régi Perf táblát fogjuk használni (az alább látható), és hozzáadunk berg botokat, hogy kihúzzuk a szükséges csapokat a második LED táblára. A bemutató végén generálunk egy villogó LED-ek sorozatát a PIC16F877A PIC mikrovezérlő használatával, és megtanuljuk, hogyan használjunk több bemenetet és kimenetet, néhány alapot a „for” hurokhoz és függvényhíváshoz.
A LED tábla nem más, mint egy másik perf tábla, amelyen egy áramkorlátozó ellenállással forrasztjuk a LED-eket (az alább látható). Hozzáadunk egy nyomógombot is a LED villogásának elindításához.
Kördiagramm:
PIC mikrovezérlő PIC16F877A LED villogó szekvenciakód és működő magyarázat:
A teljes kódot alább adtuk meg (ellenőrizze a végén), itt soronként átjutunk. Ez a kód a nyomógomb lenyomásakor kezd egymás után világítani a LED- eken. A szekvenciák megértése érdekében kérjük, nézze meg a videót az oktatóanyag végén. Azt javaslom, hogy hasonlítsa össze a videóban megjelenített kimenetet az alábbi kóddal, és próbálja megérteni a programot.
Nézzük soronként a kódot. Az első néhány sor a konfigurációs bitek beállítására szolgál, amelyeket az előző bemutató ismertetett, ezért egyelőre kihagyom őket. A program megértésének legjobb módja a main ( void main () ) függvényből indul, tehát tegyük ezt meg
TRISB0 = 1; // Utasítsa az MCU-t, hogy a PORTB 0 tűt használja a gomb bemenetéhez. TRISD = 0x00; // utasítsa az MCU-t, hogy az összes érintkezõ kimenete PORTD = 0x00; // Inicializálja az összes csapot 0-ra
A TRIS szót arra használjuk, hogy meghatározzuk, hogy a csapot használjuk-e bemenetként / kimenetként, és a PORT szót használjuk a tű magas / alacsony kialakításához. A TRISB0 = 1 sorból a B PORT 0. csapja lesz bemenet. Ez lesz a nyomógombunk. A TRISD = 0x00 vonalak ; PORTD = 0x00; a D port összes érintkezõjét kimenetként készíti el, és a LOW kezdõ értékét hozzárendeli ezekhez a csapokhoz.
Mivel azt mondtuk, hogy B0-t használunk bemenetként, a nyomógomb egyik végét a B0 csaphoz, a másik végét pedig a földhöz fogjuk csatlakoztatni. Addigra, amikor megnyomjuk a gombot, a csap a földre kerül, ahogy a fenti kapcsolási rajz mutatja. De ennek megvalósításához felhúzási ellenállást kell használnunk, hogy a csap magasan maradjon, ha a gombot nem nyomják meg. A felhúzható ellenállás valami ilyesmi.
De a PIC MCU-nknak van egy belső gyenge ellenállása, amelyet a szoftver aktiválhat, így sok gondot megtakarítva (amikor több gombot kell csatlakoztatni).
Mi az a gyenge felhúzható ellenállás?
Kétféle felhúzható ellenállás létezik, az egyik gyenge felhúzás, a másik pedig erős felhúzás. A gyenge felhúzási ellenállások nagy értékűek, így gyenge áramot engednek átfolyni, az erős húzó ellenállások pedig alacsony értékűek, ezáltal erős áram áramlik. Az összes MCU többnyire gyenge felhúzási ellenállást használ. Ennek aktiválásához a PIC MCU-ban meg kell vizsgálnunk az OPTION_REG (opciós regiszter) adatlapunkat, az alábbi pillanatkép szerint.
Amint látható, a 7. bit a gyenge felhúzási ellenállással foglalkozik. Az aktiválásához nullát kell tenni. Ezt az OPTION_REG <7> = 0 adja meg . Ez kifejezetten azzal foglalkozik, hogy a 7 bit a többi bitet az alapértelmezett értékre hagyja. Ezzel bejutunk a while ciklusunkba, ahol az if (RB0 == 0) használatával ellenőrzi, hogy megnyomták-e a gombot . Ha a feltétel teljesül, akkor az 1., 3., 7. és 15. paraméterrel hívjuk meg a függvényünket.
sblink (1); // FUNCTION CALL 1 az 1. paraméterrel sblink (3); // FUNCTION CALL 3 a 3. paraméterrel sblink (7); // FUNCTION CALL 7 a 7 paraméterrel sblink (15); // FUNCTION CALL 4 a 15. paraméterrel
Miért használjuk a függvényeket?
A függvényeket arra használjuk, hogy csökkentsük a kódok sorainak számát. Ezt tudták a legtöbben. De miért kell csökkentenünk a sorok számát, különösen, ha az MCU programozásról van szó. Ennek oka a program memóriánkban lévő korlátozott hely. Ha nem optimalizáljuk a kódot megfelelően, akkor elfogyhat a memória. Ez hasznos lesz, ha hosszú oldalas kódokat írunk.
Bármelyik függvénynek meg lesz a Definíciója ( esetünkben az sblink (int get) ) és a Call függvénye ( esetünkben az sblink (1 ). Nem kötelező a függvény deklarációja, annak elkerülése érdekében a függvény definíciómat elhelyeztem, mielőtt a függvényt behívnám a fő függvényembe.
A függvényparaméterek azok az értékek, amelyeket a függvényhívás és a függvénydefiníció továbbít. Esetünkben az egész értékek (1, 3, 7, 15) azok a paraméterek, amelyeket a függvényhívásból adunk át, és a "get" változó a paraméterek értékét a függvénydefinícióba juttatja, hogy azokat feldolgozza. Egy funkciónak több paramétere lehet.
A függvény meghívása után a függvénydefiníció alábbi sorai kerülnek végrehajtásra.
mert (int i = 0; i <= 7 && RB0 == 0; i ++) {PORTD = get << i; // LED mozgatása bal szekvencia __késleltetés_ms (50); } for (int i = 7; i> = 0 && RB0 == 0; i--) {PORTD = get << i; // LED mozgatása bal szekvencia __késleltetés_ms (50); }
Ez a sor furcsának tűnik: PORTD = get << i . Elmagyarázom, mi történik itt valójában.
A "<<" egy bal váltás operátor, amely az összes bitet bal helyzetébe tolja. Most, amikor az sblink (int get) függvényt az '1' paraméterrel hívjuk sblink (1) néven, akkor a 'get' értékét 1- ként állítja elő , ami binárisan 0b00000001. Ezért ez a sor olyan lesz, mint PORTD = 0b00000001 << i .
Az "i" értéke 0 és 7 között változik, mivel a for for ciklust használtuk (int i = 0; i <= 7 && RB0 == 0; i ++). Az 'i' értéke 0 és 7 között az alábbiak szerint változtatja meg az eredményt:
Amint láthatja, egy-egy LED-et kapcsoltunk be (balról jobbra), a többit kikapcsolt állapotban tartva. A következő „for loop” (int i = 7; i> = 0 && RB0 == 0; i--) esetén szintén ugyanezt fogja tenni, de ezúttal a LED-et jobbról balra folyamatosan kapcsolják be, amikor 7-től kezdtünk és 0-ra mentünk. 200 ms késleltetést alkalmaztunk, hogy megjelenítsük a be- és kikapcsolt LED-t.
Most, amikor átadjuk a 3. értéket az sblink (int get) függvényben, akkor az sblink (3) függvény végrehajtásra kerül, ami a 'get' értékét 0b00000011 értékre teszi, ezért a PORTD eredménye
Tehát most ezúttal két LED kapcsol be bármikor az sblink (3) használatával. Hasonlóan az sblink (7) és az sblink (15) esetében három és négy LED is egymás után világít. Ha ez befejeződött, akkor az összes LED-et be kell kapcsolni a PORTD = 0xFF vonallal . A teljes bemutatóért nézze meg az alábbi videót.
Remélem, megértette a kódot, és így megtanulta, hogyan kell használni a 'for' és a 'while' függvényeket a kívánt kimenetek megszerzéséhez. Most módosíthatja a kódot, hogy a különböző LED-ek villogjanak. Folytasd össze a kódodat és dobd ki az MCU-ra, és élvezd a kimenetet. Használhatja a megjegyzés részt, ha elakad valahol. Ide csatoltam a szimulációs és a program fájlokat is.
Ez egyelőre a következő oktatóanyagunkban megtanuljuk a PIC16F877A időzítők használatát a késleltetési funkciók használata helyett. Az összes PIC mikrokontroller oktatóanyagot itt böngészheti.