Sadržaj:

AVR asemblerski vodič 6: 3 koraka
AVR asemblerski vodič 6: 3 koraka

Video: AVR asemblerski vodič 6: 3 koraka

Video: AVR asemblerski vodič 6: 3 koraka
Video: Автомобильный генератор для генератора с самовозбуждением с использованием ДИОДА 2024, Juli
Anonim
Vodič za AVR asembler 6
Vodič za AVR asembler 6

Dobro došli u Vodič 6!

Današnji vodič bit će kratak u kojem ćemo razviti jednostavnu metodu za prijenos podataka između jednog atmega328p i drugog pomoću dva priključka koji ih povezuju. Zatim ćemo uzeti valjak za kockice iz vodiča 4 i analizator registra iz vodiča 5, spojiti ih zajedno i koristiti našu metodu za prenos rezultata bacanja kockica s valjka u analizator. Zatim ćemo ispisati role u binarnom obliku koristeći LED diode koje smo konstruirali za analizator u Vodiču 5. Nakon što ovo odradimo, moći ćemo konstruirati sljedeći dio našeg cjelokupnog projekta u sljedećem vodiču.

U ovom vodiču trebat će vam:

  1. Vaša ploča za izradu prototipova
  2. Vaš valjak za kockice iz vodiča 4
  3. Vaš analizator registra iz vodiča 5
  4. Dve spojne žice
  5. Kopija kompletnog lista sa podacima (revizija 2014.):

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

  6. Kopija priručnika s uputama (revizija 2014.):

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

Evo veze do kompletne zbirke mojih vodiča za AVR asembler:

Korak 1: Kako možemo postići da dva mikrokontrolera međusobno razgovaraju?

Kako možemo postići da dva mikrokontrolera međusobno razgovaraju?
Kako možemo postići da dva mikrokontrolera međusobno razgovaraju?

Budući da počinjemo širiti naš projekt tako da se naš krajnji proizvod sastoji od zbirke manjih dijelova, trebat će nam više igala nego što jedan Atmega328P može pružiti. Stoga ćemo svaki dio cjelokupnog projekta raditi na zasebnom mikrokontroleru, a zatim ćemo ih međusobno podijeliti. Dakle, problem koji moramo riješiti je kako možemo doći do jednostavne metode da kontrolori međusobno razgovaraju i prenose podatke između njih? Pa, jedna stvar kod ovih kontrolera je da svaki izvršava 16 miliona instrukcija u sekundi. To je vrlo precizno tempirano vrijeme pa ga možemo koristiti za prijenos podataka. Ako koristimo odlaganje u milisekundama za sastavljanje podataka, onda ne moramo biti toliko precizni jer CPU izvršava 16 000 instrukcija u jednoj milisekundi. Drugim riječima, milisekunda je vječnost za CPU. Pa pokušajmo s bacanjem kockica. Želim prenijeti rezultat bacanja kocke sa čipa za kockice na čip analizatora. Pretpostavimo da stojite preko puta ulice i htio sam vam signalizirati rezultat mog bacanja para kockica. Jedna stvar koju bih mogao učiniti, da oboje imamo sat, mogao bih upaliti baterijsku svjetiljku, a onda kad ste spremni za primanje mojih podataka, upalite svjetiljku i oboje pokrećemo satove. Zatim držim svjetiljku upaljenu tačan broj milisekundi dok se kockice bacaju, a zatim je isključim. Dakle, ako bih kotrljao 12, držao bih svjetlo uključeno 12 milisekundi. Sada je problem sa gore navedenim što za vas i mene ne postoji način na koji bismo mogli mjeriti stvari dovoljno precizno da razlikujemo između 5 milisekundi i 12 milisekundi. Ali šta je sa ovim: Pretpostavimo da smo odlučili da ću upaliti svjetlo jednu godinu za svaki broj na kocki? Onda, ako bacim 12, obasjavao bih vas 12 godina i mislim da ćete se složiti da ne postoji mogućnost da ćete pogriješiti u utvrđivanju broja, zar ne? Mogli biste napraviti pauzu i otići igrati bejzbol, čak ste mogli otići igrati sranja u Vegasu šest mjeseci, sve dok u nekom trenutku tokom godine ne biste pogledali da li svijetli svjetlo, nećete propustiti brojanje. Pa upravo to radimo za mikrokontrolere! Jedna milisekunda za CPU traje godinu dana. Dakle, ako uključim signal na 12 milisekundi, gotovo da nema šanse da ga drugi mikrokontroler zbuni za 10 ili 11 bez obzira na prekide i što se u međuvremenu ne dogodi. Za mikrokontrolere, milisekunda je vječnost. Evo šta ćemo učiniti. Prvo ćemo izabrati dva porta na kontroleru koji će biti naši komunikacijski portovi. Koristit ću PD6 za primanje podataka (mogli bismo ga nazvati Rx ako želimo) i odabrat ću PD7 za prijenos podataka (mogli bismo ga nazvati Tx ako želimo). Čip analizatora će povremeno provjeravati svoj Rx pin i ako vidi signal preći će na "komunikacijsku potprogram", a zatim prenijeti povratni signal valjku za kockice govoreći da je spreman za prijem. Oboje će započeti mjerenje vremena i valjak za kockice će prenijeti signal (tj. 5V) za milisekundu po broju na kockici. Dakle, ako je bacanje dvostrukih šestica ili 12, tada bi valjak za kockice postavio PD7 na 5V za 12 milisekundi, a zatim bi ga vratio na 0V. Analizator će provjeravati svoj PD6 pin svake milisekunde, računajući svaki put, a kad se vrati na 0V, tada će rezultat prikazati na ekranu analizatora, prikazujući dvanaest binarnih na LED -ovima. Dakle, to je plan. Da vidimo možemo li to implementirati.

Korak 2: Komunikacijske potprograme

Prvo što trebamo učiniti je spojiti dva kontrolera. Zato uzmite žicu s PD6 na jednoj i spojite je na PD7 na drugoj, i obrnuto. Zatim ih inicijalizirajte postavljanjem PD7 na OUTPUT na oba i PD6 na INPUT na oba. Na kraju ih sve postavite na 0V. Konkretno, u odjeljak Init ili Reset koda na svakom mikrokontroleru dodajte sljedeće:

sbi DDRD, 7; PD7 postavljen na izlaz

cbi PortD, 7; PD7 u početku 0V cbi DDRD, 6; PD6 postavljen na ulaz cbi PortD, 6; PD6 početno 0V clr ukupno; ukupno na kockicama u početku 0

Sada postavimo komunikacijsku potprogram na čipu za kockice. Prvo definirajte novu varijablu na vrhu zvanu "ukupno" koja će pohraniti ukupan broj bačenih na par kockica i inicijalizirati je na nulu.

Zatim napišite potprogram za komunikaciju s analizatorom:

komunicirati:

cbi PortD, 7 sbi PortD, 7; Pošaljite signal spremnosti za čekanje: sbic PinD, 6; čitati PinD i preskočiti ako 0V rjmp čeka kašnjenje 8; kašnjenje za sinhronizaciju (pronađeno ovo eksperimentalno) slanje: dec ukupno kašnjenje 2; kašnjenje za svaki broj umiranja cpi ukupno, 0; 0 ovdje znači da je "ukupan" broj kašnjenja poslan breq PC+2 rjmp pošalji cbi PortD, 7; PD7 do 0V clr ukupno; resetiranje kockica ukupno na 0 ret

U analizatoru dodajemo rcall iz glavne rutine u potprogram komunikacije:

clr analizator; pripremite se za novi broj

sbic PinD, 6; proverite da li PD6 ima signal 5V rcall call; ako 5V ide na komunikaciju mov analizatora, ukupno; izlaz na prikaz analizatora rcall analizator

a zatim napišite komunikacijsku potprogram na sljedeći način:

komunicirati:

clr ukupno; resetirajte ukupno na 0 kašnjenje 10; odgoditi da se riješite odskoka sbi PortD, 7; postavite PB7 na 5V za signal spremnosti za prijem: kašnjenje 2; sačekajte sledeći broj uključujući ukupno; prirast ukupno sbic PinD, 6; ako se PD6 vrati na 0V, rjmp prijem je gotov; u suprotnom petlja za više podataka cbi PortD, 7; resetirajte PD7 kada završite ret

Eto ti! Sada je svaki mikrokontroler postavljen za priopćavanje rezultata bacanja kockica, a zatim ga prikazuje na analizatoru.

Implementirat ćemo mnogo učinkovitiji način komunikacije kasnije kada budemo trebali prenijeti sadržaj registra između kontrolora umjesto samo bacanja kockica. U tom slučaju, i dalje ćemo koristiti samo dvije žice koje ih povezuju, ali ćemo koristiti 1, 1 za značenje "započeti prijenos"; 0, 1 znači "1"; 1, 0 znači "0"; i na kraju 0, 0 znači "krajnji prijenos".

Vježba 1: Pogledajte možete li primijeniti bolju metodu i upotrijebiti je za prijenos bacanja kockica kao 8-bitnog binarnog broja.

Priložiću video koji prikazuje moj rad.

Korak 3: Zaključak

Zaključak
Zaključak

Priložio sam kompletan kôd za vašu referencu. Nije tako čisto i uredno koliko bih želio, ali ja ću ga očistiti kako ga širimo u budućim vodičima.

Od sada ću samo priložiti datoteke koje sadrže kôd, a ne sve upisivati ovdje. Samo ćemo otkucati odjeljke o kojima smo zainteresirani za raspravu.

Ovo je bio kratki vodič u kojem smo došli do jednostavne metode da našem mikrokontroleru za analizu kažemo koji je rezultat našeg bacanja kockica iz našeg mikrokontrolera za kockice, koristeći samo dva priključka.

Vježba 2: Umjesto da koristite signal spremnosti za pokazivanje kada je valjak za kockice spreman za prijenos, a drugi za analizator kada je spreman za prijem, upotrijebite "vanjski prekid" koji se naziva "Prekid prekida izmjene". Igle na atmega328p se mogu koristiti na ovaj način, pa zato pored njih u dijagramu pinout imaju PCINT0 preko PCINT23. Ovo možete implementirati kao prekid na sličan način kao što smo to učinili s prekidom prelijevanja timera. U ovom slučaju "rukovatelj prekida" bit će potprogram koji komunicira s valjkom za kockice. Na ovaj način ne morate zapravo pozivati komunikacijsku potprogram s main: ona će otići tamo svaki put kad dođe do prekida koji dolazi zbog promjene stanja na tom pinu.

Vježba 3: Mnogo bolji način komuniciranja i prijenosa podataka između jednog mikrokontrolera u zbirku drugih je korištenje ugrađenog 2-žičnog serijskog sučelja na samom mikrokontroleru. Pokušajte pročitati 22. odjeljak podatkovne tablice i vidjeti možete li shvatiti kako to primijeniti.

Ove sofisticiranije tehnike koristit ćemo u budućnosti kada dodamo nove kontrolere.

Činjenica da smo sve što smo učinili s našim analizatorom uzeli ukupan iznos kockica i zatim ih isprintali u binarnom obliku pomoću LED dioda nije ono što je važno. Činjenica je da sada naš analizator "zna" šta je bacanje kockica i može ga koristiti u skladu s tim.

U sljedećem vodiču promijenit ćemo namjenu našeg "analizatora", uvesti još nekoliko elemenata kola i koristiti bacanje kockica na zanimljiviji način.

Do sljedećeg puta…

Preporučuje se: