Përmbajtje:
- Hapi 1: Si mund t'i bëjmë dy mikrokontrollues të flasin me njëri -tjetrin?
- Hapi 2: Nën -programet e komunikimit
- Hapi 3: Përfundimi
Video: Tutoriali i AVR Assembler 6: 3 Hapa
2024 Autor: John Day | [email protected]. E modifikuara e fundit: 2024-01-30 12:10
Mirësevini në Tutorial 6!
Udhëzimi i sotëm do të jetë i shkurtër ku do të zhvillojmë një metodë të thjeshtë për të komunikuar të dhëna midis një atmega328p dhe një tjetri duke përdorur dy porte që i lidhin ato. Ne pastaj do të marrim rrotullimin e zareve nga Tutorial 4 dhe Analizuesi i Regjistrit nga Tutorial 5, do t'i lidhim ato së bashku dhe do të përdorim metodën tonë për të komunikuar rezultatin e rrotullave të zareve nga rrotulla në analizues. Ne pastaj do të printojmë rrotullën në binar duke përdorur LED -të që kemi ndërtuar për analizuesin në Tutorial 5. Pasi ta kemi këtë punë, ne do të jemi në gjendje të ndërtojmë pjesën tjetër të projektit tonë të përgjithshëm në tutorialin tjetër.
Në këtë tutorial do t'ju duhet:
- Tabela juaj e prototipit
- Rrolli juaj i zareve nga Tutorial 4
- Analizuesi juaj i Regjistrimit nga Tutorial 5
- Dy tela lidhës
-
Një kopje e Fletës së të Dhënave të Plota (rishikim 2014):
www.atmel.com/images/Atmel-8271-8-bit-AVR-M…
-
Një kopje e Manualit të Setit të Udhëzimeve (rishikim 2014):
www.atmel.com/images/atmel-0856-avr-instruc…
Këtu keni një lidhje me koleksionin e plotë të mësimeve të mia të montuesit AVR:
Hapi 1: Si mund t'i bëjmë dy mikrokontrollues të flasin me njëri -tjetrin?
Meqenëse ne kemi filluar të zgjerojmë projektin tonë në mënyrë që produkti ynë i vetëm përfundimtar të përbëhet nga një koleksion i pjesëve më të vogla, ne do të kemi nevojë për më shumë kunja sesa mund të sigurojë një Atmega328P. Prandaj, ne do të bëjmë secilën pjesë të projektit të përgjithshëm në një mikrokontrollues të veçantë dhe pastaj do t'i bëjmë ata të ndajnë të dhënat midis tyre. Pra, problemi që duhet të zgjidhim është se si mund të dalim me një metodë të thjeshtë që kontrolluesit të flasin me njëri -tjetrin dhe të transferojnë të dhëna mes tyre? Epo, një gjë për këta kontrollues është se secili prej tyre ekzekuton 16 milionë udhëzime në sekondë. Kjo është shumë e saktë dhe kështu ne mund ta përdorim atë për të transferuar të dhëna. Nëse përdorim vonesa në milisekonda për të krijuar të dhënat, atëherë nuk duhet të jemi aq të saktë pasi CPU po ekzekuton 16,000 udhëzime në një milisekond të vetëm. Me fjalë të tjera, një milisekond është një përjetësi për CPU. Pra, le ta provojmë me rrotullat e zareve. Unë dua të transmetoj rezultatin e një hedhje zare nga çipi i zarfit në çipin e analizuesit. Supozoni se keni qenë duke qëndruar përballë rrugës dhe unë doja t'ju sinjalizoja rezultatin e hedhjes sime të një palë zare. Një gjë që mund të bëja, nëse të dy do të kishim një orë, është se mund të ndez një elektrik dore, atëherë kur të jeni gati për të marrë të dhënat e mia, ndizni elektrikun tuaj elektrik dhe ne të dy fillojmë orët tona. Pastaj e mbaj elektrik dore ndezur për numrin e saktë të milisekondave ndërsa zaret hidhen dhe pastaj e fik. Pra, nëse do të rrokullisja një 12, do ta mbaja dritën time të ndezur për 12 milisekonda. Tani problemi me sa më sipër është se, për ju dhe mua, nuk ka asnjë mënyrë që ne të jemi në gjendje t'i përcaktojmë gjërat me saktësi të mjaftueshme për të bërë dallimin midis 5 milisekonda dhe 12 milisekonda Por çfarë ndodh me këtë: Supozoni se kemi vendosur që unë do ta mbaja dritën time për një vit për çdo numër në zare? Atëherë nëse rrotulloj një 12 do të ndriçoja dritën te ju për 12 vjet dhe mendoj se do të pajtoheni se nuk ka mundësi që të bëni një gabim në zbulimin e numrit apo jo? Ju mund të bëni një pushim dhe të shkoni të luani bejsboll, madje mund të shkoni të luani craps në Vegas për 6 muaj, për aq kohë sa në një moment të vitit të shikoni nëpër rrugë për të parë nëse drita ishte ndezur nuk do të humbisni një numërim. Epo kjo është pikërisht ajo që ne po bëjmë për mikrokontrolluesit! Një milisekond i vetëm për CPU -në është si një vit. Pra, nëse ndez sinjalin për 12 milisekonda nuk ka pothuajse asnjë shans që mikrokontrolluesi tjetër ta ngatërrojë atë për 10 ose 11 pa marrë parasysh se çfarë ndërpret dhe çfarë nuk ndodh ndërkohë. Për mikrokontrolluesit, një milisekond është një përjetësi. Pra, këtu është ajo që ne do të bëjmë. Së pari ne do të zgjedhim dy porte në kontrollues që të jenë portet tona të komunikimit. Unë do të përdor PD6 për marrjen e të dhënave (mund ta quajmë Rx nëse na pëlqen) dhe do të zgjedh PD7 për transmetimin e të dhënave (mund ta quajmë Tx nëse na pëlqen). Çipi i analizuesit do të kontrollojë periodikisht pinin e tij Rx dhe nëse sheh një sinjal do të bjerë në një "nënrutinë komunikimi" dhe më pas do të transmetojë një sinjal kthimi në rrotullën e zareve duke thënë se është gati për t'u marrë. Ata të dy do të fillojnë kohën dhe rrotulluesi i zareve do të transmetojë një sinjal (dmth. 5V) për një milisekond për numër në zare. Pra, nëse rrotullimi ishte gjashtëfish i dyfishtë, ose një 12, atëherë rrotulluesi i zareve do ta vendoste PD7 në 5V për 12 milisekonda dhe pastaj do ta kthente atë në 0V. Analizuesi do të kontrollojë kunjin e tij PD6 çdo milisekonda, duke numëruar çdo herë, dhe kur të kthehet në 0V, atëherë nxjerr numrin që rezulton në ekranin e analizuesit, duke treguar një dymbëdhjetë në binar në LED -të. Pra, ky është plani. Le të shohim nëse mund ta zbatojmë.
Hapi 2: Nën -programet e komunikimit
Gjëja e parë që duhet të bëjmë është të lidhim dy kontrolluesit. Pra, merrni një tel nga PD6 në njërën dhe lidheni atë me PD7 nga ana tjetër, dhe anasjelltas. Pastaj fillojini ato duke vendosur PD7 në OUTPUT në të dyja dhe PD6 në INPUT në të dyja. Më në fund vendosini të gjitha në 0V. Në mënyrë të veçantë, shtoni sa vijon në seksionin Init ose Reset të kodit në secilin mikrokontrollues:
sbi DDRD, 7; PD7 është vendosur në dalje
cbi PortD, 7; PD7 fillimisht 0V cbi DDRD, 6; PD6 e vendosur në hyrje cbi PortD, 6; PD6 fillimisht 0V clr gjithsej; gjithsej në zare fillimisht 0
Tani le të vendosim nënrutinën e komunikimit në çipin me zare. Së pari përcaktoni një ndryshore të re në krye të quajtur "total" e cila do të ruajë numrin e përgjithshëm të hedhur në çiftin e zareve dhe do ta inicojë atë në zero.
Pastaj shkruani një nënrutinë për të komunikuar me analizuesin:
komunikoj:
cbi PortD, 7 sbi PortD, 7; Dërgo pritje sinjali gati: sbic PinD, 6; lexoni PinD dhe kaloni nëse vonesa e pritjes 0V rjmp 8; vonesa për të sinkronizuar (e gjeti këtë në mënyrë eksperimentale) dërgoni: dek vonesë totale 2; vonesë për secilën numër të vdesjeve cpi total, 0; 0 këtu do të thotë se janë dërguar vonesa të numrit "total" breq PC+2 rjmp send cbi PortD, 7; PD7 deri në 0V clr gjithsej; rivendosni totalin e zareve në 0 ret
Në analizues shtojmë një thirrje nga rutina kryesore në nënrutinën e komunikimit:
analizues clr; përgatituni për numrin e ri
sbic PinD, 6; kontrolloni PD6 për një sinjal 5V r thirrni thirrjen; nëse 5V shkojnë për të komunikuar analizuesin e lëvizjes, gjithsej; dalja në analizues rcall analyzer
dhe pastaj shkruani nën -programin e komunikimit si më poshtë:
komunikoj:
clr gjithsej; rivendos totalin në 0 vonesë 10; vonesë për të hequr qafe kërcimet sbi PortD, 7; vendosni PB7 në 5V për të marrë sinjal të gatshëm: vonesë 2; prisni për numrin tjetër gjithsej; rritja totale e sbic PinD, 6; nëse PD6 kthehet në 0V ne kemi mbaruar marrjen rjmp; përndryshe bëni një kopje rezervë për më shumë të dhëna cbi PortD, 7; rivendos PD7 kur të bëhet ret
Ja ku shkoni! Tani secili mikrokontrollues është krijuar për të komunikuar rezultatin e hedhjes së zareve dhe më pas ta shfaqë atë në analizues.
Ne do të zbatojmë një mënyrë shumë më efikase të komunikimit më vonë kur të kemi nevojë për të transferuar përmbajtjen e një regjistri midis kontrolluesve në vend të vetëm një zare. Në atë rast, ne ende do të përdorim vetëm dy tela që i lidhin ato, por ne do të përdorim 1, 1 që do të thotë "fillimi i transmetimit"; 0, 1 do të thotë "1"; 1, 0 do të thotë "0"; dhe në fund 0, 0 do të thotë "përfundimi i transmetimit".
Ushtrimi 1: Shihni nëse mund të zbatoni metodën më të mirë dhe ta përdorni për të transferuar zarin si një numër binar 8-bit.
Unë do të bashkëngjit një video e cila tregon timen në punë.
Hapi 3: Përfundimi
Unë kam bashkangjitur kodin e plotë për referencën tuaj. Nuk është aq i pastër dhe i rregullt sa do të doja, por do ta pastroj ndërsa e zgjerojmë në mësimet e ardhshme.
Tani e tutje unë thjesht do t'i bashkëngjit skedarët që përmbajnë kod në vend që t'i shtyp të gjitha këtu. Ne thjesht do të shkruajmë pjesët që ne jemi të interesuar të diskutojmë.
Ky ishte një mësim i shkurtër ku dolëm me një metodë të thjeshtë për t'i treguar mikrokontrolluesit të analizuesit sonë se cili ishte rezultati i hedhjes së zareve nga mikrokontrolluesi ynë i rrotullimit të zareve, ndërsa përdorim vetëm dy porte.
Ushtrimi 2: Në vend që të përdorni një sinjal të gatshëm për të treguar kur rrotulluesi i zareve është gati për të transmetuar dhe një tjetër kur analizuesi është gati për të marrë, përdorni një "ndërprerje të jashtme" të quajtur "Ndërprerja e ndryshimit të kunjave". Kunjat në atmega328p mund të përdoren në këtë mënyrë, kjo është arsyeja pse ata kanë PCINT0 përmes PCINT23 pranë tyre në diagramin pinout. Ju mund ta zbatoni këtë si një ndërprerje në një mënyrë të ngjashme siç bëmë me ndërprerjen e tejkalimit të kohëmatësit. Në këtë rast "mbajtësi" i ndërprerjes do të jetë nënrutina që komunikon me rrotulluesin e zareve. Në këtë mënyrë ju nuk keni nevojë të thërrisni nën -programin e komunikimit nga kryesore: do të shkojë atje sa herë që ka një ndërprerje që vjen nga një ndryshim i gjendjes në atë kunj.
Ushtrimi 3: Një mënyrë shumë më e mirë për të komunikuar dhe transferuar të dhëna midis një mikrokontrolluesi në një koleksion të të tjerëve është përdorimi i ndërfaqes seriale të integruar me 2 tela në vetë mikrokontrolluesin. Mundohuni të lexoni seksionin 22 të fletës së të dhënave dhe shikoni nëse mund të kuptoni se si ta zbatoni atë.
Ne do t'i përdorim këto teknika më të sofistikuara në të ardhmen kur të shtojmë kontrollues të tjerë.
Fakti që gjithçka që bëmë me analizuesin tonë është të marrim totalin e zarfit dhe pastaj ta printojmë në binar duke përdorur LEDs nuk është ajo që është e rëndësishme. Fakti është se tani analizuesi ynë "e di" se çfarë është zarfi dhe mund ta përdorë atë në përputhje me rrethanat.
Në tutorialin tjetër ne do të ndryshojmë qëllimin e "analizuesit" tonë, duke prezantuar disa elementë të tjerë të qarkut dhe duke përdorur hedhjen e zareve në një mënyrë më interesante.
Deri herën tjetër…
Recommended:
Tutoriali i AVR Assembler 2: 4 Hapa
AVR Assembler Tutorial 2: Ky tutorial është një vazhdim i " AVR Assembler Tutorial 1 " Nëse nuk e keni kaluar Tutorial 1, duhet të ndaloni tani dhe ta bëni atë së pari. Në këtë tutorial ne do të vazhdojmë studimin tonë të programimit të gjuhës së asamblesë të atmega328p u
Tutoriali i AVR Assembler 1: 5 Hapa
AVR Assembler Tutorial 1: Unë kam vendosur të shkruaj një seri mësimesh se si të shkruaj programe të gjuhës së asamblesë për Atmega328p i cili është mikrokontrolluesi i përdorur në Arduino. Nëse njerëzit mbeten të interesuar, unë do të vazhdoj të nxjerr një javë ose më shumë derisa të më mbarojë
Tutoriali i AVR Assembler 8: 4 Hapa
AVR Assembler Tutorial 8: Mirësevini në Tutorial 8! Në këtë tutorial të shkurtër ne do të marrim një devijim nga prezantimi i aspekteve të reja të programimit të gjuhës së asamblesë për të treguar se si t'i zhvendosim komponentët tanë prototipues në një të veçantë " printuar " qark bordi.
Tutoriali i AVR Assembler 7: 12 hapa
AVR Assembler Tutorial 7: Mirësevini në Tutorial 7! Sot do të tregojmë së pari se si të pastroni një tastierë, dhe më pas të tregojmë se si të përdorni portat analoge të hyrjes për të komunikuar me tastierën. Ne do ta bëjmë këtë duke përdorur ndërprerjet dhe një tel të vetëm si hyrja. Ne do ta lidhim tastierën në mënyrë që të
Tutoriali i AVR Assembler 9: 7 Hapa
AVR Assembler Tutorial 9: Mirësevini në Tutorial 9. Sot do të tregojmë se si të kontrollojmë një ekran me 7 segmente dhe një ekran me 4 shifra duke përdorur kodin tonë të gjuhës së asamblesë ATmega328P dhe AVR. Gjatë kryerjes së kësaj ne do të duhet të marrim devijime se si të përdorim pirgun