Sadržaj:
- Korak 1: Kako možemo natjerati dva mikrokontrolera da međusobno razgovaraju?
- Korak 2: Komunikacijske potprograme
- Korak 3: Zaključak
Video: AVR asemblerski vodič 6: 3 koraka
2024 Autor: John Day | [email protected]. Zadnja promjena: 2024-01-30 09:31
Dobro došli u Tutorial 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 Tutorijala 4 i Analyzer registra iz Tutorijala 5, spojiti ih zajedno i koristiti našu metodu za prijenos 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 radimo, moći ćemo izgraditi sljedeći dio našeg cjelokupnog projekta u sljedećem vodiču.
U ovom vodiču trebat će vam:
- Vaša ploča za izradu prototipova
- Vaš valjak za kockice iz vodiča 4
- Vaš analizator registra iz vodiča 5
- Dvije spojne žice
-
Kopija cjelovitog podatkovnog lista (revizija 2014.):
www.atmel.com/images/Atmel-8271-8-bit-AVR-M…
-
Kopija priručnika s uputama (revizija 2014.):
www.atmel.com/images/atmel-0856-avr-instruc…
Evo veze do cijele zbirke mojih vodiča za AVR asembler:
Korak 1: Kako možemo natjerati dva mikrokontrolera da međusobno razgovaraju?
Budući da počinjemo širiti naš projekt tako da se naš jedinstveni krajnji proizvod sastoji od zbirke manjih dijelova, trebat će nam više pinova 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 milijuna instrukcija u sekundi. To je vrlo točno određeno vrijeme pa ga možemo koristiti za prijenos podataka. Ako koristimo odgode 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 probajmo s kockicama. Želim prenijeti rezultat bacanja kocke s č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 svjetiljku, a onda kad ste spremni primiti moje podatke, uključite svjetiljku i oboje pokrećemo satove. Zatim držim svjetiljku upaljenom točan broj milisekundi dok se kockice bacaju, a zatim je isključim. Dakle, ako bih kotrljao 12, svjetlo bih držao uključeno 12 milisekundi. Sada je problem s gore navedenim što za vas i mene ne postoji način na koji bismo mogli mjeriti stvari dovoljno točno da razlikujemo između 5 milisekundi i 12 milisekundi. Ali što je s 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 Vegas na 6 mjeseci, sve dok u nekom trenutku tijekom godine ne biste pogledali je li svjetlo upaljeno, nećete propustiti brojanje. Pa upravo to radimo za mikrokontrolere! Jedna milisekunda za CPU je kao godina. Dakle, ako uključim signal na 12 milisekundi, nema gotovo nikakve šanse da ga drugi mikrokontroler zbuni 10 ili 11 bez obzira na prekide i što se u međuvremenu ne dogodi. Za mikrokontrolere, milisekunda je vječnost. Evo što ć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 povremeno će provjeravati svoj Rx pin i ako vidi signal preći će u "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 kocki. Dakle, ako je bacanje bilo 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 dobiveni broj emitira na zaslon analizatora, prikazujući dvanaest binarno na LED -ima. Dakle, to je plan. Da vidimo možemo li to provesti.
Korak 2: Komunikacijske potprograme
Prvo što moramo 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 u početku 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; pročitati PinD i preskočiti ako 0V rjmp čeka kašnjenje 8; kašnjenje za sinkronizaciju (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 poslano "ukupno" kašnjenje broja breq PC+2 rjmp šalje cbi PortD, 7; PD7 do 0V clr ukupno; resetirati kockice ukupno na 0 ret
U analizatoru dodajemo rcall iz glavne rutine u potprogram komunikacije:
clr analizator; pripremite se za novi broj
sbic PinD, 6; provjerite PD6 za signal 5V rcall komunikacije; ako 5V ide na komunikaciju mov analizatora, ukupno; izlaz na prikaz analizatora rcall analizator
a zatim napišite podprogram komunikacije na sljedeći način:
komunicirati:
clr ukupno; poništi ukupno na 0 kašnjenje 10; kašnjenje kako biste se riješili odskoka sbi PortD, 7; postavite PB7 na 5V za signal spremnosti za prijem: kašnjenje 2; pričekajte sljedeći broj uključujući ukupno; prirast ukupno sbic PinD, 6; ako se PD6 vrati na 0V, rjmp prijem je gotov; u suprotnom napravite sigurnosnu kopiju za više podataka cbi PortD, 7; resetiranje PD7 kad se dovrši ret
Izvoli! Sada je svaki mikrokontroler postavljen za priopćavanje rezultata bacanja kockica, a zatim ga prikazuje na analizatoru.
Kasnije ćemo implementirati mnogo učinkovitiji način komunikacije 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 implementirati bolju metodu i upotrijebiti je za prijenos bacanja kockica kao 8-bitnog binarnog broja.
Priložit ću video koji prikazuje moj rad.
Korak 3: Zaključak
Priložio sam cijeli 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 smislili jednostavnu metodu da našem mikrokontroleru za analizu kažemo koji je rezultat našeg bacanja kockica iz našeg mikrokontrolera s kockicama, koristeći samo dva priključka.
Vježba 2: Umjesto da upotrijebite signal spremnosti za pokazivanje kada je valjak za kockice spreman za prijenos, a drugi za analizator kada je spreman za primanje, upotrijebite "vanjski prekid" koji se naziva "Prekid izmjene pina". Igle na atmega328p mogu se koristiti na ovaj način, pa zato pored njih u dijagramu iscrtavanja imaju PCINT0 preko PCINT23. To 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: Puno 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 daljnje kontrolere.
Činjenica da smo sve što smo učinili s našim analizatorom uzeli ukupan iznos kockica i zatim ih ispisali u binarnom obliku pomoću LED dioda nije ono što je važno. Činjenica je da sada naš analizator "zna" što 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čeni:
AVR asemblerski vodič 2: 4 koraka
AVR Assembler Tutorial 2: Ovaj vodič je nastavak " AVR Assembler Tutorial 1 " Ako niste prošli Tutorial 1, trebali biste odmah prestati i prvo to učiniti. U ovom tutorialu nastavit ćemo proučavanje programiranja asemblerskog jezika atmega328p u
AVR asemblerski vodič 1: 5 koraka
AVR Assembler Vodič 1: Odlučio sam napisati niz vodiča o tome kako napisati programe na asemblerskom jeziku za Atmega328p koji je mikrokontroler koji se koristi u Arduinu. Ako ljudi ostanu zainteresirani, nastavit ću s izlaganjem otprilike tjedno dok mi ne ponestane
AVR asemblerski vodič 8: 4 koraka
AVR Assembler Vodič 8: Dobro došli u Vodič 8! U ovom kratkom vodiču ćemo se malo udaljiti od uvođenja novih aspekata programiranja asemblerskog jezika kako bismo pokazali kako premjestiti naše komponente za izradu prototipova u zasebni "ispisani" pločica
AVR asemblerski vodič 7: 12 koraka
AVR Assembler Tutorial 7: Dobro došli u Tutorial 7! Danas ćemo prvo pokazati kako očistiti tipkovnicu, a zatim ćemo pokazati kako koristiti analogne ulazne portove za komunikaciju s tipkovnicom. To ćemo učiniti pomoću prekida i jedne žice kao ulazni. Ožičit ćemo tipkovnicu tako da
AVR asemblerski vodič 9: 7 koraka
AVR Assembler Tutorial 9: Dobro došli u Tutorial 9. Danas ćemo pokazati kako upravljati i 7-segmentnim zaslonom i 4-znamenkastim zaslonom koristeći naš kod za montažni jezik ATmega328P i AVR. Tijekom toga ćemo morati skrenuti pažnju na to kako koristiti stog