Tartalomjegyzék:

AVR Assembler bemutató 6: 3 lépés
AVR Assembler bemutató 6: 3 lépés

Videó: AVR Assembler bemutató 6: 3 lépés

Videó: AVR Assembler bemutató 6: 3 lépés
Videó: LDmicro 11: Последовательный контроллер температуры с ЖК-дисплеем (лестничное программирование ПЛК микроконтроллера с помощью LDmicro) 2024, November
Anonim
AVR összeszerelő oktatóanyag 6
AVR összeszerelő oktatóanyag 6

Üdvözöljük a 6. oktatóanyagban!

A mai oktatóanyag rövid lesz, ahol egy egyszerű módszert fogunk kifejleszteni az adatok közlésére az egyik atmega328p és a másik között, két, egymással összekötő port segítségével. Ezután a kockahengert a 4. oktatóanyagból és a regisztrációs elemzőt az 5. bemutatóból vesszük össze, összekapcsoljuk őket, és módszerünkkel közöljük a dobókocka dobásának eredményét a hengerről az analizátorhoz. Ezután a tekercset binárisan kinyomtatjuk az 5. oktatóanyag elemzőjéhez készített LED -ek segítségével. Ha ez megvan, akkor a következő oktatóanyagban elkészíthetjük a teljes projekt következő darabját.

Ebben az oktatóanyagban szüksége lesz:

  1. A prototípus táblája
  2. Kockahengere a 4. bemutatóból
  3. Regisztrációs elemzője az 5. oktatóanyagból
  4. Két összekötő vezeték
  5. A teljes adatlap másolata (2014 -es verzió):

    www.atmel.com/images/Atmel-8271-8-bit-AVR-M…

  6. A használati utasítás másolata (2014 -es verzió):

    www.atmel.com/images/atmel-0856-avr-instruc…

Itt egy link az AVR összeszerelő oktatóanyagaim teljes gyűjteményéhez:

1. lépés: Hogyan tudunk két mikrokontrollert beszélni egymással?

Hogyan érhetjük el, hogy két mikrokontroller beszéljen egymással?
Hogyan érhetjük el, hogy két mikrokontroller beszéljen egymással?

Mivel elkezdjük bővíteni projektünket úgy, hogy egyetlen végtermékünk kisebb alkatrészekből áll, több csapra lesz szükségünk, mint amennyit egyetlen Atmega328P képes biztosítani. Ezért a teljes projekt minden egyes részét külön mikrovezérlőn végezzük, majd megosztjuk egymással az adatokat. Tehát a problémát meg kell oldanunk, hogy hogyan tudunk egy egyszerű módszert kitalálni a vezérlők számára, hogy beszéljenek egymással, és adatokat továbbítsanak közöttük? Nos, egy dolog ezekben a vezérlőkben az, hogy mindegyik 16 millió utasítást hajt végre másodpercenként. Ez nagyon pontosan van időzítve, és így ezt az időzítést használhatjuk adatátvitelre. Ha ezredmásodperces késleltetéseket használunk az adatok létrehozásához, akkor valójában nem kell ennyire pontosnak lennünk, mivel a CPU 16 000 utasítást hajt végre egyetlen ezredmásodperc alatt. Más szóval, egy ezredmásodperc egy örökkévalóság a CPU számára. Tehát próbáljuk ki a kockadobással. Egy kocka dobás eredményét szeretném továbbítani a kockadobó chipről az elemző chipre. Tegyük fel, hogy az utca túloldalán állt, és jelezni akartam nektek a dobókockám eredményét. Egy dolgot tehetnék, ha mindkettőnknek lenne órája, hogy bekapcsolhatnék egy zseblámpát, majd amikor készen áll az adataim fogadására, bekapcsolja a zseblámpát, és mindketten elindítjuk az órát. Aztán a zseblámpámat bekapcsolva tartom a pontos ezredmásodpercekig, amíg a dobókocka dob, majd lekapcsolom. Tehát ha 12 -et dobnék, 12 ezredmásodpercig bekapcsolva tartanám a fényt. Most az a probléma a fentiekkel, hogy számodra és számomra nincs mód arra, hogy képesek legyünk elég pontosan időzíteni a dolgokat ahhoz, hogy megkülönböztessük az 5 és 12 ezredmásodpercet. ezredmásodperc. De mi van ezzel: Tegyük fel, hogy úgy döntöttünk, hogy a dobókocka minden számára egy évig világítok. Aztán ha dobok egy 12 -est, 12 évig világítanám rátok a fényt, és azt hiszem, egyetértenek abban, hogy nincs esély arra, hogy hibát követ el, ha kitalálja a számot? Tarthat egy kis szünetet, és baseballozhat, de akár 6 hónapig is játszhat Craps -en Vegasban, amíg az év valamely pontján átpillant az utcán, hogy lámpa égjen -e, nem fog hiányozni egy számolás. Nos, pontosan ezt tesszük a mikrokontrollerekért! A CPU egyetlen ezredmásodperce olyan, mint egy év. Tehát ha 12 milliszekundumra bekapcsolom a jelet, szinte nincs esély arra, hogy a másik mikrokontroller 10 vagy 11 évig megzavarja, függetlenül attól, hogy mi szakítja meg és mi nem történik közben. A mikrovezérlők számára ezredmásodperc egy örökkévalóság. Tehát itt fogunk tenni. Először a vezérlő két portját választjuk kommunikációs portjainkká. A PD6 -ot fogom használni az adatok fogadásához (nevezhetjük Rx -nek, ha úgy tetszik), és a PD7 -et választom az adatok továbbítására (ha úgy tetszik, hívhatjuk Tx -nek). Az elemző chip rendszeresen ellenőrzi, hogy az Rx tű, és ha jelzést lát, akkor "kommunikációs alprogramra" csökken, majd visszatérési jelet küld a kockahengernek, mondván, hogy készen áll a fogadásra. Mindketten elkezdik az időzítést, és a kockahenger jelet (azaz 5 V) továbbít egy milliszekundumonként a kockán. Tehát ha a dobás dupla hatos, vagy 12 -es, akkor a kockahenger PD7 -et 5 V -ra állítja 12 milliszekundumra, majd visszaállítja 0 V -ra. Az elemző minden ezredmásodpercenként ellenőrzi a PD6 tűjét, minden alkalommal számol, és amikor visszaáll 0 V -ra, akkor a kapott számot megjeleníti az analizátor kijelzőjén, és tizenkettőt mutat binárisan a LED -eken. Tehát ez a terv. Lássuk, tudjuk -e megvalósítani.

2. lépés: Kommunikációs alprogramok

Az első dolog, amit meg kell tennünk, a két vezérlő csatlakoztatása. Tehát vegyen egy vezetéket a PD6-ról az egyiken, és csatlakoztassa a PD7-re a másikon, és fordítva. Ezután inicializálja őket úgy, hogy a PD7 -et OUTPUT értékre állítja mindkettőn, és a PD6 -ot INPUT -ra mindkét oldalon. Végül állítsa mindegyiket 0V -ra. Pontosabban, adja hozzá a következőt a kód Init vagy Reset szakaszához a mikrokontrollereken:

sbi DDRD, 7; A PD7 kimenetre van állítva

cbi PortD, 7; PD7 kezdetben 0V cbi DDRD, 6; PD6 beállítása cbi PortD, 6 bemenetre; PD6 kezdetben 0V clr összesen; összesen a kockán kezdetben 0

Most állítsuk be a kommunikációs alprogramot a kockadobó chipen. Először határozzon meg egy új változót a tetején, "total" néven, amely tárolja a dobott dobókockák számát, és inicializálja nullára.

Ezután írjon egy alprogramot az elemzővel való kommunikációhoz:

kommunikálni:

cbi PortD, 7 sbi PortD, 7; Kész jel küldése várakozás: sbic PinD, 6; olvassa el a PinD -t, és hagyja ki, ha 0V rjmp várakozási késleltetés 8; késleltetés a szinkronizáláshoz (ezt kísérletileg találtuk) send: dec total delay 2; késleltetés minden kockaszámnál cpi összesen, 0; 0 itt azt jelenti, hogy "összes" késleltetést küldtek breq PC+2 rjmp send cbi PortD, 7; PD7 - 0V clr összesen; kocka visszaállítása 0 ret

Az elemzőben hozzáadunk egy rcall -t a fő rutinból a kommunikációs alprogramhoz:

clr elemző; készüljön fel az új számra

sbic PinD, 6; ellenőrizze a PD6 -ot, hogy nincs -e 5V jel rcall kommunikáció; ha 5V megy kommunikálni mov analizátor, összesen; kimenet az analizátor kijelzőjére rcall analizátor

majd írja le a kommunikációs alprogramot a következőképpen:

kommunikálni:

clr összesen; visszaállítás összesen 0 késleltetésre 10; késleltetés, hogy megszabaduljon az ugrálásoktól sbi PortD, 7; állítsa a PB7 -et 5V -ra, hogy jelezze a kész vételt: 2. késleltetés; várja meg a következő számot, összesen; növekmény teljes sbic PinD, 6; ha a PD6 visszatér 0V -ra, akkor befejeztük az rjmp fogadást; ellenkező esetben folytassa a biztonsági mentést további adatokért cbi PortD, 7; állítsa vissza a PD7 -et, ha kész ret

Nesze! Most minden mikrokontroller úgy van beállítva, hogy közölje a kockadobás eredményét, majd megjelenítse azt az analizátoron.

A későbbiekben sokkal hatékonyabb kommunikációs módszert fogunk alkalmazni, amikor a regiszter tartalmát csak a kockadobás helyett a vezérlők között kell átvinni. Ebben az esetben továbbra is csak két vezetéket használunk, amelyek összekötik őket, de az 1, 1 -et használjuk az "átvitel megkezdése" kifejezésre; 0, 1 jelentése "1"; 1, 0 jelentése "0"; és végül a 0, 0 azt jelenti, hogy "végső átvitel".

1. gyakorlat: Nézze meg, hogy megvalósíthatja-e a jobb módszert, és felhasználhatja-e a kockadobás 8 bites bináris számként történő átvitelére.

Csatolok egy videót, amely bemutatja az enyém működését.

3. lépés: Következtetés

Következtetés
Következtetés

Mellékeltem a teljes kódot az Ön számára. Nem olyan tiszta és rendezett, mint szeretném, de megtisztítom, ahogy kibővítjük a későbbi oktatóanyagokban.

Mostantól csak a kódot tartalmazó fájlokat csatolom, ahelyett, hogy ide beírnám az összeset. Csak beírjuk azokat a részeket, amelyekről szeretnénk beszélni.

Ez egy rövid oktatóanyag volt, ahol egy egyszerű módszert találtunk ki, amellyel elmondhatjuk az elemző mikrovezérlőnknek, hogy mi a dobókockánk eredménye a kockahengeres mikrovezérlőnkből, miközben csak két portot használunk.

2. gyakorlat: Ahelyett, hogy kész jelzést használna annak jelzésére, hogy a kockahenger készen áll -e az adásra, és egy másikra, amikor az elemző készen áll a fogadásra, használjon "külső megszakítást", amelyet "csapcsere -megszakításnak" neveznek. Az atmega328p csapjai így használhatók, ezért vannak a PCINT0 és a PCINT23 mellett a pinout diagram. Ezt megszakításként hasonló módon valósíthatja meg, mint az időzítő túlcsordulás megszakításakor. Ebben az esetben a megszakítás "kezelője" lesz az alprogram, amely a kockahengerrel kommunikál. Így nem kell a kommunikációs alprogramot a mainból hívni: bármikor oda fog menni, ha az adott csap állapotváltozása miatt megszakítás következik be.

3. gyakorlat: Sokkal jobb módja annak, hogy kommunikáljon és továbbítson adatokat egy mikrokontroller között egy másik gyűjteménybe, ha magának a mikrovezérlőnek a beépített 2 vezetékes soros interfészét használja. Próbálja meg elolvasni az adatlap 22. szakaszát, és nézze meg, hogy rájön -e annak megvalósítására.

Ezeket a kifinomultabb technikákat fogjuk használni a jövőben, amikor további vezérlőket adunk hozzá.

Nem az a fontos, hogy az elemzőgépünkkel csak a kockadobás teljes összegét vettük fel, majd binárisan kinyomtattuk a LED -ek segítségével. A helyzet az, hogy most elemzőnk "tudja", mi az a kockadobás, és ennek megfelelően tudja használni.

A következő oktatóanyagban megváltoztatjuk "analizátorunk" célját, bevezetünk még néhány áramköri elemet, és érdekesebb módon használjuk a kockadobást.

A következő alkalomig…

Ajánlott: