Sisukord:

AVR Assembleri õpetus 6: 3 sammu
AVR Assembleri õpetus 6: 3 sammu

Video: AVR Assembleri õpetus 6: 3 sammu

Video: AVR Assembleri õpetus 6: 3 sammu
Video: AVR 6# Переменные и арифметика 2024, Juuli
Anonim
AVR Assembleri õpetus 6
AVR Assembleri õpetus 6

Tere tulemast juhendisse 6!

Tänane õpetus on lühike, kus töötame välja lihtsa meetodi andmete edastamiseks ühe atmega328p ja teise vahel, kasutades kahte neid ühendavat porti. Seejärel võtame täringurulli juhendist 4 ja registreerimisanalüsaatori juhendist 5, ühendame need kokku ja kasutame oma meetodit, et edastada täringurullide tulemus rullilt analüsaatorile. Seejärel trükime rulli binaarselt välja, kasutades juhendis 5 analüsaatori jaoks konstrueeritud LED -e. Kui oleme selle töö lõpetanud, saame järgmises õpetuses koostada oma üldprojekti järgmise osa.

Selles õpetuses vajate:

  1. Teie prototüüpimislaud
  2. Teie täringurull juhendist 4
  3. Teie registreerimisanalüsaator õpetusest 5
  4. Kaks ühendusjuhet
  5. Täieliku andmelehe koopia (2014. aasta versioon):

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

  6. Kasutusjuhendi koopia (2014. aasta versioon):

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

Siin on link minu AVR-i komplekteerija õpetuste kogu kogumikule:

Samm: kuidas me saame kaks mikrokontrollerit omavahel rääkida?

Kuidas panna kaks mikrokontrollerit omavahel rääkima?
Kuidas panna kaks mikrokontrollerit omavahel rääkima?

Kuna hakkame oma projekti laiendama nii, et meie üks lõpptoode koosneb väiksemate osade kogumist, vajame rohkem tihvte, kui üks Atmega328P suudab pakkuda. Seetõttu teeme kogu projekti iga osa eraldi mikrokontrolleril ja laseme neil seejärel omavahel andmeid jagada. Nii et probleem, mille peame lahendama, on see, kuidas saaksime välja töötada lihtsa meetodi, mille abil kontrollerid saaksid omavahel rääkida ja omavahel andmeid edastada? Üks asi nende kontrollerite puhul on see, et nad täidavad igaüks 16 miljonit käsku sekundis. See on väga täpselt ajastatud ja seega saame seda ajastust kasutada andmete edastamiseks. Kui kasutame andmete moodustamiseks millisekundilisi viivitusi, ei pea me tegelikult olema nii täpsed, kuna protsessor täidab ühe millisekundi jooksul 16 000 käsku. Teisisõnu, millisekund on protsessori jaoks igavik. Nii et proovime seda täringurullidega. Soovin täringurullimise tulemuse edastada täringurulli kiibilt analüsaatori kiibile. Oletame, et sa seisid teisel pool tänavat ja ma tahtsin sulle märku anda täringupaari tulemusest. Üks asi, mida ma saaksin teha, kui meil mõlemal oleks kell, saaksin taskulambi sisse lülitada, siis kui olete valmis minu andmeid vastu võtma, lülitate oma taskulambi sisse ja käivitame mõlemad kellad. Seejärel hoian täringut veeretades taskulampi täpselt millisekundite jooksul ja lülitan selle seejärel välja. Nii et kui ma veereksin 12, hoiaksin oma valgust 12 millisekundit. Nüüd on ülaltoodud probleem see, et teie ja minu jaoks ei ole võimalik kuidagi ajastada asju piisavalt täpselt, et teha vahet 5 millisekundi ja 12 vahel millisekundit. Aga mis sellest: Oletame, et otsustasime, et hoian oma valgust iga täringut sisaldava numbri eest ühe aasta? Siis kui ma veeretan 12 -d, valgustaksin teile 12 aastat valgust ja ma arvan, et nõustute, et pole mingit võimalust, et teete vea, kui arvate õige välja? Võiksite teha pausi ja minna pesapalli mängima, võite isegi 6 kuud Vegases craps’i mängida, kui aasta jooksul mingil hetkel heidate pilgu üle tänava, et näha, kas tuli põleb, siis ei jääks loendamata. See on täpselt see, mida me mikrokontrollerite jaoks teeme! Üks millisekund protsessori jaoks on nagu aasta. Nii et kui ma lülitan signaali sisse 12 millisekundiks, pole peaaegu mingit võimalust, et teine mikrokontroller ajab selle 10 või 11 segadusse, olenemata sellest, mis vahepeal katkestab ja mis ei juhtu. Mikrokontrollerite jaoks on millisekund igavik. Nii et siin on see, mida me teeme. Esiteks valime kontrolleri kaks pordi oma sidepordiks. Kasutan andmete vastuvõtmiseks PD6 -d (me võiksime seda nimetada Rx -ks, kui meile meeldib) ja andmete edastamiseks valin PD7 (võime seda nimetada Tx -ks). Analüsaatori kiip kontrollib perioodiliselt selle Rx -tihvti ja kui ta näeb signaali, langeb see "kommunikatsiooni alamprogrammile" ja edastab seejärel täringurullile tagasiside, öeldes, et see on vastuvõtmiseks valmis. Mõlemad alustavad ajastamist ja täringurull edastab signaali (st 5 V) millisekundi kohta täringul oleva numbri kohta. Nii et kui rull oleks kahekordne või 12, siis täringurull määraks PD7 väärtuseks 5 V 12 millisekundiks ja seejärel 0 V tagasi. Analüsaator kontrollib oma PD6 tihvti iga millisekundi järel, lugedes iga kord, ja kui see läheb tagasi 0 V -le, väljastab see saadud arvu analüsaatori ekraanile, näidates LED -idel kaheteistkümnendikku. Nii on see plaan. Vaatame, kas suudame seda rakendada.

2. samm: kommunikatsiooni alamprogrammid

Esimene asi, mida peame tegema, on ühendada kaks kontrollerit. Nii et võtke ühelt juhtmest PD6 ja ühendage see teisega PD7-ga ja vastupidi. Seejärel lähtestage need, määrates mõlema PD7 väärtuseks OUTPUT ja väljundiks PD6 INPUT. Lõpuks seadke kõik 0V -le. Täpsemalt lisage iga mikrokontrolleri koodi jaotisse Init või Reset järgmine:

sbi DDRD, 7; PD7 on seatud väljundisse

cbi PortD, 7; PD7 esialgu 0V cbi DDRD, 6; PD6 seatud sisendisse cbi PortD, 6; PD6 esialgu kokku 0V clr; kokku täringutel esialgu 0

Nüüd seadistame täringurullide kiibile side alamprogrammi. Esmalt määrake ülaosas uus muutuja nimega "kokku", mis salvestab täringupaarile veeretatud koguarvu ja lähtestab selle nulliks.

Seejärel kirjutage analüsaatoriga suhtlemiseks alamprogramm:

suhelda:

cbi PortD, 7 sbi PortD, 7; Saada valmis signaal ootama: sbic PinD, 6; lugege PinD ja jätke vahele, kui 0V rjmp ooteaeg 8; viivitus sünkroonimiseks (leitud eksperimentaalselt) send: dec total delay 2; viivitus iga matši loendamise kohta cpi kokku, 0; 0 tähendab siin, et arvude viivitused on saadetud breq PC+2 rjmp send cbi PortD, 7; PD7 kuni 0V clr kokku; täringute lähtestamine kokku 0 ret

Analüsaatoris lisame suhtlusalamprogrammile põhirutiinist rcall:

clr analüsaator; valmistuge uueks numbriks

sbic PinD, 6; kontrollige PD6 5V signaali rcall side; kui 5V läheb suhtlema mov analüsaatoriga, kokku; väljund analüsaatori kuvale rcall analüsaator

ja seejärel kirjutage suhtlemise alamprogramm järgmiselt:

suhelda:

clr kokku; nullida kokku 0 viivitusele 10; viivitus põrgetest vabanemiseks sbi PortD, 7; seadistage PB7 väärtusele 5V, et signaalida valmisolekut: viivitus 2; oodake järgmist numbrit, kokku; juurdekasv kokku sbic PinD, 6; kui PD6 läheb tagasi 0V -le, oleme rjmp -vastuvõtmise lõpetanud; muidu looge varundamiseks rohkem andmeid cbi PortD, 7; lähtestades PD7 uuesti

Palun! Nüüd on iga mikrokontroller seadistatud täringuviske tulemuse edastamiseks ja seejärel analüsaatorile kuvamiseks.

Hiljem rakendame palju tõhusamat suhtlusviisi, kui meil on vaja täringuviske asemel registri sisu kontrollerite vahel üle kanda. Sellisel juhul kasutame endiselt ainult kahte neid ühendavat juhtmestikku, kuid tähistame 1, 1, et tähendada "edastuse alustamist"; 0, 1 tähendab "1"; 1, 0 tähendab "0"; ja lõpuks 0, 0 tähendab "lõppülekanne".

Harjutus 1: vaadake, kas saate rakendada paremat meetodit ja kasutada seda täringuviske 8-bitise kahendarvuna ülekandmiseks.

Lisan video, mis näitab minu tööd.

3. samm: järeldus

Järeldus
Järeldus

Lisasin teile viitamiseks täieliku koodi. See ei ole nii puhas ja korras, nagu ma tahaksin, kuid ma puhastan selle, kui laiendame seda tulevastes õpetustes.

Nüüdsest lisan koodiga failid, mitte ei kirjuta seda siia. Kirjutame lihtsalt välja jaotised, millest oleme huvitatud.

See oli lühike õpetus, kus me pakkusime välja lihtsa meetodi, kuidas oma analüsaatori mikrokontrollerile öelda, mis on meie täringurullide mikrokontrolleri täringuviske tulemus, kasutades ainult kahte porti.

Harjutus 2: selle asemel, et kasutada valmis signaali, et näidata, millal täringurull on saatmiseks valmis, ja teist, kui analüsaator on vastuvõtmiseks valmis, kasutage välist katkestust, mida nimetatakse "tihvtide vahetamise katkestuseks". Atmega328p tihvte saab kasutada sel viisil, mistõttu on nende pinoutdiagrammis PCINT0 ja PCINT23. Saate selle katkestusena rakendada sarnasel viisil nagu me tegime taimerite ülevoolu katkestusega. Sel juhul on katkestamise "käitleja" alamprogramm, mis suhtleb täringurulliga. Sel moel ei pea te tegelikult põhivõrgust kommunikatsioonide alamprogrammi kutsuma: see läheb sinna igal ajal, kui selle tihvti oleku muutmine katkestab.

Harjutus 3: Palju parem viis andmete edastamiseks ja edastamiseks ühe mikrokontrolleri vahel teiste kogudesse on mikrokontrolleri enda sisseehitatud 2-juhtmelise jadaliidese kasutamine. Proovige lugeda andmelehe jaotist 22 ja vaadata, kas saate aru, kuidas seda rakendada.

Kasutame neid keerukamaid tehnikaid tulevikus, kui lisame täiendavaid kontrollereid.

Asjaolu, et analüsaatoriga tegime ainult täringuviske kokku ja printisime selle seejärel LED -ide abil binaarselt välja, pole oluline. Fakt on see, et nüüd meie analüsaator "teab", mis on täringurull, ja saab seda vastavalt kasutada.

Järgmises õpetuses muudame oma "analüsaatori" eesmärki, tutvustame veel mõnda vooluahela elementi ja kasutame täringuviskamist huvitavamal viisil.

Järgmise korrani…

Soovitan: