Turinys:

AVR surinkėjo pamoka 1: 5 žingsniai
AVR surinkėjo pamoka 1: 5 žingsniai

Video: AVR surinkėjo pamoka 1: 5 žingsniai

Video: AVR surinkėjo pamoka 1: 5 žingsniai
Video: Arduino pamoka Nr. 5: Spaudžiame mygtukus 2024, Liepa
Anonim
AVR surinkėjo pamoka 1
AVR surinkėjo pamoka 1

Aš nusprendžiau parašyti daugybę pamokų, kaip parašyti „Atmega328p“, kuris yra „Arduino“naudojamas mikrovaldiklis, surinkimo kalbos programas. Jei žmonės ir toliau domėsis, aš ir toliau išleisiu vieną kartą per savaitę, kol baigsis laisvas laikas arba žmonės nustos juos skaityti.

Aš naudoju „Arch linux“ir dirbu prie „atmega328p-pu“, nustatyto ant duonos lentos. Galite tai padaryti taip pat, kaip ir aš, arba tiesiog prijungti arduino prie kompiuterio ir taip dirbti su mikrovaldikliu.

Mes rašysime programas 328p, kaip ir daugelyje arduino, tačiau atkreipkite dėmesį, kad tos pačios programos ir metodai taip pat tinka bet kuriam „Atmel“mikrovaldikliui, o vėliau (jei bus susidomėjimas) dirbsime su kai kuriais kiti taip pat. Išsamią informaciją apie mikrovaldiklį rasite „Atmel“duomenų lapuose ir instrukcijų rinkinio vadove. Pridedu juos prie šio pamokymo.

Štai ko jums reikės:

1. Duonos lenta

2. „Arduino“arba tiesiog mikrovaldiklis

3. Kompiuteris, kuriame veikia „Linux“

4. „Avra“surinkėjas naudodamas „git: git clone“https://github.com/Ro5bert/avra.git arba jei naudojate „ubuntu“ar „debian“pagrįstą sistemą, tiesiog įveskite „sudo apt install avra“ir gausite ir „avr“surinkėją ir avrdude. Tačiau jei gausite naujausią versiją naudodami „github“, taip pat gausite visus būtinus įtraukimo failus, kitaip tariant, jame jau yra failai m328Pdef.inc ir tn85def.inc.

5. avrdude

Visą mano AVR surinkėjo vadovėlių rinkinį rasite čia:

1 žingsnis: sukurkite testavimo lentą

Sukurkite testavimo lentą
Sukurkite testavimo lentą

Jei norite, galite tiesiog naudoti savo arduino ir padaryti viską, kas yra šiose pamokose. Tačiau kadangi mes kalbame apie kodavimą surinkimo kalba, mūsų filosofija iš prigimties yra pašalinti visus periferalus ir tiesiogiai sąveikauti su pačiu mikrovaldikliu. Taigi ar nemanote, kad taip daryti būtų smagiau?

Tiems iš jūsų, kurie sutinka, galite ištraukti mikrovaldiklį iš savo arduino ir pradėti kurti „Breadboard Arduino“, vadovaudamiesi čia pateiktomis instrukcijomis:

Paveikslėlyje rodau savo sąranką, kurią sudaro du atskiri „Atmega328p“, esantys ant didelės duonos lentos (noriu, kad dirbdamas su kitu, galėčiau išlaikyti ankstesnę mokymo programą prijungtą ir įkrautą viename mikrovaldiklyje). Aš turiu maitinimo šaltinį taip, kad pats viršutinis bėgis būtų 9 V, o visi kiti - 5 V nuo įtampos reguliatoriaus. Aš taip pat naudoju FT232R pertraukos plokštę programuoti lustus. Aš nusipirkau juos ir pats įdėjau įkrovos įkroviklius, bet jei ką tik ištraukėte vieną iš „Arduino“, tai jau gerai.

Atminkite, kad jei bandote tai atlikti naudodami „ATtiny85“, galite tiesiog įsigyti „Sparkfun Tiny“programuotoją čia: https://www.sparkfun.com/products/11801# ir tiesiog įjunkite jį į kompiuterio USB prievadą. Pirmiausia „Attiny85“turėsite įdiegti įkrovos tvarkyklę, o paprasčiausias būdas yra tiesiog naudoti „Arduino IDE“. Tačiau turėsite spustelėti failą ir nuostatas, tada pridėti šį naujų lentų URL: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json, kuris leis jums įdiegti įkrovos tvarkyklę (jei jūsų ATtiny85 dar nebuvo su juo).

2 veiksmas: įdiekite „Assembler“ir „Avrdude“

Dabar galite atsisiųsti ir įdiegti surinkėją ir avrdude iš nuorodų, pateiktų pirmame šios pamokos žingsnyje. Tikėtina, kad jei jau dirbote su „Arduino“, jau esate įdiegę avrdude.

Įdiegę „Avra“, pastebėsite, kad yra pakatalogis, vadinamas „šaltiniais“, ir to katalogo viduje yra krūva įtraukimo failų. Tai visi mikrovaldikliai, kuriuos galite užprogramuoti naudodami „Avra“. Jūs iškart pastebėsite, kad nėra 328p failo, kurį čia naudojame. Aš pridėjau vieną. Failas turėtų būti vadinamas m328Pdef.inc, o jūs turėtumėte įdėti jį į katalogą arba bet kur kitur, kas jums patinka. Įtrauksime ją į savo surinkimo kalbų programas. Visa tai yra duoti kiekvieną registrą mikrovaldiklių pavadinimuose iš duomenų lapo, kad nereikėtų naudoti jų šešioliktainių pavadinimų. Aukščiau pateiktame faile yra „praktinės direktyvos“, nes jis buvo sukurtas C ir C ++ programavimui. Jei jums atsibodo matyti, kad surinkėjas išspjovė „ignoruodamas pragmos direktyvą“, tiesiog eikite į failą ir ištrinkite arba komentuokite visas eilutes, prasidedančias #pragma

Gerai, dabar, kai paruošite savo mikrovaldiklį, surinkėją ir programuotoją, galime parašyti savo pirmąją programą.

Pastaba: jei naudojate ATtiny85, o ne ATmega328P, jums reikia kito įtraukimo failo, pavadinto tn85def.inc. Aš taip pat jį pridėsiu (atkreipkite dėmesį, kad turėjau jį pavadinti tn85def.inc.txt, kad „Instructables“leistų man jį įkelti.) Tačiau, jei gavote „avra“surinkėją iš „github“, abu šiuos failus jau turite. Taigi rekomenduoju jį gauti ir sudaryti patiems: git clone

3 žingsnis: Sveikas pasaulis

Šios pirmosios pamokos tikslas yra sukurti standartinę pirmąją programą, kurią ji rašo mokydamasi bet kokios naujos kalbos ar tyrinėdama bet kokią naują elektronikos platformą. "Labas pasauli!." Mūsų atveju mes tiesiog norime parašyti surinkimo kalbos programą, ją surinkti ir įkelti į savo mikrovaldiklį. Programa įjungs šviesos diodą. Priversti šviesos diodą „mirksėti“, kaip tai daroma įprastai „Arduino hello world“programai, iš tikrųjų yra daug sudėtingesnė programa surinkimo kalba, todėl to dar nedarysime. Mes parašysime paprasčiausią „plikų kaulų“kodą su minimaliu nereikalingu pūku.

Pirmiausia prijunkite šviesos diodą iš PB5 (žr. „Pinout“diagramą), kuris taip pat vadinamas „Digital Out 13“arduino, prie 220 omų rezistoriaus, tada prie GND. T.y.

PB5 - LED - R (220 omų) - GND

Dabar rašykite programą. Atidarykite mėgstamą teksto rengyklę ir sukurkite failą pavadinimu „hello.asm“

; sveiki.asm

; įjungia šviesos diodą, prijungtą prie PB5 (skaitmeninis išėjimas 13). įtraukite "./m328Pdef.inc" ldi r16, 0b00100000 iš DDRB, r16 išvestis PortB, r16 Pradžia: rjmp pradžia

Aukščiau yra kodas. Per kelias minutes eisime per eilę, bet pirmiausia įsitikinkime, kad galime tai padaryti jūsų įrenginyje.

Sukūrę failą, terminale jį surinksite taip:

avra sveiki.asm

tai surinks jūsų kodą ir sukurs failą hello.hex, kurį galėsime įkelti taip:

avrdude -p m328p -c stk500v1 -b 57600 -P /dev /ttyUSB0 -U blykstė: w: hello.hex

jei naudojate „duonos lentą arduino“, prieš vykdydami aukščiau nurodytą komandą, turėsite paspausti duonos lentos arduino atkūrimo mygtuką. Atminkite, kad taip pat gali tekti pridėti sudo priešais arba vykdyti kaip root. Taip pat atkreipkite dėmesį, kad kai kuriuose „arduino“(pvz., „Arduino UNO“) greičiausiai turėsite pakeisti bitų spartą į -b 115200 ir prievadą -P /dev /ttyACM0 (jei iš avrdude gausite klaidą dėl netinkamo įrenginio parašo, tiesiog pridėkite - F į komandą)

Jei viskas veikė taip, kaip turėtų, dabar užsidegs šviesos diodas….. „Labas pasaulis!“

Jei naudojate ATtiny85, komanda avrdude bus tokia:

avrdude -p attiny85 -c usbtiny -U flash: w: hello.hex

4 žingsnis: Sveiki. Asm eilute

Norėdami užbaigti šią įvadinę pamoką, eisime per programą hello.asm, kad pamatytume, kaip ji veikia.

; sveiki.asm

; įjungia šviesos diodą, prijungtą prie PB5 (skaitmeninis išėjimas 13)

Viską po kabliataškio surinkėjas ignoruoja, todėl šios pirmosios dvi eilutės yra tiesiog „komentarai“, paaiškinantys, ką programa daro.

.include "./m328Pdef.inc"

Ši eilutė liepia surinkėjui įtraukti atsisiųstą failą m328Pdef.inc. Galbūt norėsite tai įdėti į panašių įtraukimo failų katalogą ir tada pakeisti aukščiau esančią eilutę, kad ji būtų ten.

ldi r16, 0b00100000

ldi reiškia „nedelsiant įkelti“ir liepia surinkėjui paimti darbo registrą, šiuo atveju r16, ir į jį įkelti dvejetainį skaičių, šiuo atveju 0b00100000. Priešais esantis 0b sako, kad mūsų skaičius yra dvejetainis. Jei norėtume, būtume galėję pasirinkti kitą bazę, pvz., Šešioliktainį. Tokiu atveju mūsų skaičius būtų buvęs 0x20, kuris yra šešioliktainis skaičius 0b00100000. Arba mes galėjome naudoti tą patį skaičių 32, kuris yra 10 dešimtųjų.

1 pratimas: pabandykite pakeisti skaičių aukščiau esančioje eilutėje į šešioliktainį, o tada į dešimtainį kodą ir patikrinkite, ar jis vis tiek veikia kiekvienu atveju.

Tačiau dvejetainių naudojimas yra paprasčiausias dėl uostų ir registrų veikimo būdo. Kituose vadovėliuose išsamiau aptarsime „atmega328p“prievadus ir registrus, tačiau kol kas aš tik pareikšiu, kad mes naudojame „r16“kaip „darbo registrą“, o tai reiškia, kad mes jį ketiname naudoti kaip kintamąjį, kurį saugome "registras" yra 8 bitų rinkinys. Reiškia 8 dėmės, kurios gali būti 0 arba 1 („išjungtos“arba „įjungtos“). Įdėdami dvejetainį skaičių 0b00100000 į registrą naudodami aukščiau pateiktą eilutę, mes tiesiog išsaugojome tą numerį registre r16.

iš DDRB, r16

Ši eilutė kompiliatoriui nurodo nukopijuoti registro r16 turinį į DDRB registrą. DDRB reiškia „Duomenų krypties registras B“ir nustato „kaiščius“„PortB“. 328p kištuko žemėlapyje galite pamatyti, kad yra 8 kaiščiai, pažymėti PB0, PB1,…, PB7. Šie kaiščiai yra „PortB“„bitai“, o kai įkeliame dvejetainį numerį 00100000 į DDRB registrą, sakome, kad norime, kad PB0, PB1, PB2, PB3, PB4, PB6 ir PB7 būtų nustatyti kaip įvesties kaiščiai, nes jie Juose yra 0, o PB5 nustatytas kaip išvesties kaištis, nes į tą vietą įdėjome 1.

iš PortB, r16

Dabar, kai nustatėme kaiščių kryptis, dabar galime nustatyti jų įtampą. Aukščiau pateikta eilutė nukopijuoja tą patį dvejetainį numerį iš mūsų saugyklos registro r16 į „PortB“. Tai nustato visus kaiščius 0 voltų, išskyrus kaištį PB5 į HIGH, kuris yra 5 voltai.

2 pratimas: paimkite skaitmeninį multimetrą, įkiškite juodą laidą į žemę (GND) ir tada raudonu laidu patikrinkite kiekvieną kaištį PB0 – PB7. Ar kiekvieno kaiščio įtampa tiksliai atitinka 0b00100000 įdėjimą į „PortB“? Jei yra tokių, kurių nėra, kodėl manote, kad taip yra? (žr. kaiščių žemėlapį)

Pradėti:

rjmp Pradėti

Galiausiai pirmoje eilutėje yra „etiketė“, žyminti kodo vietą. Šiuo atveju tą vietą pažymėkite kaip „Pradėti“. Antroje eilutėje rašoma „santykinis perėjimas prie etiketės Pradėti“. Galutinis rezultatas yra tas, kad kompiuteris yra įtrauktas į begalinę kilpą, kuri tiesiog važiuoja dviračiu į pradžią. Mums to reikia, nes negalime, kad programa pasibaigtų arba nukristų nuo skardžio, programa turi tiesiog veikti, kad šviesa liktų užsidegusi.

3 pratimas: pašalinkite dvi aukščiau esančias eilutes iš savo kodo, kad programa nukristų nuo uolos. Kas atsitinka? Turėtumėte pamatyti kažką panašaus į tradicinę „mirksėjimo“programą, kurią „Arduino“naudoja kaip „labas pasaulis!“. Kaip manote, kodėl tai veikia taip? (Pagalvokite, kas turi nutikti, kai programa nukris nuo uolos …)

5 žingsnis: Išvada

Jei pasiekėte taip toli, tada sveikinu! Dabar galite parašyti surinkimo kodą, surinkti jį ir įkelti į savo mikrovaldiklį.

Šioje pamokoje jūs išmokote naudoti šias komandas:

„ldi hregister“, skaičius įkelia skaičių (0–255) į viršutinę registro pusę (16–31)

iš ioregister, register nukopijuoja numerį iš darbo registro į I/O registrą

„rjmp“etiketė pereina į programos eilutę, pažymėtą „etikete“(kuri negali būti toliau nei už 204 nurodymų, t. y. santykinis šuolis)

Dabar, kai šie pagrindai yra nutolę, galime toliau rašyti įdomesnį kodą ir įdomesnes grandines bei įrenginius, nediskutuodami apie kompiliavimo ir įkėlimo mechaniką.

Tikiuosi, kad jums patiko ši įvadinė pamoka. Kitame vadove pridėsime kitą grandinės komponentą (mygtuką) ir išplėsime savo kodą, įtraukdami įvesties prievadus ir sprendimus.

Rekomenduojamas: