Obsah:

AVR Assembler Tutorial 6: 3 Steps
AVR Assembler Tutorial 6: 3 Steps

Video: AVR Assembler Tutorial 6: 3 Steps

Video: AVR Assembler Tutorial 6: 3 Steps
Video: AVR Assembly Tutorial: Part 3 (Inputs and Outputs) 2024, Listopad
Anonim
AVR Assembler Tutorial 6
AVR Assembler Tutorial 6

Vítejte v Tutoriálu 6!

Dnešní tutoriál bude krátký, kde vyvineme jednoduchou metodu pro komunikaci dat mezi jedním atmega328p a druhým pomocí dvou portů, které je spojují. Poté vezmeme hrací kostku z výukového programu 4 a registrační analyzátor z výukového programu 5, spojíme je dohromady a pomocí naší metody sdělíme výsledek hodů kostkou z válce do analyzátoru. Poté vytiskneme roli binárně pomocí LED diod, které jsme zkonstruovali pro analyzátor v Tutoriálu 5. Jakmile budeme mít tuto práci, budeme moci zkonstruovat další část našeho celkového projektu v dalším tutoriálu.

V tomto kurzu budete potřebovat:

  1. Vaše prototypovací deska
  2. Váleček s kostkami z Tutoriálu 4
  3. Váš analyzátor registrů z výukového programu 5
  4. Dva propojovací vodiče
  5. Kopie kompletního listu (revize 2014):

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

  6. Kopie návodu k použití (revize 2014):

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

Zde je odkaz na kompletní sbírku mých návodů k assembleru AVR:

Krok 1: Jak můžeme přimět dva mikrokontroléry k vzájemné komunikaci?

Jak můžeme přimět dva mikrokontroléry k vzájemné komunikaci?
Jak můžeme přimět dva mikrokontroléry k vzájemné komunikaci?

Protože začínáme rozšiřovat náš projekt tak, aby náš jediný koncový produkt byl tvořen souborem menších dílů, budeme potřebovat více pinů, než může poskytnout jeden Atmega328P. Proto uděláme každý kus celkového projektu na samostatném mikrokontroléru a poté je necháme sdílet data mezi nimi. Problém, který musíme vyřešit, je, jak můžeme vymyslet jednoduchou metodu, jak by si správci mohli povídat a přenášet mezi nimi data? Jedna věc na těchto ovladačích je, že každý provede 16 milionů instrukcí za sekundu. To je velmi přesně načasováno, a proto můžeme toto načasování použít k přenosu dat. Použijeme -li k vytvoření dat milisekundová zpoždění, pak nemusíme být tak přesní, protože CPU provádí 16 000 instrukcí za jedinou milisekundu. Jinými slovy, milisekunda je pro CPU věčnost. Zkusme to tedy s kostkami. Chci předat výsledek hodu kostkou z čipu na kostky na čip analyzátoru. Předpokládejme, že stojíte na druhé straně ulice a já vám chci signalizovat výsledek mého hodu kostkami. Jedna věc, kterou bych mohl udělat, kdybychom měli oba hodinky, bylo, že bych mohl rozsvítit baterku, pak, až budete připraveni přijmout moje data, rozsvítíte baterku a oba spustíme hodiny. Poté nechám baterku zapnutou na přesný počet milisekund, jak kostky házejí, a pak ji vypnu. Takže kdybych hodil 12, nechal bych své světlo svítit 12 milisekund. Problém s výše uvedeným je, že pro vás a pro nás neexistuje žádný způsob, jak bychom mohli věci dostatečně přesně načasovat, abychom rozlišovali mezi 5 milisekundami a 12 milisekund. Ale co tohle: Předpokládáme, že jsme se rozhodli, že nechám svítit jeden rok pro každé číslo na kostce? Pak, když hodím 12, budu na vás svítit 12 let a myslím, že budete souhlasit, že není možné, že uděláte chybu při zjišťování čísla, že? Můžete si dát pauzu a jít hrát baseball, dokonce si můžete jít zahrát craps do Vegas na 6 měsíců, pokud se v určitém okamžiku během roku podíváte přes ulici, abyste zjistili, jestli svítí světlo, a nenecháte si ujít počítání. Přesně to děláme pro mikrokontroléry! Jedna milisekunda pro CPU je jako rok. Pokud tedy zapnu signál na 12 milisekund, není téměř žádná šance, že jej druhý mikrokontrolér zamění na 10 nebo 11 bez ohledu na to, co přeruší a co se mezitím nestane. Pro mikrokontroléry je milisekunda věčnost, takže tady je to, co uděláme. Nejprve vybereme dva porty na řadiči, aby byly našimi komunikačními porty. Pro příjem dat použiji PD6 (můžeme tomu říkat Rx) a pro přenos dat zvolím PD7 (můžeme to nazvat Tx, pokud chceme). Čip analyzátoru bude pravidelně kontrolovat, zda je to jeho Rx pin, a pokud uvidí signál, klesne na „komunikační podprogram“a poté odešle zpětný signál na hrací kostku s tím, že je připraven přijímat. Oba začnou načasovat a kostkový válec bude na kostky vysílat signál (tj. 5 V) po dobu milisekundy na číslo. Pokud by tedy hod byl dvojnásobek šestky nebo 12, pak by kostkový váleček nastavil PD7 na 5 V na 12 milisekund a poté jej vrátil zpět na 0 V. Analyzátor zkontroluje svůj kolík PD6 každou milisekundu, počítá pokaždé, a když se vrátí na 0 V, pak odešle výsledné číslo na displej analyzátoru a na LED diodách zobrazí dvanáct v binárním čísle. Takový je plán. Uvidíme, jestli to dokážeme implementovat.

Krok 2: Komunikační podprogramy

První věc, kterou musíme udělat, je propojit dva ovladače. Vezměte tedy vodič z PD6 na jednom a připojte jej k PD7 na druhém a naopak. Poté je inicializujte nastavením PD7 na OUTPUT na obou a PD6 na INPUT na obou. Nakonec je všechny nastavte na 0V. Konkrétně přidejte do sekce Init nebo Reset kódu na každém mikrokontroléru následující:

sbi DDRD, 7; PD7 nastaven na výstup

cbi PortD, 7; PD7 zpočátku 0V cbi DDRD, 6; PD6 nastaven na vstup cbi PortD, 6; PD6 původně 0V clr celkem; celkem na kostkách zpočátku 0

Nyní nastavíme podprogram komunikace na čipu s kostkami. Nejprve definujte novou proměnnou nahoře s názvem „celkem“, která uloží celkový počet hodů na dvojici kostek a inicializuje ji na nulu.

Poté napište podprogram pro komunikaci s analyzátorem:

komunikovat:

cbi PortD, 7 sbi PortD, 7; Odeslat připraven signál čekání: sbic PinD, 6; přečtěte PinD a přeskočte, pokud 0V rjmp čeká zpoždění 8; zpoždění synchronizace (zjištěno experimentálně) odeslat: dec celkové zpoždění 2; zpoždění pro každý počet kostek celkem cpi, 0; 0 zde znamená, že bylo odesláno „celkové“zpoždění počtu breq PC+2 rjmp send cbi PortD, 7; Celkem PD7 až 0V clr; reset kostek celkem na 0 ret

V analyzátoru přidáme zpětné volání z hlavní rutiny do podprogramu komunikace:

clr analyzátor; připravte se na nové číslo

sbic PinD, 6; zkontrolujte PD6, zda komunikuje zpětným voláním signálu 5V; pokud 5V přejít na komunikaci mov analyzátor, celkem; výstup do analyzátoru displej analyzátor zpětného volání

a poté napište podprogram komunikace následujícím způsobem:

komunikovat:

celkem clr; reset celkem na 0 zpoždění 10; zpoždění, jak se zbavit odrazů sbi PortD, 7; nastavte PB7 na 5V, aby signalizoval připravený příjem: zpoždění 2; počkejte na další číslo včetně celkem; přírůstek celkového sbic PinD, 6; pokud se PD6 vrátí na 0V, jsme hotovi rjmp receive; jinak zazálohujte smyčku pro více dat cbi PortD, 7; reset PD7 po dokončení ret

Tady máš! Nyní je každý mikrokontrolér nastaven tak, aby sdělil výsledek hodu kostkou a poté jej zobrazil na analyzátoru.

Později, když potřebujeme přenést obsah registru mezi řadiče namísto pouhého hodu kostkou, implementujeme mnohem efektivnější způsob komunikace. V takovém případě budeme stále používat pouze dva vodiče, které je spojují, ale použijeme 1, 1 pro „zahájení přenosu“; 0, 1 znamená "1"; 1, 0 znamená "0"; a nakonec 0, 0 znamená „konec přenosu“.

Cvičení 1: Zjistěte, zda můžete implementovat lepší metodu a použijte ji k přenosu kostky jako 8bitové binární číslo.

Přikládám video, které ukazuje moje v provozu.

Krok 3: Závěr

Závěr
Závěr

Přikládám kompletní kód pro vaši referenci. Není to tak čisté a uklizené, jak bych chtěl, ale vyčistím to, jak to rozšíříme v budoucích tutoriálech.

Od nynějška budu pouze připojovat soubory obsahující kód, místo toho, abych to všechno psal sem. Prostě napíšeme sekce, o které máme zájem diskutovat.

Toto byl krátký tutoriál, kde jsme přišli na jednoduchou metodu, jak sdělit mikrokontroléru našeho analyzátoru, jaký je výsledek našeho hodu kostkami z našeho mikrokontroléru s kostkami při použití pouze dvou portů.

Cvičení 2: Namísto použití připraveného signálu k ukázání, kdy je hrací kostka připravena k přenosu, a jiného, když je analyzátor připraven k příjmu, použijte „externí přerušení“, kterému se říká „přerušení změny pinů“. Kolíky na atmega328p lze použít tímto způsobem, a proto mají v diagramu pinoutů vedle sebe PCINT0 přes PCINT23. Můžete to implementovat jako přerušení podobným způsobem, jako jsme to udělali u přerušení přetečení časovače. V tomto případě bude „handler“přerušení podprogram, který komunikuje s kostkou. Tímto způsobem nemusíte ve skutečnosti volat podprogram komunikace z hlavního: půjde tam kdykoli dojde k přerušení ze změny stavu na tomto pinu.

Cvičení 3: Mnohem lepší způsob komunikace a přenosu dat mezi jedním mikrokontrolérem do sbírky dalších je pomocí vestavěného 2vodičového sériového rozhraní na samotném mikrokontroléru. Zkuste si přečíst část 22 datového listu a zjistit, zda můžete zjistit, jak jej implementovat.

Tyto sofistikovanější techniky použijeme v budoucnu, až přidáme další ovladače.

Skutečnost, že jsme s naším analyzátorem provedli pouze to, že jsme odebrali součet kostek a poté je vytiskli binárně pomocí LED, to není důležité. Faktem je, že nyní náš analyzátor „ví“, co je kostka, a podle toho ji může použít.

V příštím tutoriálu změníme účel našeho „analyzátoru“, představíme několik dalších obvodových prvků a zajímavěji použijeme házení kostkami.

Do příště…

Doporučuje: