Fórum témák
» Több friss téma |
Cikkek » Elektromos dobókocka PIC 12F629-cel (Video pályázat) Elektromos dobókocka PIC 12F629-cel (Video pályázat)
Szerző: hadnagyakos, idő: Nov 30, 2010, Olvasva: 31228, Oldal olvasási idő: kb. 9 perc
Mivel mikrovezérlőről van szó, ezért kell egy program ami fut benne. Előre megjegyzem, hogy erre a PIC-re lehetett volna sokkal jobb programot is írni, de ez is nagyon jól működik. Nem spóroltam a hellyel, mivel van bőven a PIC-ben belőle. A program Assembly nyelven íródott. A program 12F508-ra írt verzióját Skory készítette. A program átírása közben belekerült egy újabb funkció, a véletlenszerűen változó dobáshossz, továbbá a véletlenszámot nem a Timer modul segítségével generálja a program. A PIC programozást mindenképpen érdemes ezen a nyelven elkezdeni, mivel így lehet megérteni a legjobban a PIC-ek felépítését. A program a következőket tudja: - A dobott értéket a dobókocka pöttyeinek megfelelően rajzolja ki - Körülbelül másfél perc tétlenség után automatikusan kikapcsol - Két gombnyomással is (dupla kattintás ) kikapcsolható - A dobókocka pergési (gurulási) ideje véletlenszerű - A pergés közben változó hangmagasságú hangot hallat - Áram alá helyezéskor felvillantja az összes LED-et és 6-ot csippan a hangszóró A program bemutatása előtt nem árt néhány alapfogalmat tisztázni: Bit: egyetlen logikai értéket takar. Értéke csak 0 vagy 1 lehet. A PIC ún. RISC processzor, tehát a fejlesztésénél arra törekedtek, hogy minél kevesebb parancsot kelljen használni a programozásnál. Ez nagyban megkönnyíti az Assembly nyelv tanulását, viszont a processzor alapból csak egyszerű feladatokat tud elvégezni. Ez azt takarja, hogy a processzornak nincs olyan utasítása, amellyel például osztani lehetne, ezt szoftveresen kell megoldani. A következőkben kitárgyaljuk a program működését: A programnak csak a gondolatmenet megértéséhez szükséges részeit mutatom be, a felépítés szempontjából lényegtelen részeket kihagyom. Konfigurációs rész:
Itt adhatjuk meg a fordítónak, többek között, hogy milyen típusú PIC-el szeretnénk dolgozni: A többi jelölés: _CP_OFF : Kód védelem kikapcsolva. (ha ezt bekapcsoljuk és beégetjük a PIC-be a programot nem tudjuk majd kiolvasni belőle) _BODEN_OFF: Brown Out Reset kikapcsolva. (ha be van kapcsolva és a tápfeszültség a megadott mérték alá csökken, akkor reseteli a processzort, alacsony feszültségű táplálásnál nem ajánlott) _MCLRE_ON: az MCLR láb resetel _WDT_OFF : Watch Dog Timer kikapcsolva (ez egy beépített időzítő a PIC-be, ha bekapcsoljuk és valami értelmetlen jel miatt lefagy a processzor akkor egy kis idő múlva újraindítja) _INTRC_OSC_NOCLKOUT : A PIC belső oszcillátorát használjuk. Init=belső
Itt nevezzük el a program számára a különböző LED csoportokat. Látható, hogy itt vannak megadva az egyes csoportok kombinációi is. Például: ötös, hatos.
Itt defináljuk a változókat egy-egy memóriaterületre. A szabad memóriaterületek elhelyezkedése megtekinthető a PIC adatlapjában a 2.2.2-es oldalon, vagy ITT. Látható, hogy a szabad memóriaterület 20h-nál kezdődik és 60h-nál ér véget. Mi a programban 20h-tól kezdjük a számozást.
Ebben a részben beállítgatjuk, hogy melyik láb legyen ki illetve bemenet illetve még pár dolgot.
Ez rész ellenőrzi, hogy az áramkör hogyan indult el. Tehát áram alá lett helyezve vagy resetelve lett az MCLR lábon.
Számunkra most ez a rész a legfontosabb. Először is véletlen számot generálunk a dobott érték számára. Hogy ne ismétlődjenek a számsorok feltűnően, ezért a véletlen szám generátor kezdőértékének is generálunk egy véletlen számot. Másodszor pedig meghívja a LED-ek villogtatásához szükséges szubrutint, majd ha az első villogás lefutott törli a kikapcsolo regisztert, ezzel megakadályozva, hogy a következő gombnyomásra kikapcsoljon. Tehát, ha a villogás első felében még egyszer megnyomjuk a gombot, a dobókocka kikapcsol. Majd, ha töröltük, még egyszer meghívjuk a villogtató szubrutint.
Itt valósítjuk meg az időzített kikapcsolást, ha lefutott az időzítő ciklus, odaugrik a kikapcs programrészhez és SLEEP üzemmódba kerül a processzor. Ilyenkor a PIC adatlapja szerint 1nA (nano!) a fogyasztása. Ez nagyon kicsi! Ezért nem került a kapcsolásba áramtalanító kapcsoló. 2 darab AAA elemről kis fogyasztású LED-ekkel így is évekig elműködhet. Most következzen a szubrutinok bemutatása:
Ez a szubrutin felelős a LED-ek villogtatásáért és a közben hallható zajért ami a hangszóróból jön. Mint látható a kód elején lefuttatjuk ugyan azt a véletlenszám generátort, amit a program elején. Ezzel a gurítás hosszát állapítjuk meg. Ha lefutott a véletlenszám generálás, meghívjuk az ide tartozó osztás rutint és osztjuk 4-gyel. Így maximum 3-szor fogja lefuttatni az egész ciklust. De van egy kis gond! Mi van, ha nincs maradék az osztásnál? Akkor a szam_guritas regiszter értéke nulla lesz és a program nagyon hosszú ciklusba kezd! Ezt kiküszöbölhetjuk egy nagyon leleményes módszerrel. Mielőtt bármit csinálnánk a munkaregiszterbe helyezzük mondjuk a 6-ot. (movlw d'6'). Ha ez kész elkezdjük a szam_guritas regisztert elkezdjük vizsgálni bitről-bitre. Ha az éppen vizsgálat alatt lévő bit értéke 0, akkor kihagyja a program a következő sort, ami a munkaregiszterben törölné a 6-ot és az osztott véletlenszámot írná a helyébe. De, ha valamelyik bit értéke 1, akkor nem ugorja át a következő sort és a munkaregiszterben a 6-ot felülírja az osztott véletlenszámmal. Ezzel kiküszöbölhető, hogy a szuibrutin számláló ciklusába 0 kerüljön, mivel ha a regiszter minden bitjének az értéke 0, akkor soha nem fogja átírni a munkaregiszter értékét, így marad benne a 6, tehát 6-ot gurul a kocka. Ha viszont a szam_guritas regiszter tartalmaz akár egy darab 1-est is, akkor az kerül bele a munkaregiszterbe, így a véletlenszámnak megfelelő hosszú időt "gurul" a kocka.
Ez a szubrutin a hang előállításért felelős. A "gurítás" közben ez adja a változó magasságú hangot. A hang magassága attól függ, hogy a PIC-be épített időzítőből milyen értéket olvas ki. A hangadást pedig nagyon egyszerűen csinálj, gyorsan kapcsolgatja ki-be azt a lábat, amire a hangszóró van kötve.
Ha azzal indul el a program, hogy áramot adunk az áramkörre, nem a gombot nyomjuk meg, akkor felvillantja az összes LED-et és 6-ot csippan a hangszóró.
Ha letelik az automatikus kikapcsolás ideje, vagy kétszer egymás után gyorsan megnyomjuk a nyomógombot, akkor ez a ciklus hívódik meg. Ez semmi mást nem csinál, csak késleltet egy kicsit, csippant egyet a hangszórón, majd nullázza az összes kimenetet (kikapcsol mindent) és SLEEP módba teszi a processzort.
A változó magasságú hang generálásához olvassa a belső időzítő értékét.
Ezzel a szubrutinnal végezzük el a program elején az osztást. Tulajdonképpen a véletlenszámból, addig vonogatja ki az osztót, amíg a végeredmény nulla nem lesz. Az osztési maradék a szam_0 változóban marad, azt fogjuk kiírni.
Ez az osztás rutin pedig a girítás hosszának megállapításához van. Ez ugyan azt csinálja, mint az előző, csak 4-gyel oszt és a maradék a szam_guritas regiszterbe kerül.
Itt konvertáljuk az osztott véletlenszámot a LED-ek kimenetre kötésének szerintire.
Időzítő ciklusok. Semmi mást nem csinál, csak futnak a ciklusok és telik vele az idő.
Vége a programnak! A programot az MLAB nevű fejlesztőkörnyezettel fordítottam le, ami letölthető a Microchip honlapjáról: ITT A lefordított .HEX fájlt letöltheted: ITT (jobb klikk: mentés másként) Ezt kell beégetni a PIC-be. A cikk még nem ért véget, lapozz! Értékeléshez bejelentkezés szükséges! |
Bejelentkezés
Hirdetés |