INHOUDSOPGAWE:

AVR Assembler Tutoriaal 1: 5 stappe
AVR Assembler Tutoriaal 1: 5 stappe

Video: AVR Assembler Tutoriaal 1: 5 stappe

Video: AVR Assembler Tutoriaal 1: 5 stappe
Video: AVR Ассемблер. Урок 1. Вводный. AVR Assembler. Lesson 1. Promo. 2024, November
Anonim
AVR -samestelling -tutoriaal 1
AVR -samestelling -tutoriaal 1

Ek het besluit om 'n reeks tutoriale te skryf oor hoe om monteringstaalprogramme te skryf vir die Atmega328p, die mikrokontroleerder wat in die Arduino gebruik word. As mense steeds belangstel, sal ek 'n week of so uitstel totdat ek nie meer tyd het nie, anders stop mense dit.

Ek gebruik Arch linux en werk aan 'n atmega328p-pu wat op 'n broodbord aangebring is. U kan dit op dieselfde manier doen as ek, of u kan eenvoudig 'n arduino op u rekenaar aansluit en op die mikrobeheerder werk.

Ons sal programme vir die 328p skryf, soos die in die meeste arduino's, maar u moet daarop let dat dieselfde programme en tegnieke ook vir enige van die Atmel -mikrobeheerders sal werk, en later (as daar belangstelling is), sal ons saam met sommige werk die ander ook. Die besonderhede van die mikrobeheerder kan gevind word in die Atmel -gegewensblaaie en die handleiding vir instruksies. Ek heg hulle aan hierdie instruksies.

Hier is wat u benodig:

1. 'n Broodplank

2. 'n Arduino, of net die mikrobeheerder

3. 'n Rekenaar met Linux

4. Die avra -samesteller wat git gebruik: git -kloon https://github.com/Ro5bert/avra.git, of as u 'n Ubuntu of 'n debian -stelsel gebruik, tik net 'sudo apt install avra' en u kry beide die avr assembler en avrdude. As u egter die nuutste weergawe met github kry, kry u ook al die nodige lêers, met ander woorde, dit bevat reeds die m328Pdef.inc- en tn85def.inc -lêers.

5. avrdude

Die volledige stel van my AVR-samestelling-tutoriale kan hier gevind word:

Stap 1: Bou 'n toetsbord

Bou 'n toetsbord
Bou 'n toetsbord

U kan eenvoudig u arduino gebruik en alles in hierdie tutoriale doen as u wil. Aangesien ons egter van kodering in monteringstaal praat, is ons filosofie inherent om al die perifere te verwyder en direk met die mikrobeheerder self te kommunikeer. Dink u dan nie dat dit lekkerder sou wees om dit so te doen nie?

Vir diegene wat saamstem, kan u die mikrobeheerder uit u arduino trek en dan begin met die bou van 'n "Breadboard Arduino" deur die instruksies hier te volg:

Op die foto wys ek my opstelling wat bestaan uit twee selfstandige Atmega328p's op 'n groot broodplank (ek wil die vorige tutoriaal bedraad en gelaai op een mikrobeheerder kan hou terwyl ek aan die volgende werk). Ek het die kragtoevoer ingestel sodat die boonste spoor 9V is en al die ander 5V van die spanningsreguleerder af is. Ek gebruik ook 'n FT232R -uitbreekbord om die skyfies te programmeer. Ek het dit gekoop en self laaipakkies daarop gesit, maar as jy net een uit 'n Arduino gehaal het, is dit al goed.

Let daarop dat as u dit met 'n ATtiny85 probeer, u die Sparkfun Tiny Programmer hier kan kry: https://www.sparkfun.com/products/11801# en koppel dit dan eenvoudig aan op die USB -poort van u rekenaar. U moet eers 'n selflaaiprogram op die Attiny85 installeer, en die maklikste manier is om die Arduino IDE te gebruik. U moet egter op die lêer en voorkeure klik en dan die URL van New Boards byvoeg: https://raw.githubusercontent.com/damellis/attiny/ide-1.6.x-boards-manager/package_damellis_attiny_index.json wat stel u in staat om die selflaaiprogram te installeer (as u ATtiny85 nog nie een was nie).

Stap 2: Installeer die Assembler en Avrdude

U kan nou die assembler en avrdude aflaai en installeer vanaf die skakels wat in die eerste stap van hierdie tutoriaal gegee word. Dit is waarskynlik dat as u reeds met Arduino's gewerk het, u reeds avrdude geïnstalleer het.

Nadat u avra geïnstalleer het, sal u agterkom dat daar 'n subgids is wat 'bronne' genoem word, en in die gids is 'n klomp insluitende lêers. Dit is al die mikrobeheerders wat u met avra kan programmeer. U sal onmiddellik agterkom dat daar geen lêer is vir die 328p wat ons hier gebruik nie. Ek het een aangeheg. Die lêer moet m328Pdef.inc heet, en u moet dit in die map insluit of op enige ander plek plaas. Ons sal dit in ons byeenkomstaalprogramme insluit. Dit alles is om elkeen van die registers in die mikrobeheerdername uit die datablad te gee, sodat ons nie hul heksidimale name hoef te gebruik nie. Bogenoemde lêer bevat 'pragma -aanwysings', aangesien dit ontwerp is vir C en C ++ programmering. As u moeg word om te sien hoe die samesteller klagtes uitskakel met die "ignoreer van die pragma -opdrag", gaan dan in die lêer en verwyder of lewer kommentaar op al die reëls wat begin met #pragma

Goed, noudat u u mikrobeheerder gereed, u samesteller gereed en u programmeerder gereed het, kan ons ons eerste program skryf.

Nota: as u die ATtiny85 in plaas van die ATmega328P gebruik, benodig u 'n ander lêer met die naam tn85def.inc. Ek sal dit ook aanheg (let op, ek moes dit tn85def.inc.txt noem, sodat Instructables dit vir my moontlik sou maak om dit op te laai.) Maar as u die avra assembler van github gekry het, het u albei hierdie lêers reeds by. Ek beveel dus aan om dit te kry en dit self op te stel: git -kloon

Stap 3: Hallo wêreld

Die doel van hierdie eerste tutoriaal is om die standaard eerste program op te stel wat u skryf wanneer u 'n nuwe taal leer of 'n nuwe elektroniese platform ondersoek. "Hello Wêreld!." In ons geval wil ons eenvoudig 'n samestellingstaalprogram skryf, dit saamstel en oplaai na ons mikrobeheerder. 'N LED sal aanskakel deur die program. Dit is eintlik 'n baie meer ingewikkelde program in die samestellingstaal, sodat 'n LED 'knipper' soos dit vir die normale Arduino hallo wêreldprogram is, en ons sal dit nog nie doen nie. Ons gaan die eenvoudigste kode vir kaal bene skryf met minimale onnodige pluis.

Koppel eers 'n LED van PB5 (sien die pinout -diagram) wat ook Digital Out 13 op 'n arduino genoem word, aan 'n weerstand van 220 ohm, dan na GND. D.w.s.

PB5 - LED - R (220 ohm) - GND

Nou om die program te skryf. Maak u gunsteling teksredakteur oop en skep 'n lêer genaamd "hello.asm"

; hallo.asm

; skakel 'n LED aan wat gekoppel is aan PB5 (digitaal uit 13). sluit "./m328Pdef.inc" ldi r16, 0b00100000 out DDRB, r16 out PortB, r16 Start: rjmp Start in

Bogenoemde is die kode. Ons gaan dit binne 'n minuut lyn-vir-lyn deur, maar maak eers seker dat ons dit op u toestel kan laat werk.

Nadat u die lêer geskep het, monteer u dit soos volg in 'n terminale:

avra hallo.asm

dit sal u kode saamstel en 'n lêer genaamd hello.hex skep wat ons soos volg kan oplaai:

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

As u 'n broodbord -arduino gebruik, moet u op die reset -knoppie op die broodbord -arduino druk net voordat u die bogenoemde opdrag uitvoer. Let daarop dat u moontlik ook 'n sudo voor moet byvoeg of dit as root moet uitvoer. Let ook daarop dat u op sommige arduino's (soos die Arduino UNO) die bitrate waarskynlik moet verander na -b 115200 en die poort -P /dev /ttyACM0 (as u 'n fout kry van avrdude oor 'n ongeldige apparaatondertekening, voeg net 'n - F na die opdrag)

As alles werk soos dit moet, sal u nou 'n LED laat brand … "Hallo wêreld!"

As u die ATtiny85 gebruik, is die avrdude -opdrag:

avrdude -p attiny85 -c usbtiny -U flits: w: hallo.hex

Stap 4: Hello.asm Reël-vir-reël

Om hierdie inleidende tutoriaal af te handel, gaan ons reël-vir-reël deur die hello.asm-program om te sien hoe dit werk.

; hallo.asm

; skakel 'n LED aan wat gekoppel is aan PB5 (digitaal uit 13)

Alles na 'n kommapunt word deur die samesteller geïgnoreer en daarom is hierdie eerste twee reëls eenvoudig 'kommentaar' wat verduidelik wat die program doen.

. sluit "./m328Pdef.inc" in

Hierdie reël vertel die versamelaar om die m328Pdef.inc -lêer wat u afgelaai het, in te sluit. U wil dit moontlik in 'n gids met soortgelyke lêers insluit en dan die lyn hierbo verander om daarheen te wys.

ldi r16, 0b00100000

ldi staan vir "laai onmiddellik" en sê vir die samesteller om 'n werkregister, r16 in hierdie geval, te neem en 'n binêre getal daarin te laai, 0b00100000 in hierdie geval. Die voorkant 0b sê dat ons getal in binêre is. As ons wou, kon ons 'n ander basis gekies het, soos heksidecimaal. In daardie geval sou ons getal 0x20 gewees het, wat heksadesimaal is vir 0b00100000. Of ons kon 32 gebruik het, wat basis 10 desimale is vir dieselfde getal.

Oefening 1: Probeer om die getal in die lyn hierbo na heksidecimaal te verander en dan na desimale in u kode, en verifieer dat dit steeds werk.

Die gebruik van binêre is egter die eenvoudigste as gevolg van die manier waarop hawens en registers werk. Ons sal die poorte en registers van die atmega328p in meer detail bespreek in toekomstige tutoriale, maar vir eers sal ek net sê dat ons r16 as ons 'werkregister' gebruik, wat beteken dat ons dit net sal gebruik as 'n veranderlike wat ons stoor getalle in. 'n "Register" is 'n stel van 8 bisse. Dit beteken 8 plekke wat 0 of 1 kan wees ('af' of 'aan'). As ons die binêre getal 0b00100000 in die register laai met behulp van die lyn hierbo, het ons die getal eenvoudig in die register r16 gestoor.

uit DDRB, r16

Hierdie reël vertel die samesteller om die inhoud van die register r16 na die DDRB -register te kopieer. DDRB staan vir "Data Direction Register B" en dit stel die "penne" op PortB op. Op die pinout -kaart vir die 328p kan u sien dat daar 8 penne is met die naam PB0, PB1, …, PB7. Hierdie penne verteenwoordig die "stukkies" van "PortB" en as ons die binêre getal 00100000 in die DDRB -register laai, sê ons dat ons wil hê dat PB0, PB1, PB2, PB3, PB4, PB6 en PB7 as INPUT -penne gestel moet word, aangesien dit 0's daarin, en PB5 is ingestel as 'n OUTPUT -pen, aangesien ons 'n 1 op die plek gesit het.

uit PortB, r16

Noudat ons die rigtings van die penne reggemaak het, kan ons die spanning daarop stel. Bogenoemde reël kopieer dieselfde binêre nommer van ons stoorregister r16 na PortB. Dit stel al die penne op 0 volt behalwe pen PB5 op HIGH, wat 5 volt is.

Oefening 2: Neem 'n digitale multimeter, steek die swart lood in die grond (GND) en toets dan elk van die penne PB0 tot en met PB7 met die rooi lood. Is die spanning op elk van die penne presies dieselfde as wat 0b00100000 in PortB geplaas word? As daar is wat nie is nie, hoekom dink jy dit is? (sien die speldkaart)

Begin:

rjmp Begin

Laastens is die eerste reël hierbo 'n 'etiket' wat 'n plek in die kode benoem. In hierdie geval, merk die plek as "Begin". Die tweede reël sê "relatiewe sprong na die etiket Start." Die netto resultaat is dat die rekenaar in 'n oneindige lus geplaas word wat net na Start teruggaan. Ons het dit nodig omdat ons nie kan hê dat die program net eindig of van 'n krans af val nie; die program moet net aanhou loop sodat die lig kan brand.

Oefening 3: Verwyder bogenoemde twee reëls uit u kode sodat die program van 'n krans af val. Wat gebeur? U behoort iets te sien wat lyk soos die tradisionele "blink" -program wat deur Arduino gebruik word as hul "hallo wêreld!". Waarom dink u werk dit so? (Dink na oor wat moet gebeur as die program van 'n krans af val …)

Stap 5: Gevolgtrekking

As jy so ver gekom het, baie geluk! U kan nou die samestellingskode skryf, dit saamstel en dit op u mikrobeheerder laai.

In hierdie handleiding het u geleer hoe u die volgende opdragte kan gebruik:

Registreer, nommer laai 'n getal (0-255) in die boonste helfte register (16-31)

uit ioregister, registreer die kopie 'n nommer van 'n werkregister na 'n I/O -register

rjmp -etiket spring na die lyn van die program gemerk met 'label' (wat nie verder as 204 instruksies moet wees nie - dit wil sê relatiewe sprong)

Noudat hierdie basiese beginsels uit die weg geruim is, kan ons voortgaan om meer interessante kode en meer interessante stroombane en toestelle te skryf sonder om die meganika van die opstel en oplaai daarvan te bespreek.

Ek hoop dat u hierdie inleidende tutoriaal geniet het. In die volgende tutoriaal voeg ons nog 'n stroombaankomponent ('n knoppie) by en brei ons kode uit tot invoerpoorte en besluite.

Aanbeveel: