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 1 (Basic Commands) 2024, November
Anonim
Výučba montéra AVR 6
Výučba montéra AVR 6

Vitajte v návode 6!

Dnešný tutoriál bude krátky, kde vyvinieme jednoduchú metódu na komunikáciu údajov medzi jedným atmega328p a druhým pomocou dvoch portov, ktoré ich spájajú. Potom vezmeme valček s kockami z tutoriálu 4 a registračný analyzátor z tutoriálu 5, spojíme ich dohromady a pomocou našej metódy oznámime výsledok hodov kockami z valca do analyzátora. Potom rolku vytlačíme binárne pomocou LED diód, ktoré sme skonštruovali pre analyzátor v Tutoriáli 5. Akonáhle budeme mať túto prácu, budeme schopní zostrojiť ďalšiu časť nášho celkového projektu v nasledujúcom návode.

V tomto návode budete potrebovať:

  1. Vaša prototypová doska
  2. Kocka na kocky z tutoriálu 4
  3. Váš analyzátor registrov z tutoriálu 5
  4. Dva spojovacie vodiče
  5. Kópia kompletného dátového listu (revízia 2014):

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

  6. Kópia návodu na použitie (revízia 2014):

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

Tu je odkaz na kompletnú zbierku mojich návodov k assembleru AVR:

Krok 1: Ako môžeme dosiahnuť, aby sa dva mikrokontroléry navzájom rozprávali?

Ako môžeme dosiahnuť, aby sa dva mikrokontroléry navzájom rozprávali?
Ako môžeme dosiahnuť, aby sa dva mikrokontroléry navzájom rozprávali?

Pretože začíname rozširovať náš projekt tak, aby bol náš jediný koncový produkt tvorený súborom menších dielov, budeme potrebovať viac kolíkov, ako môže poskytnúť jeden Atmega328P. Preto urobíme každý kus celkového projektu na samostatnom mikrokontroléri a potom ich necháme zdieľať údaje medzi nimi. Takže problém, ktorý musíme vyriešiť, je, ako môžeme vymyslieť jednoduchú metódu, v ktorej by regulátori mohli medzi sebou hovoriť a prenášať údaje? Jedna vec na týchto ovládačoch je, že každý z nich vykoná 16 miliónov inštrukcií za sekundu. Toto je veľmi presne načasované, a preto ho môžeme použiť na prenos údajov. Ak na zostavenie údajov použijeme oneskorenie v milisekundách, potom nemusíme byť tak presní, pretože CPU vykoná 16 000 inštrukcií za jednu milisekundu. Inými slovami, milisekunda je pre CPU večnosť. Skúsme to teda s kockami. Chcem preniesť výsledok hodu kockou z čipu valca na kocky do čipu analyzátora. Predpokladajme, že ste stáli cez ulicu a ja som vám chcel naznačiť výsledok môjho hodu kockami. Jedna vec, ktorú by som mohol urobiť, keby sme obaja mali hodinky, je, že by som si mohol zapnúť baterku, potom keď budete pripravení prijať moje údaje, zapnete si baterku a obaja spustíme hodiny. Potom si nechám baterku zapnutú na presný počet milisekúnd, ako sa kocky hodia, a potom ju vypnem. Takže keby som hodil 12, nechal by som svoje svetlo svietiť 12 milisekúnd. Problém s vyššie uvedeným je, že pre teba a pre mňa neexistuje spôsob, ako by sme boli schopní načasovať veci dostatočne presne na rozlíšenie medzi 5 milisekundami a 12 milisekundy. Ale čo toto: Predpokladajme, že sme sa rozhodli, že nechám svietiť jeden rok pre každé číslo na kocke? Potom, ak hodím 12 -kou, budem na vás 12 rokov svietiť a myslím, že budete súhlasiť s tým, že nie je možné, že by ste urobili chybu pri zisťovaní čísla, však? Môžete si dať pauzu a ísť hrať baseball, môžete dokonca ísť hrať craps do Vegas na 6 mesiacov, pokiaľ sa v určitom období roka pozriete cez ulicu, aby ste zistili, či nesvieti svetlo, a nič vám neunikne. Presne to robíme pre mikrokontroléry! Jedna milisekunda pre procesor je ako rok. Ak teda zapnem signál na 12 milisekúnd, je takmer žiadna šanca, že si ho druhý mikrokontrolér zamení na 10 alebo 11 bez ohľadu na to, aké prerušenia a medzitým sa nedejú. Pre mikrokontroléry je milisekunda večnosť. Tu je to, čo budeme robiť. Najprv si zvolíme dva porty na ovládači, ktoré budú našimi komunikačnými portami. Na príjem údajov použijem PD6 (môžeme to nazvať Rx, ak chceme) a na prenos údajov zvolím PD7 (môžeme to nazvať Tx, ak chceme). Čip analyzátora bude pravidelne kontrolovať, či je to jeho pin Rx, a ak uvidí signál, prejde na „komunikačný podprogram“a potom vyšle návratový signál na hracie kocky, že je pripravený na príjem. Obaja začnú časovať a valček s kockami bude na kocky prenášať signál (t.j. 5 V) na milisekundu na číslo. Ak by teda hod bol dvojnásobok šestky alebo 12, potom by kockou kocky nastavil PD7 na 5 V na 12 milisekúnd a potom by ho vrátil späť na 0 V. Analyzátor skontroluje svoj kolík PD6 každú milisekundu, pričom vždy počíta, a keď sa vráti na 0 V, potom odošle výsledné číslo na displej analyzátora a na diódach LED zobrazí dvanásť v binárnom čísle. To je plán. Uvidíme, či to dokážeme implementovať.

Krok 2: Komunikačné podprogramy

Prvá vec, ktorú musíme urobiť, je prepojiť dva ovládače. Vezmite teda drôt z PD6 na jednom a pripojte ho k PD7 na druhom a naopak. Potom ich inicializujte nastavením PD7 na OUTPUT na oboch a PD6 na INPUT na oboch. Nakoniec nastavte všetky na 0V. Konkrétne pridajte do sekcie Init alebo Reset kódu v každom mikrokontroléri nasledujúce položky:

sbi DDRD, 7; PD7 nastavený na výstup

cbi PortD, 7; PD7 pôvodne 0V cbi DDRD, 6; PD6 nastavený na vstup cbi PortD, 6; PD6 spočiatku celkom 0V clr; celkom na kockách spočiatku 0

Teraz nastavme komunikačný podprogram na kocke s kockami. Najprv definujte novú premennú v hornej časti s názvom „celkom“, ktorá uloží celkový počet hodených párom kociek a inicializuje ju na nulu.

Potom napíšte podprogram na komunikáciu s analyzátorom:

komunikovať:

cbi PortD, 7 sbi PortD, 7; Počkajte na odoslanie pripraveného signálu: sbic PinD, 6; prečítajte si PinD a preskočte, ak 0V rjmp čaká oneskorenie 8; oneskorenie synchronizácie (zistené experimentálne) odoslať: odmietnuť celkové oneskorenie 2; oneskorenie pre každý počet dielov cpi celkom, 0; 0 tu znamená, že bolo odoslané „celkové“oneskorenie počtu breq PC+2 rjmp send cbi PortD, 7; Celkom PD7 až 0V clr; vynulovať kocky celkom na 0 ret

V analyzátore pridáme do komunikačného podprogramu odvolanie z hlavnej rutiny:

analyzátor clr; pripravte sa na nové číslo

sbic PinD, 6; skontrolujte, či PD6 komunikuje spätným volaním signálu 5V; ak ide 5 V na komunikáciu s analyzátorom pohybu, celkom; výstup do analyzátora displej analyzátor spätného volania

a potom napíšte podprogram komunikácie nasledovne:

komunikovať:

celkom clr; reset celkom na 0 oneskorenie 10; oneskorenie, ako sa zbaviť odrazov sbi PortD, 7; nastavte PB7 na 5V na signál pripraveného príjmu: oneskorenie 2; počkajte na ďalšie číslo vrátane celkom; prírastok celkom sbic PinD, 6; ak sa PD6 vráti na 0V, skončíme s prijatím rjmp; inak zazálohujte slučku pre viac dát cbi PortD, 7; po dokončení resetujte PD7

Nech sa páči! Teraz je každý mikrokontrolér nastavený tak, aby komunikoval výsledok hodu kockou a potom ho zobrazil na analyzátore.

Neskôr implementujeme oveľa efektívnejší spôsob komunikácie, keď budeme potrebovať preniesť obsah registra medzi radiče namiesto len kocky. V takom prípade budeme stále používať iba dva vodiče, ktoré ich spájajú, ale na označenie „začnite prenos“použijeme 1, 1; 0, 1 znamená "1"; 1, 0 znamená "0"; a nakoniec 0, 0 znamená „koncový prenos“.

Cvičenie 1: Zistite, či môžete implementovať lepšiu metódu a použite ju na prenos kocky ako 8-bitové binárne číslo.

Prikladám video, ktoré ukazuje moje v prevádzke.

Krok 3: Záver

Záver
Záver

Pripájam kompletný kód pre vašu referenciu. Nie je to také čisté a upratané, ako by som chcel, ale vyčistím to, pretože to rozšírime v budúcich návodoch.

Odteraz budem iba pripájať súbory obsahujúce kód, než aby som to tu celé vypisoval. Jednoducho napíšeme sekcie, o ktorých máme záujem diskutovať.

Toto bol krátky tutoriál, kde sme prišli na jednoduchú metódu, ako povedať nášmu mikrokontroléru analyzátora, aký je výsledok nášho hádzania kockami z nášho mikrokontroléra s kockami, a to iba pri použití dvoch portov.

Cvičenie 2: Namiesto toho, aby ste pomocou signálu pripravenosti ukazovali, kedy je kocka na kocky pripravená na vysielanie, a druhým, keď je analyzátor pripravený na príjem, použite „externé prerušenie“nazývané „prerušenie zmeny kolíka“. Kolíky na atmega328p je možné použiť týmto spôsobom, a preto majú vo vývodovom diagrame vedľa seba PCINT0 cez PCINT23. Môžete to implementovať ako prerušenie podobným spôsobom, ako sme to urobili pri prerušení pretečenia časovača. V tomto prípade bude „obsluha“prerušenia podprogram, ktorý komunikuje s kockou. Týmto spôsobom nemusíte skutočne volať komunikačný podprogram z hlavného: pôjde tam vždy, keď dôjde k prerušeniu zo zmeny stavu na tomto pine.

Cvičenie 3: Oveľa lepší spôsob komunikácie a prenosu údajov medzi jedným mikrokontrolérom do zbierky iných je použitie vstavaného 2-vodičového sériového rozhrania na samotnom mikrokontroléri. Skúste si prečítať časť 22 technického listu a zistite, či môžete prísť na to, ako ho implementovať.

Tieto sofistikovanejšie techniky použijeme v budúcnosti, keď pridáme ďalšie ovládače.

Skutočnosť, že všetko, čo sme urobili s naším analyzátorom, je odobrať súčet kociek kociek a potom ich vytlačiť binárne pomocou diód LED, nie je dôležitá. Faktom je, že náš analyzátor teraz „vie“, čo je kocka kocky, a podľa toho ju môže použiť.

V nasledujúcom návode zmeníme účel nášho „analyzátora“, predstavíme niekoľko ďalších obvodových prvkov a zaujímavejšie použijeme hod kockou.

Dobudúcna…

Odporúča: