AVR: programiranje v okolju AVR Studio. Integrirano okolje za odpravljanje napak AVR Studio iz studia Atmel Avr

Za delo z AVR Studio 4 ga morate namestiti samega. Če je že nameščen, lahko ta korak preskočite.

Namestitev:
ustvarite imenik c:/avr/ - tu se bodo nahajali delovni programi.
ustvarite imenik, na primer c:/works/ – tukaj bodo shranjena vaša dela.
Nujno je, da obstajajo bližnjice, da z njimi ni težav.

Na splošno obstaja AVRStudio5, vendar je AVRStudio4 še vedno dovolj.

Vse delo bo potekalo v AVRStudio4, WinAVR je potreben samo zaradi knjižnice AVR-GCC (Da lahko pišete v C)
AMPAK! Najprej morate namestiti WinAVR, sicer knjižnica AVR-GCC ne bo prevzeta.

Mislim, da boste tukaj ugotovili.
AVR-GCC za pisanje v C
Atmel Avr Assembler oziroma za asembler.

Bolje je začeti razumeti MK iz nič. In to pomeni iz Assemblerja, kar pomeni, da ustvarite tisto, ki je Atmel AVR Assembler.

Nato izberite mikrokrmilnik Atmega8.

ko bo projekt ustvarjen, bo velika, bela, prazna plošča. tukaj bo koda.

malo o vsebini tega lista

“komentarji” so besedila, ki jih prevajalnik preskoči pri prevajanju.
pred začetkom komentarja mora biti poseben simbol, uporabljam simbol; “podpičje”, obstaja tudi “dvojna poševnica” (//),
tukaj so primeri komentarjev

/* * Komentar te vrste (večvrstični), * ki se običajno uporablja za * spremne informacije * o izvorni kodi, tj. * ime, razvijalec itd. */ NOP // Ta komentar se uporablja predvsem za razlago namena ukaza ali dela kode SLEEP ; Ta komentar, tako kot prejšnji, lahko uporabite za razlago (za opombe) v kodi

ukazi so napisani v vsaki vrstici. tiste. en ukaz - ena vrstica.
Recimo, da obstajajo ukazi z dvema “parametroma”, z enim ali brez česar koli

MOV R16, R17 ; dva parametra INC R16 ; en parameter SEI; brez parametrov

MOV R16, R17 ; trije bajti INC R16; dva bajta SEI ; en bajt

Ali vidite povezavo med velikostjo ekipe in parametri?

Vsak mikrokontroler ima svoj asembler, čeprav je njihova mnemotehnika podobna, tj. Ukaz MOV za MK ene serije bo videti v strojni kodi, recimo 0x12, za drugo pa 0x55.
Da se bo med prevajanjem prevedel v kodo, ki jo potrebujemo, moramo prevajalniku povedati, za kateri mikrokrmilnik pišemo program.
To je običajno izbrano pri ustvarjanju projekta.
Zaradi tega smo izbrali mikrokrmilnik Atmega8.

Vendar to še ni vse. Da bi nam olajšal življenje, ima AVRStudio4 niz konstant, ki se imenujejo nekaj podobnega kot "Macroassembler".

Če jih želite naložiti, morate vstaviti vrstico na začetku kode

Vključi "m8def.inc" // z uporabo ukaza .include smo naložili datoteko m8def.inc; in zdaj nam bo postalo lažje;)

Na samem začetku kode je postavljena tabela prekinitev. Kaj je in kako deluje, bom razložil v drugi objavi. Za zdaj pa zapišimo takole:

RJMP PONASTAVI ; Reset Handler RETI; RJMP EXT_INT0 ; IRQ0 Handler RETI; RJMP EXT_INT1 ; IRQ1 Handler RETI; RJMP TIM2_COMP ; Timer2 Primerjaj Handler RETI; RJMP TIM2_OVF ; Timer2 Overflow Handler RETI; RJMP TIM1_CAPT; Timer1 Capture Handler RETI; RJMP TIM1_COMPA ; Timer1 CompareA Handler RETI; RJMP TIM1_COMPB ; Timer1 CompareB Handler RETI; RJMP TIM1_OVF ; Timer1 Overflow Handler RETI; RJMP TIM0_OVF ; Timer0 Overflow Handler RETI; RJMP SPI_STC ; SPI Transfer Complete Handler RETI; RJMP USART_RXC ; USART RX Complete Handler RETI; RJMP USART_UDRE ; UDR Empty Handler RETI; RJMP USART_TXC ; USART TX Complete Handler RETI; RJMP ADC ; ADC Conversion Complete Handler RETI; RJMP EE_RDY ; EEPROM Ready Handler RETI; RJMP ANA_COMP; Analogni komparator Handler RETI; RJMP TWSI ; Dvožični upravljalnik serijskega vmesnika RETI; RJMP SPM_RDY; Obravnavalnik, pripravljen za shranjevanje programov v pomnilniku

Za tem pride sama koda

PONOVNI ZAGON: ; inicializacijski žeton MAIN: NOP ; glavni marker zanke RJMP MAIN

Vendar obstaja ena (ali bolje rečeno ne ena, ampak veliko) lastnosti.

Za udobje pisanja kode, za njeno jasnost in olajšanje relativnih prehodov smo dobili oznake, kako izgledajo? “RESET:” in “MAIN:” sta oznaki, njuni imeni lahko vsebujeta skoraj vse latinične črke in številke. Označevalci ne morejo imeti imen funkcij in ukazov, na primer "NOP".
Kako se pride do njih? Recimo ukaz RJMP.

Prav tako lahko iz markerjev naredimo podprogram (postopek), po katerem se bomo vrnili tja, od koder je bil poklican. Za priklic uporabite ukaz “RCALL (podprogram)”, za vrnitev iz podprograma (postopka) pa ga morate končati z ukazom “RET”. Na koncu bi morali dobiti takšno kodo:

PONOVNI ZAGON: GLAVNI: NOP RCALL PPP1 ; pokličite podprogram RJMP MAIN PPP1: NOP RET ; zapustite podprogram

Kako deluje ukaz “RCALL”, ko je priklican, se naslov, iz katerega je bil priklican, postavi na STACK, in ko je priklican ukaz “RET”, se odstrani iz registra “stack”. STACK je treba inicializirati.

Da lahko delamo z našim MK, ga moramo inicializirati. Ker mk, ta naprava je univerzalna, ima veliko vhodno/izhodnih vrat in perifernih naprav. kot so USART, PWM, DAC, ADC itd. Prvi korak pri inicializaciji mikrokontrolerja je označevanje začetka "sklada". Inicializacijo izvedemo po oznaki “RESET:”.

LDI R16,VISOKI(RAMEND) IZH SPH,R16 LDI R16,NIZEK(RAMEND) IZH SPL,R16

Če na začetku kode ne bi vnesli ukaza .include “m8def.inc”, bi ga morali napisati takole:

LDI R16,0x04 IZH SPH,R16 LDI R16,0x5f IZH SPL,R16

Razlika je po mojem občutna.

STACK je pomnilnik vrste shranjevanja: (zadnji vstop, prvi ven).
Tip trgovine ni supermarket, ampak rog iz mitraljeza. Upam, da si lahko vsi predstavljajo, kako se kartuše polnijo vanj in kako se potem od tam odstranijo.
Veliko pozornosti morate posvetiti pomnilniku STACK, ker ... vsaka manjša napaka pri delu z njim lahko privede do okvare sklada. To je tako pomembna tema, da sem se odločil, da ji posvetim celo temo in jo bom zapisal v ločeni opombi.

Tako smo dobili naslednjo kodo:

Vključi "m8def.inc" RJMP RESET ; Reset Handler RETI; RJMP EXT_INT0 ; IRQ0 Handler RETI; RJMP EXT_INT1 ; IRQ1 Handler RETI; RJMP TIM2_COMP ; Timer2 Primerjaj Handler RETI; RJMP TIM2_OVF ; Timer2 Overflow Handler RETI; RJMP TIM1_CAPT; Timer1 Capture Handler RETI; RJMP TIM1_COMPA ; Timer1 CompareA Handler RETI; RJMP TIM1_COMPB ; Timer1 CompareB Handler RETI; RJMP TIM1_OVF ; Timer1 Overflow Handler RETI; RJMP TIM0_OVF ; Timer0 Overflow Handler RETI; RJMP SPI_STC ; SPI Transfer Complete Handler RETI; RJMP USART_RXC ; USART RX Complete Handler RETI; RJMP USART_UDRE ; UDR Empty Handler RETI; RJMP USART_TXC ; USART TX Complete Handler RETI; RJMP ADC ; ADC Conversion Complete Handler RETI; RJMP EE_RDY ; EEPROM Ready Handler RETI; RJMP ANA_COMP; Analogni komparator Handler RETI; RJMP TWSI ; Dvožični upravljalnik serijskega vmesnika RETI; RJMP SPM_RDY; Store Program Memory Ready Handler RESET: LDI R16,HIGH(RAMEND) OUT SPH,R16 LDI R16,LOW(RAMEND) OUT SPL,R16 RGMP RESET MAIN: NOP ; glavni marker zanke RJMP MAIN

Na tej stopnji lahko prevedemo projekt in ga zaženemo za razhroščevanje, toda ker naša koda ne naredi ničesar, lahko v kodi identificiramo le sintaksne napake.

Za pravilen postopek odpravljanja napak morate v emulatorju nastaviti frekvenco, s katero bo MK deloval, to se naredi šele po prevajanju in začetku odpravljanja napak,
To pomeni, da v menijski vrstici najdemo »Build«, ga odpremo in vidimo »Build and Run«, nato pa bomo videli rumeno puščico nasproti prvega ukaza v našem seznamu kod. Zdaj poiščemo »Debug« v menijski vrstici in kliknemo »AVR Simulator Options«, odpre se naslednje okno:

V katerem lahko spremenimo MK in njegovo frekvenco, prav tako na plošči na desni vidimo nekaj informacij o našem MK: največjo frekvenco, kapaciteto pomnilnika (EEPROM, RAM, FLASH). Zdaj odprite podatkovni list na Atmega8, na strani 203 (splošen seznam registrov) in 205 (splošen seznam ukazov) in začnite pisati svoj program.
In ne pozabite, ne bojte se eksperimentirati s simulatorjem, ne bo se zlomil!


Zdravo.

Ta članek bo všeč tistim, ki verjamejo, da so "zrasli" iz Arduina in so pripravljeni stopiti v svet "resnega" programiranja mikrokontrolerjev. Poleg tega, da boste »napolnili svoje programerske sposobnosti«, boste imeli možnost izbrati kateri koli mikrokrmilnik za svoje projekte, seveda pa boste cenili hitrost programov in velikost pomnilnika, ki ga zasedajo.

Vse bo opisano (za    ), od začetka do konca, - namestitev in priprava potrebne programske opreme, sestavljanje najpreprostejšega programatorja "Gromov" (ne bojte se, diode so samo tri in uporov sedem), vdelana programska oprema MK in pisanje kode v AVR Studio. Celoten postopek bodo pospremili z ilustracijami in primeri.

Naj takoj rezerviram: računalnik mora biti opremljen s COM priključkom (adapter USB na COM ne deluje dobro). Če vaš računalnik nima takega konektorja na zadnji strani, potem je verjetno na matični plošči (v obliki pinov), potem se da vse rešiti s takšnim "izmetom"

Žal, za lastnike prenosnikov brez COM-a je članek le akademskega pomena.

Torej, začnimo …

Kaj boš potreboval?

"Mehko"


UniProf- univerzalni program za utripanje različnih mikrokontrolerjev ATmega, preprost in priročen, in kar je najpomembneje, odlično deluje z našim programatorjem. Avtor je ruski razvijalec Mikhail Nikolaev.

Seveda lahko utripate MK iz AVR Studio, vendar za to potrebujete poseben programator. Zato bomo kodo napisali v studiu, dobljene hex datoteke pa flashali z UniProfom z uporabo našega domačega programatorja. Poleg tega bo opisan način utripanja vdelane programske opreme iz ukazne vrstice.

Uporabniki Linuxa bodo morali uporabljati virtualni stroj ali Wine. Z Wineom mi ni uspelo, sploh ne vidim vrat in nisem poskusil z virtualnim strojem.

  Brezhibno deluje v Wineu (Debian 8.5, wine1.6).

Vsa programska oprema je brezplačna.

"železo"

Izvajali bomo poskuse na Arduino pro mini s čipom ATmega328. Kvarčna frekvenca (8/16MHz), kot tudi napetost (3,3/5v), ni pomembno. (glej spodaj)

V prihodnosti boste programirali različne mikrokontrolerje Atmel, a za prvič je ta plošča ravno pravšnja. Dober je, ker je praktično goli krmilnik z minimalnim ožičenjem in spajkanimi pini. Samo tisto, kar potrebujete.

O oznakah na mikrokontrolerjih

Za imenom so številke, ki najpogosteje označujejo količino pomnilnika.

Črka za številkami označuje parametre napajalne napetosti.

Brez pisma- napajalna napetost krmilnika je znotraj 4,5-5,5 voltov.
L- različice krmilnikov, ki delujejo na znižani (nizko) napajalna napetost (2,7 - 5,5 voltov).
V- različice krmilnikov, ki delujejo na nizko napajalno napetost (1,8–5,5 voltov).
U- različice krmilnikov, ki delujejo na ultra nizko napajalno napetost (0,7-5,5 voltov).
p- različice z nizko porabo energije (do 100 nA v načinu izklopa).
A- zmanjšana poraba toka, pokriva celotno frekvenčno območje ure vseh različic, napajalna napetost 1,8-5,5 voltov (pri nekaterih modelih so bile dodane nove funkcije in novi registri, hkrati pa je ohranjena popolna združljivost s prejšnjimi različicami).

Mikrokontrolerji « A« in » ne- A" imajo običajno enak podpis, kar povzroča nekaj težav, saj so Fuse-biti različni.

Primeri:

ATmega8- zmogljivost programskega pomnilnika je 8 kilobajtov, napajalna napetost je 4,5-5,5 voltov.
ATmega8L- zmogljivost programskega pomnilnika je 8 kilobajtov, napajalna napetost je 2,7-5,5 voltov.
ATtiny43U- zmogljivost pomnilnika 4 kilobajta, modifikacija - 3, napajalna napetost - 0,7-5,5 voltov.
ATtiny44A- zmogljivost pomnilnika 4 kilobajta, modifikacija - 4, zmanjšana poraba toka, napajalna napetost 1,8-5,5 voltov.

Zgodi se, da ima krmilnik brez črke zmanjšano napajalno napetost (1,7 ali 1,8 voltov). To je treba pojasniti v podatkovnem listu.

ATtiny841- zmogljivost pomnilnika 8 kilobajtov, modifikacija - 41, napajalna napetost - 1,7-5,5 voltov.

Za vezajem je navedena različica mikrokontrolerja, sestavljena iz številk, ki označujejo največjo frekvenco krmilnika. (pri ustrezni napajalni napetosti), in iz črk, ki označujejo možnost ohišja, temperaturno območje delovanja in značilnosti izdelave.

Ena ali dve črki, ki sledita frekvenci, označujeta vrsto stanovanja:

UniProf
Pisanje programa je pol uspeha, še vedno ga morate nekako stlačiti v krmilnik. Zato bodimo temu bolj pozorni.

Lepo bi bilo, če bi bil vaš Arduino naložen s standardnim Blinkom (priložen je iz tovarne).

Zaženimo UniProf... Morda se bo pojavilo naslednje okno:

To je povezano z vrati LPT, zato samo kliknite v redu.

Nato se odpre okno programa:

Če vrata niso pravilno izbrana, se prikaže okno z vprašanjem...

Kliknite OK in izberite želena vrata.

Če MK ni samodejno zaznan, se prikaže okno z ročno izbiro:

Na žalost ni na seznamu atmega328, torej izberemo mega32 (imajo enako količino flash pomnilnika) in pritisnite v redu.

Po tem se namesto besede neznano prikaže povezani krmilnik ...

32K je količina pomnilnika Flash in 1024 - glasnost EEPROM.

Zdaj, če je vse tako kot na sliki, odprite pomoč   in natančno preberite, kaj je tam napisano. Avtor je bil zelo jedrnat, zato vam ne bo vzelo veliko časa. Ne pritiskajte še nobenega gumba.

Ste se srečali? Super, zdaj lahko gremo naprej. Počistite polje zraven EEPROM in videli boste spremenjen vmesnik:

Ko počistite potrditveno polje EEPROM, se branje in pisanje tega pomnilniškega območja ne izvede.

Ker bomo delovali s hex datotekami, bomo odstranili "kljukice" Splošno in BIN in potrdite polje Zavora!, bo to podaljšalo čas branja/pisanja, vendar bo povečalo stabilnost.

Postopek ni hiter, zato boste morali počakati. Spodaj bodo polzeli modri kvadratki, v spodnjem desnem kotu pa bodo preštete številke. Prvi prehod bo prebral področje PROGRAM, drugi pa EEPROM.

Imam nov Arduino z vgrajenim standardnim Blinkom (ko je programator priključen, dioda preneha utripati). Če imate isto stvar, se prikaže naslednja slika:

Na desni vidimo, da v EEPROM-u ni ničesar, na levi v PROGRAMU pa je posnet program. (kot sem rekel, to je Blink). Zdaj uporabite puščico dol za pomikanje po drsniku, dokler ne zmanjka podatkov ...

... zdaj se pomaknite do konca. Videli boste več podatkov - to je zagonski nalagalnik Arduino.

Zdaj predlagam, da si vzamem odmor od svojega članka in preberem o strukturi MK, to bo močno povečalo vaše razumevanje gradiva. Vse je napisano zelo dobro in jasno. No, ko ga preberete, se vrnite in nadaljujmo ...

Počistite polje EEPROM. Res ga ne potrebujemo, vendar bo jasno, da obstaja "kljukica" Zavora!

Zdaj pa shranimo vse, kar je vdelana programska oprema v krmilniku, da jo lahko po poskusih vrnemo v prvotno stanje.

Pritisnite gumb   in shranite vdelano programsko opremo, tako da jo poimenujete kot - origProMini328.hex. To je to, zdaj imate varnostno kopijo.

... in nato kliknite že znani gumb Preberi. Po tem boste videli, da so vse celice v PROGRAMU prazne. Odstranjen ni bil samo program, ampak tudi zagonski nalagalnik Arduino.
To pomeni, da zdaj ne boste mogli naložiti skic s tradicionalno metodo. Nato, če želite, z rahlim zamahom roke obnovite vse iz varnostne kopije.

Zdaj bomo utripali krmilnik z istim »Blink«, samo napisanim v AVR Studio.

Tako izgleda koda:

#define F_CPE 16000000UL #include #vključi #define PIN_PB5 5 // PB5 (Arduino - D13) #define PIN_PB5_PORT PORTB #define PIN_PB5_DDR DDRB int main(void) ( PIN_PB5_DDR = 1<< PIN_PB5; // устанавливаем PIN_PB5 (PB5 (ардуина - D13)) как ВЫХОД while(1) { PIN_PB5_PORT = 1 << PIN_PB5; _delay_ms(300); PIN_PB5_PORT = 0 << PIN_PB5; _delay_ms(300); } return 0; }
Če uporabljaš Arduino z 8 MHz kvarcem, potem ni s tem nič narobe, le dioda bo utripala pol manj pogosto.

Evo, koliko prostora zavzame:

AVRDude

Uniprof je tako kot mnogi drugi podobni programi le grafični dodatek k programu AVRDude (AVR Downloader-Uploader), ki nato izvaja vsa zgoraj opisana dejanja na mikrokontrolerju.
Zaradi AVRDude nima lastnega grafičnega vmesnika, z njim morate delati iz ukazne vrstice. Morda se bo komu to zdelo neprijetno, a je ravno nasprotno; delo s konzole je preprosto odlično. Priročno, preprosto in ni vezano na noben OS, ker avrdude verjetno obstaja za vse. Zdaj boste videli to.

Za uporabnike

Avrdude je vključen v verigo orodij AVR, zato ga namestite (po namestitvi AVR Studio) kot je zapisano na začetku članka.

CD\
... pojdite v koren diska Z.

Z vnosom ukaza:

Če je temu tako, potem avrdude pripravljen za nadaljevanje.

Sedaj moramo v konfiguracijsko datoteko dodati naš programator avrdude (C:\Programske datoteke (x86)\Atmel\AVR Tools\AVR Toolchain\bin\ avrdude.conf) . Odprite ga v programu Beležnica++ in za napisom “DEFINICIJE PROGRAMERJA” dodajte te vrstice:

Programer id = "gromov"; desc = "pokanje serijskih vrat, reset=dtr sck=rts mosi=txd miso=cts"; vrsta = serbb; ponastavitev = 4; scck = 7; mosi = 3; miso = 8; ;
Bitno udarjanje.

Shranite in zaprite datoteko; ni več potrebna.

Vrnite se na terminal in dajte ukaz za preverjanje komunikacije med MK in programatorjem:

Avrdude -n -c gromov -P com1 -p m328p
Morda imate druga com vrata.

Namestite avrdude

Sudo apt namestite avrdude

Z vnosom ukaza:

Morali bi videti informacije o pomoči.

Če je temu tako, potem avrdude pripravljen za delo.

Konfigurirajte vrata:

Sudo stty 9600 ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflshTo morate storiti po vsakem ponovnem zagonu računalnika ali dodati v rc.local.

Kje je /dev/ttyS0 com1, /dev/ttyS1 - com2 itd.
V prihodnje bom pisal v ekipah /dev/ttyS0, morda imate /dev/ttyS1 itd.

Dodajte programator v konfiguracijsko datoteko /etc/avrdude.conf

Sudo nano /etc/avrdude.conf

Za “DEFINICIJE PROGRAMERJA” dodajte naslednje vrstice:

Programer id = "gromov"; desc = "pokanje serijskih vrat, reset=dtr sck=rts mosi=txd miso=cts"; tip = "serbb"; ponastavitev = 4; scck = 7; mosi = 3; miso = 8; ;
Programator uporablja tehnologijo Bit-banging.

Pazi, da pri kopiranju narekovaji ostanejo samo narekovaji, sicer se lahko spremenijo (zaradi razlike v kodiranju) in bo avrdude preklinjal.

Shranite in zaprite datoteko.

Podajte ukaz za preverjanje povezave med MK in programatorjem:

Sudo avrdude -n -c gromov -P /dev/ttyS0 -p m328p

Če obstaja povezava, bo odgovor tak:

Tu se razlike med operacijskimi sistemi končajo in ukazi se podvojijo.

Ukazu dodajte argument -v oz -v -v (lahko se doda poljubnim ukazom) za prikaz popolnih informacij:

Avrdude -n -v -c gromov -P com1 -p m328p ###WIN###
sudo avrdude -n -v -c gromov -P /dev/ttyS0 -p m328p ###Linux###


Zaključek Avrdude je, da sta tako v Windows kot v Linuxu enaka, zato bom od zdaj naprej slikal samo v Winu.

Tukaj je več informacij, na primer lahko vidite, katere varovalke so nameščene. Tukaj so izpisani v šestnajstiški obliki (HEX)številke. Na primer, hfuse 0xDA, v binarni obliki je videti takole - . Se pravi, to so isti bitovi, ki so odkljukani v grafičnih vmesnikih.

Ko imate opravka z varovalkami, ne pozabite, da so v mikrokrmilnikih ATmega varovalke obrnjene. To je 0 - To na Yucheno in 1 - izklopljeno Yucheno. To povzroča zmedo pri spletnih kalkulatorjih (glejte spodaj).

Preberimo firmware iz območja bliskavica (enako kot PROGRAM v uniprofu) ukaz:

Avrdude -c gromov -P com1 -p m328p -U flash:r:readfl.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:r:readfl.txt:h ###Linux###

V uniprofu je bila koda prikazana v programu, tukaj pa bo zapisana v datoteko.

Vdelana programska oprema prebrana in zapisana v datoteko readfl.txt. Pismo h (šestnajstiški) na koncu označuje, da morajo biti podatki zapisani v šestnajstiški obliki. Če napišete pismo b (binarni), bo zapisano v dvojiškem sistemu in če r (surov), potem bodo podatki v »surovi« obliki (kryakozyabra).

Od tu naprej se predpostavlja, da se uporabniki win nahajajo v korenu diska Z (C:\), in uporabniki Linuxa delajo iz svoje domače mape, zato bodo datoteke shranjene tja (če ni drugače določeno). Vdelana programska oprema, ki bo naložena v MK, mora biti tam.

Za win bo datoteka tukaj C:\readfl.txt, za linux pa v /home/user/readfl.txt. Lahko odprete to datoteko in si ogledate.

Branje EEPROM-a:

Avrdude -c gromov -P com1 -p m328p -U eeprom:r:reader.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U eeprom:r:reader.txt:h ###Linux###

Branje bliskavice in eeproma skupaj:

Avrdude -c gromov -P com1 -p m328p -U flash:r:readfl.txt:h -U eeprom:r:reader.txt:h ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:r:readfl.txt:h -U eeprom:r:reader.txt:h ###Linux###

Brisanje krmilnika:

Avrdude -e -c gromov -P com1 -p m328p ###WIN###
sudo avrdude -e -c gromov -P /dev/ttyS0 -p m328p ###Linux###

Odklopite pin za ponastavitev - dioda ne bo utripala, program bo izbrisan.

Utripajmo MK s predhodno preneseno datoteko 328test.hex. Leži v korenu diska C(c:\328test.hex) v sistemu Windows ali v domači mapi (/home/user/328test.hex) v linuxu.

Avrdude -c gromov -P com1 -p m328p -U flash:w:328test.hex ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:w:328test.hex ###Linux###

Zdaj, če izklopite "reset", bo krmilnik oživel.

Opomba. Pri utripanju MK prek avrdude, krmilnika ni potrebno brisati, program to naredi sam. Vendar, če določite parameter -D, potem MK ne bo samodejno očiščen.

Vdelana programska oprema EEPROM:

Avrdude -c gromov -P com1 -p m328p -U eeprom:w:eeprom.hex ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U eeprom:w:eeprom.hex ###Linux###

Branje vseh varovalk:

Avrdude -c gromov -P com1 -p m328p -U hfuse:r:hfuse.txt:h -U lfuse:r:lfuse.txt:h -U lock:r:lock.txt:h -U efuse:r:efuse .txt:h ###ZMAGA###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U hfuse:r:hfuse.txt:h -U lfuse:r:lfuse.txt:h -U lock:r:lock.txt:h -U efuse :r:efuse.txt:h ###Linux###

Nekateri krmilniki morda nimajo nobene varovalke.

Samo branje Nizka varovalka:

Avrdude -c gromov -P com1 -p m328p -U lfuse:r:lfuse.txt:h ###WIN###
sudo avrdude -c gromov -P com1 -p m328p -U lfuse:r:lfuse.txt:h ###Linux###

Nizka varovalka je odgovorna za izbiro vira signala ure (notranji, zunanji), njegove frekvence in premora pred zagonom krmilnika, potem ko je nanj priključeno napajanje. Zdaj imate tam napisano vrednost - 0xff, kar ustreza zunanjemu kvarcu od 8 MHz in več.

Zdaj bomo utripali še eno lfuse, ki bo vaš ATmeg prenesla na delo iz notranjega 8 MHz generatorja.

Avrdude -c gromov -P com1 -p m328p -U lfuse:w:0xe2:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U lfuse:w:0xe2:m ###Linux###

Če imate 16 MHz Arduino, bo dioda utripala dvakrat počasneje.
V prihodnje lahko pri kodiranju v AVR Studiu določite frekvenco 8 MHz in odspajkate kvarc ter tako dobite še dva brezplačna digitalna pina na razpolago.

Toda to je kasneje, zdaj pa vrnimo vse, kot je bilo, tako da utripa prejšnja varovalka:

Avrdude -c gromov -P com1 -p m328p -U lfuse:w:0xff:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U lfuse:w:0xff:m ###Linux###

Dioda bo pravilno utripala.

Varovalke lahko utripajo posamezno ali skupaj:

Avrdude -c gromov -P com1 -p m328p -U hfuse:w:0xda:m -U lfuse:w:0xff:m -U efuse:w:0x05:m ###WIN###
sudo avrdude -c gromov -P /dev/ttyS0 -p m328p -U hfuse:w:0xda:m -U lfuse:w:0xff:m -U efuse:w:0x05:m ###Linux###
Teh ukazov ni treba dati. Predstavljam jih zaradi jasnosti.

V prihodnosti, ko boste morali uporabiti druge krmilnike, boste označili polja v spletnem kalkulatorju in dobili vrednosti (povezava je v zgornjem levem kotu) v šestnajstiškem formatu in ga bliskajte.

Zdaj ostane le še določitev parametrov avrdude in lahko nadaljujete na zadnji del.

-c gromov- vrsta programerja, oziroma ime, pod katerim je zapisano v konfiguraciji (avrdude.conf).
-P kom1- No, tukaj je vse jasno.
-p m328p- oznaka tipa MK.
-U- po tej možnosti je prikazano območje pomnilnika (flash, eeprom, xfuse), na katerem bodo izvedena poljubna dejanja (r - branje, w - pisanje).
Dvopičja služijo kot ločila.

Tukaj z imeni mikrokontrolerjev in njihovimi vzdevki, programatorji in drugimi možnostmi.

Vzdevki MK

uc3a0512- AT32UC3A0512
c128- AT90CAN128
c32- AT90CAN32
c64- AT90CAN64
pwm2- AT90PWM2
pwm2b- AT90PWM2B
pwm3- AT90PWM3
pwm316- AT90PWM316
pwm3b- AT90PWM3B
1200 - AT90S1200 (****)
2313 - AT90S2313
2333 - AT90S2333
2343 - AT90S2343 (*)
4414 - AT90S4414
4433 - AT90S4433
4434 - AT90S4434
8515 - AT90S8515
8535 - AT90S8535
usb1286- AT90USB1286
usb1287- AT90USB1287
usb162- AT90USB162
usb646- AT90USB646
usb647- AT90USB647
usb82- AT90USB82
m103- ATmega103
m128- ATmega128
m1280- ATmega1280
m1281- ATmega1281
m1284p- ATmega1284P
m1284rfr2- ATmega1284RFR2
m128rfa1- ATmega128RFA1
m128rfr2- ATmega128RFR2
m16- ATmega16
m161- ATmega161
m162- ATmega162
m163- ATmega163
m164p- ATmega164P
m168- ATmega168
m168p- ATmega168P
m169- ATmega169
m16u2- ATmega16U2
m2560- ATmega2560 (**)
m2561- ATmega2561 (**)
m2564rfr2- ATmega2564RFR2
m256rfr2- ATmega256RFR2
m32- ATmega32
m324p- ATmega324P
m324pa- ATmega324PA
m325- ATmega325
m3250- ATmega3250
m328- ATmega328
m328p- ATmega328P
m329- ATmega329
m3290- ATmega3290
m3290p- ATmega3290P
m329p- ATmega329P
m32u2- ATmega32U2
m32u4- ATmega32U4
m406- ATMEGA406
m48- ATmega48
m48p- ATmega48P
m64- ATmega64
m640- ATmega640
m644- ATmega644
m644p- ATmega644P
m644rfr2- ATmega644RFR2
m645- ATmega645
m6450- ATmega6450
m649- ATmega649
m6490- ATmega6490
m64rfr2- ATmega64RFR2
m8- ATmega8
m8515- ATmega8515
m8535- ATmega8535
m88- ATmega88
m88p- ATmega88P
m8u2- ATmega8U2
t10-ATtiny10
t11- ATtiny11
t12- ATtiny12
t13- ATtiny13
t15-ATtiny15
t1634- ATtiny1634
t20- ATtiny20
t2313- ATtiny2313
t24- ATtiny24
t25- ATtiny25
t26- ATtiny26
t261- ATtiny261
t4- ATtiny4
t40- ATtiny40
t4313-ATtiny4313
t43u- ATtiny43u
t44- ATtiny44
t45- ATtiny45
t461- ATtiny461
t5- ATtiny5
t84- ATtiny84
t85- ATtiny85
t861- ATtiny861
t88- ATtiny88
t9- ATtiny9
x128a1- ATxmega128A1
x128a1d- ATxmega128A1revD
x128a1u- ATxmega128A1U
x128a3- ATxmega128A3
x128a3u- ATxmega128A3U
x128a4- ATxmega128A4
x128a4u- ATxmega128A4U
x128b1- ATxmega128B1
x128b3- ATxmega128B3
x128c3- ATxmega128C3
x128d3- ATxmega128D3
x128d4- ATxmega128D4
x16a4- ATxmega16A4
x16a4u- ATxmega16A4U
x16c4- ATxmega16C4
x16d4- ATxmega16D4
x16e5- ATxmega16E5
x192a1- ATxmega192A1
x192a3- ATxmega192A3
x192a3u- ATxmega192A3U
x192c3- ATxmega192C3
x192d3- ATxmega192D3
x256a1- ATxmega256A1
x256a3- ATxmega256A3
x256a3b- ATxmega256A3B
x256a3bu- ATxmega256A3BU
x256a3u- ATxmega256A3U
x256c3- ATxmega256C3
x256d3- ATxmega256D3
x32a4- ATxmega32A4
x32a4u- ATxmega32A4U
x32c4- ATxmega32C4
x32d4- ATxmega32D4
x32e5- ATxmega32E5
x384c3- ATxmega384C3
x384d3- ATxmega384D3
x64a1- ATxmega64A1
x64a1u- ATxmega64A1U
x64a3- ATxmega64A3
x64a3u- ATxmega64A3U
x64a4- ATxmega64A4
x64a4u- ATxmega64A4U
x64b1- ATxmega64B1
x64b3- ATxmega64B3
x64c3- ATxmega64C3
x64d3- ATxmega64D3
x64d4- ATxmega64D4
x8e5- ATxmega8E5

Uporabniki Linuxa lahko uporabljajo wine.

Upam, da ste že vse namestili, zato zaženimo AVR Studio ...


Tukaj smo pozvani, da ustvarimo nov projekt ali odpremo starega. Kliknite Nov projekt


Izberite AVR GCC, saj bomo pisali v SI, in ne v asemblerju.
Projektu damo ime in označimo polja.
Izberite Lokacija (Ustvaril sem mapo AVR na pogonu C:\) tam bodo samodejno ustvarjene mape s projekti.
Kliknite Naslednji


Izberite AVR Simulator, saj nimamo posebnega programatorja, ki bi omogočal odpravljanje napak, naš mikrokrmilnik pa je ATmega328p.
Kliknite Končaj.

Po teh manipulacijah je studio pripravljen za delo.

Na levi strani so poti do projekta. V sredini je urejevalnik besedila, v katerem je zapisana koda. Na desni strani so registri krmilnika. Spodaj levo so informacije o odpravljanju napak.

Od gumbov, ki nas trenutno zanimajo ti -

Zgradite projekt.
Zgradite projekt in začnite odpravljati napake.
Prevajanje datoteke.
Čiščenje.
Nastavitev projekta. Torej kliknite nanj ...

Tukaj lahko spremenite vrsto MK, nastavite frekvenco ure (zapisali ga bomo neposredno v kodo), raven optimizacije, pa tudi določite, katere datoteke bodo ustvarjene.
Kliknite na ikone na levi za zanimanje in kliknite Prekliči.
Ne bom razlagal teh in drugih možnosti, kasneje pa bom dal povezavo s pristojnim opisom.

Zdaj kopirajte kodo, napisano na začetku članka, in jo prilepite v urejevalnik:

V kodi smo določili taktno frekvenco, ker to zahteva knjižnica zamuda.h.

Gradnja je bila uspešna, ni bilo nobenih napak ali opozoril.

Zdaj pa pojdimo na pot C:\AVR\my328\privzeto\, tam najdemo šestnajstiško datoteko, ki smo jo ustvarili - moj328.hex in ga vstavite v krmilnik. Kaj utripati (avrdude ali uniprof) izberite sami.

V avrdude bo videti takole:

Avrdude -c gromov -P com1 -p m328p -U flash:w:\AVR\my328\default\my328.hex ###WIN###
avrdude -c gromov -P /dev/ttyS0 -p m328p -U flash:w:my328.hex ###Linux###

Onemogočite »ponastavitev« in videli boste, da dioda utripa enkrat na sekundo. Upam, da sem vas prepričal o preprostosti in priročnosti ukazne vrstice.

Če želite Arduino spremeniti nazaj v Arduino, imate varnostno kopijo.

Kot že zgoraj napisano, se ne bom spuščal v razlage dela z AVR Studio, niti ne bom učil jezika SI. Prvič, to ni bil moj načrt. (Samo želel sem pomagati pri prehodu z Arduina na AVR Studio)

IDE je integrirano razvojno okolje, ki vključuje različne predloge, knjižnice in funkcije razhroščevalnika. Če govorimo o tem, od leta 2004 zanje razvijajo zmogljiv programski paket AVR studio.

Prve različice

Prve različice studia so vključevale asembler za , lahko ga izvlečete iz prvih sestavov, kasneje pa so ta projekt opustili in za glavni jezik izbrali C AVR. Prevajalnik je bil plačan in zelo resen izdelek IAR. Lahko prenesete brezplačen WINAVR; za to ga morate po namestitvi studia namestiti.

Opomba! Bolje je, da to storite šele po namestitvi AVR studio 4 in drugih različic.

AVR studio 4 (na zgornji sliki) je bil predstavljen dolgo časa. Mnogi razvijalci mikrokontrolerjev so naleteli na to težavo. Kasneje je bil IDE nadgrajen v AVR studio 5. Razen vmesnika ni bilo posebnih sprememb in šele nato je razvijalsko podjetje izdelek preimenovalo in preimenovalo v Atmel studio 6.

Okolje AVR studio 5 je podpiralo naslednje mikrokontrolerje:

  • AVR32;
  • XMEGA.

Atmel studio 6 se je bistveno razlikoval od AVR studia 5, najbolj opazne novosti v različici pa so bile:

  1. Microsoft Visual Studio 2010 je začel sodelovati z družino AVR.
  2. Izboljšano poudarjanje sintakse v primerjavi z AVR studio 5.
  3. Dodani namigi in samodokončanje nabora ukazov, kar pospeši razvojni proces.
  4. Na splošno je celotno delovanje okolja postalo zanesljivejše.
  5. Dodana podpora za ARM Cortex-M.
  6. WinAVR ni več treba namestiti posebej, GCC se zdaj namesti med postopkom namestitve, za razliko od mlajših različic.

V Atmel studiu 6 je prišlo do preskoka na bolje za uporabnika programa, kar je vplivalo na priljubljenost družin Atmel. Vendar ni bilo mogoče doseči ustrezne podpore za ruske znake v poteh datotek.

Trenutna različica – Atmel studio 7

Razvojno okolje, ki sem ga uporabil, je bilo Visual Studio Isolated Shell 2015; po eni strani ta rešitev ni podprta v sistemu Windows XP, po drugi strani pa so bili ti ukrepi sprejeti za izboljšanje videza programa in njegove funkcionalnosti.

Morda je najpomembnejša dodana podpora za Arduino v Atmel studio 7. To pomeni, da lahko preidete od nabora preprostih skic do uporabe vseh funkcij C, odpravljanja napak, simulatorja MCU in drugih funkcij. Kombinacija Arduino in Atmel studio 7 je dala nov krog v razvoju te preproste učne platforme.

Študij studia Atmel z Arduinom bo ponudil priložnost za prehod na popolno in produktivno obvladovanje ter globlje spoznavanje srca Arduina – mikrokrmilnika Atmega.

Poleg tega lahko s spletne strani Atmel prenesete paket za delovanje in povezovanje LCD-ja. Kot primer za obvladovanje lahko uporabite LCD 1602, o njem je veliko lekcij na internetu, razvijalec pa ima na zaslonu na voljo 16 znakov in 2 vrstici.

Kje začeti z učenjem?

Začeti morate seveda z nakupom programatorja; Proračunsko najbolj prijazen je USBASP. Programator USBASP ni podprt v Atmel Studio 7.


Prenesite gonilnike za programator in program AVRdude, za skupno delovanje pa uporabite ukaz preko ukazne vrstice:

"avrdude -c usbasp -p atmega32 -U flash:w: ime datoteke vdelane programske opreme. hex -U lfuse:w:0x6a:m -U hfuse:w:0xff:m"

in omogočite njegovo podporo tako, da ustvarite profil v atmel studiu 7 (naslov – zunanja orodja) in v postavko Argumenti vnesete “-c usbasp -p atmega32 -U flash:w:$(TargetName).hex” in tako naprej za vsako vrsto uporabljate mikrokontrolerje.

Le tako lahko povežemo studio in programator USBASP. Bodite previdni pri utripanju - lahko poškodujete podpis mikrokontrolerja, obnoviti pa ga je mogoče le z 12 V (visokonapetostnim) programatorjem.

Katero literaturo naj uporabim za usposabljanje?

Najprej prenesite priročnike z uradne spletne strani za vsak mikrokrmilnik. Težko je priporočiti določen učbenik, vendar obstaja "DI Halt - AVR. Tečaj usposabljanja" ga lahko uporabite - ustvarjalec tega gradiva je praktik, avtor številnih člankov o različnih internetnih virih in preprosto cenjena oseba v strokovnih krogih.

Več kot enkrat ali dvakrat sem rekel, da je treba študij MK začeti z asemblerjem. Temu je bil namenjen cel tečaj na spletni strani (čeprav ni zelo dosleden, a ga postopoma počešem do ustreznega videza). Da, težko je, rezultat ne bo prvi dan, vendar se boste naučili razumeti, kaj se dogaja v vašem krmilniku. Vedeli boste, kako deluje, in ne boste kot opica kopirali virov drugih ljudi in poskušali razumeti, zakaj je nenadoma prenehal delovati. Poleg tega je za C veliko lažje ustvariti redneck kodo, ki bo prišla ven z vilami v najbolj neprimernem trenutku.

Na žalost si vsi želijo rezultate takoj. Zato sem se odločil, da grem v drugo smer - naredim vadnico o C-ju, vendar s prikazovanjem njegovega spodnjega perila. Dober programer za vdelavo vedno drži svoj kos strojne opreme tesno za vijak in ji ne dovoli, da naredi en sam korak brez dovoljenja. Torej, najprej bo koda C, nato kaj je proizvedel prevajalnik in kako vse skupaj dejansko deluje :)

Po drugi strani pa je močna točka C-ja prenosljivost kode. Če seveda vse pravilno napišete. Ločevanje delovnih algoritmov in njihove strojne izvedbe v različne dele projekta. Nato bo za prenos algoritma na drug mikrokrmilnik dovolj, da prepišemo le vmesniški sloj, kjer so zapisani vsi klici strojne opreme, in pustimo vso delovno kodo takšno, kot je. In seveda berljivost. Izvorna koda C je na prvi pogled lažje razumljiva (čeprav ... na primer, meni je vseeno, na kaj naj pokažem - ali C ali ASM :)), ampak, spet, če je vse pravilno napisano. Pozoren bom tudi na te točke.

Moja plošča za odpravljanje napak bo služila kot poskusna strojna oprema, na kateri bo nameščen levji delež vseh primerov.

Prvi C program za AVR

Izbira prevajalnika in nastavitev okolja
Obstaja veliko različnih prevajalnikov C za AVR:
Najprej to IAR AVR C- je skoraj zagotovo priznan kot najboljši prevajalnik za AVR, ker sam krmilnik je bil ustvarjen v tesnem sodelovanju med Atmelom in strokovnjaki iz IAR. Ampak za vse moraš plačati. In ta prevajalnik ni samo draga komercialna programska oprema, ampak ima tudi tolikšno količino nastavitev, da se je treba kar precej potruditi, da jo enostavno prevedeš v njem. Z njim res nisem razvil prijateljstva, projekt je propadal zaradi čudnih napak v fazi povezovanja (kasneje sem ugotovil, da je šlo za kriv crack).

Drugi pride WinAVR GCC- močan optimizacijski prevajalnik. Popolnoma odprta koda, več platform, na splošno vse radosti življenja. Prav tako se popolnoma integrira v AVR Studio, kar vam omogoča odpravljanje napak kar tam, kar je prekleto priročno. Na splošno sem ga izbral.

Je tudi CodeVision AVR C je zelo priljubljen prevajalnik. Postala je priljubljena zaradi svoje preprostosti. V njem lahko dobite delujoč program v samo nekaj minutah - čarovnik za zagonsko kodo to močno olajša, tako da izniči standarde za inicializacijo vseh vrst stvari. Če sem iskren, sem nekako sumljiv glede tega - ko sem moral razstaviti program, ki ga je napisal ta prevajalnik, se je izkazalo, da gre za nekakšno zmešnjavo in ne za kodo. Ogromna količina nepotrebnih premikov in operacij, kar je povzročilo precejšnjo količino kode in počasno delovanje. Vendar pa je morda prišlo do napake v DNK osebe, ki je napisala originalno programsko opremo. Poleg tega hoče denar. Ne toliko kot IAR, vendar opazno. In v demo načinu vam omogoča pisanje največ 2kb kode.
Seveda obstaja crack, ampak če boš kradel, je milijon, v IAR smislu :)

Je tudi Slika Craft AVR C in MicroC iz mikroelektronike. Ni mi bilo treba uporabiti ne enega ne drugega, ampak S.W.G. zelo pohvalno MicroPascal, pravijo, strašno priročno programsko okolje in knjižnice. Mislim, da MicroC ne bo nič slabši, vendar je tudi plačan.

Kot sem rekel, sem izbral WinAVR iz treh razlogov: je brezplačen, integrira se v AVR Studio in zanj je napisana le tona že pripravljene kode za vse priložnosti.

Torej prenesite namestitev WinAVR z AVR Studio. Nato je najprej nameščen studio, nato pa je WinAVR nameščen na vrhu in pritrjen na studio v obliki vtičnika. Močno priporočam namestitev WinAVR na kratko pot, nekaj takega kot C:\WinAVR, tako se boste izognili številnim težavam s potmi.

Ustvarjanje projekta
Torej, studio je nameščen, C je privit, čas je, da poskusimo nekaj programirati. Začnimo s preprostim, najbolj preprostim. Zaženite studio, tam izberite nov projekt kot prevajalnik AVR GCC in vnesite ime projekta.

Odpre se delovno polje s prazno datoteko *.c.

Zdaj ne bo škodilo, če konfigurirate prikaz poti v zaznamkih studia. Če želite to narediti, pojdite na:
Meni Orodja - Možnosti - Splošno - Zavihki datotek in na spustnem seznamu izberite "Samo ime datoteke". V nasprotnem primeru bo nemogoče delovati - zavihek bo vseboval celotno pot datoteke in na zaslonu ne bo več kot dveh ali treh zavihkov.

Nastavitev projekta
Na splošno velja, da je klasična izdelava make datoteke, v kateri so opisane vse odvisnosti. In verjetno je tako. Toda zame, ki sem odraščal s popolnoma integriranimi IDE-ji, kot je uVision oz AVR Studio ta pristop je globoko tuj. Zato bom naredil po svoje, vse v studiu pomeni.

Pritisnite gumb z orodjem.


To so nastavitve za vaš projekt oziroma nastavitve za samodejno generiranje make datoteke. Na prvi strani morate samo vnesti frekvenco, na kateri bo deloval vaš MK. To je odvisno od bitov varovalke, zato predpostavljamo, da je naša frekvenca 8000000Hz.
Bodite pozorni tudi na optimizacijsko vrstico. Zdaj je tu -Os - to je optimizacija velikosti. Zaenkrat pustite tako, kot je, nato pa se lahko poskusite igrati s tem parametrom. -O0 sploh ni optimizacija.

Naslednji korak je konfiguracija poti. Najprej dodajte svoj projektni imenik tja - tja boste dodali knjižnice tretjih oseb. Na seznamu bo prikazana pot ».\«.

Datoteka Make je bila ustvarjena, lahko si jo ogledate v privzeti mapi v vašem projektu, samo poglejte in poglejte, kaj je tam.


To je vse za zdaj. Povsod kliknite V redu in pojdite na vir.

Oblikovanje problema
Prazen list papirja je vabljiv za izvedbo kakšne zvite ideje, saj banalno utripanje diode ne deluje več. Takoj primemo bika za roge in vzpostavimo povezavo z računalnikom – to je prva stvar, ki jo naredim.

Delovalo bo takole:
Ko na COM vrata prispe ena (koda 0x31), diodo prižgemo, ko pride ničla (koda 0x30), pa ugasne. Poleg tega bo vse narejeno na prekinitvah, naloga v ozadju pa bo utripanje druge diode. Enostavno in smiselno.

Sestavljanje vezja
Pretvorniški modul USB-USART moramo povezati z zatiči USART mikrokontrolerja. Če želite to narediti, vzemite mostiček iz dveh žic in ga navzkrižno položite na nožice. To pomeni, da priključimo Rx krmilnika na Tx pretvornika in Tx pretvornika na Rx krmilnika.

Na koncu je to diagram:


Ne razmišljam o povezovanju preostalih zatičev, napajanja ali ponastavitve, to je standardno.

Pisanje kode

Naj takoj rezerviram, da se ne bom posebej poglabljal v opis samega jezika C. Za to obstaja preprosto ogromna količina gradiva, od klasičnega »programskega jezika C« od K&R do različnih priročnikov.

Eno takšno metodo sem našel v svoji zalogi; nekoč sem jo uporabil za študij tega jezika. Vse je kratko, jasno in jedrnato. Postopoma ga sestavljam in vlečem na svojo spletno stran.

Res je, da vsa poglavja še niso prenesena, a mislim, da ne bo dolgo.

Malo verjetno je, da ga bom lahko bolje opisal, zato bom iz tečaja usposabljanja namesto podrobne razlage tankosti preprosto zagotovil neposredne povezave do posameznih strani tega priročnika.

Dodajanje knjižnic.
Najprej dodamo potrebne knjižnice in glave z definicijami. Konec koncev je C univerzalen jezik in mu moramo razložiti, da delamo posebej z AVR, zato napišite vrstico v izvorno kodo:

1 #vključi

#vključi

Ta datoteka se nahaja v mapi WinAVR in vsebuje opis vseh registrov in vrat krmilnika. Poleg tega je vse tam zvito, z vezavo na določen krmilnik, ki ga prevajalnik prenaša prek narediti datoteka v parametru MCU in na podlagi te spremenljivke je z vašim projektom povezana datoteka glave z opisom naslovov vseh vrat in registrov za ta določen krmilnik. Vau! Brez tega je tudi mogoče, vendar potem ne boste mogli uporabljati simboličnih imen registrov, kot sta SREG ali UDR, in si boste morali zapomniti naslov vsakega, kot je "0xC1", kar bo povzročilo glavobol.

Sama ekipa #vključi<имя файла> vam omogoča, da svojemu projektu dodate vsebino katere koli besedilne datoteke, na primer datoteko z opisom funkcij ali del druge kode. In da bi lahko direktiva našla to datoteko, smo določili pot do našega projekta (imenik WinAVR je tam že privzeto registriran).

Glavna funkcija.
Program C je v celoti sestavljen iz funkcij. Lahko jih ugnezdimo in kličemo drug od drugega v poljubnem vrstnem redu in na različne načine. Vsaka funkcija ima tri zahtevane parametre:

  • Povratna vrednost je npr. greh(x) vrne vrednost sinusa x. Kot pri matematiki, skratka.
  • Preneseni parametri so enaki X.
  • Funkcijsko telo.

Vse prenesene in vrnjene vrednosti morajo biti določene vrste, odvisno od podatkov.

Vsak program C mora vsebovati funkcijo glavni kot vstopna točka v glavni program, sicer sploh ni C :). Po prisotnosti glavnega v izvorni kodi nekoga drugega iz milijona datotek lahko razumete, da je to glavni del programa, kjer se vse začne. Torej vprašajmo:

1 2 3 4 5 int main(void) ( return 0 ; )

int main(void) ( vrni 0; )

To je to, prvi najpreprostejši program je napisan, ni važno, da nič ne naredi, šele začeli smo.

Ugotovimo, kaj smo naredili.
int To je podatkovni tip, ki ga vrne glavna funkcija.

Seveda v mikrokontrolerju glavni načeloma ni mogoče vrniti ničesar in v teoriji bi moralo biti void main(void), vendar je GCC prvotno zasnovan za osebni računalnik in tam lahko program po zaključku vrne vrednost operacijskemu sistemu. Zato GCC naprej void main(void) prisega na Opozorilo.

To ni napaka, delovalo bo, vendar ne maram opozoril.

praznina to je vrsta podatkov, ki jih v tem primeru posredujemo funkciji glavni tudi ne more sprejeti ničesar od zunaj, torej praznina- lutka. Škrbina se uporablja, ko ni treba ničesar pošiljati ali vračati.

Tukaj so { } zavit oklepaj je programski blok, v tem primeru telo funkcije glavni, se bo koda nahajala tam.

vrnitev- to je povratna vrednost, ki jo bo glavna funkcija vrnila po zaključku, ker imamo int, torej število, potem moramo vrniti število. Čeprav to še vedno nima smisla, ker... na mikrokrmilniku ne moremo iti nikamor od glavnega. Vrnem nič. Ker je vseeno. Toda prevajalnik je običajno pameten in za ta primer ne ustvari kode.
Čeprav, če je sprevržen, potem iz glavni Lahko greste na MK - na primer, padete v razdelek zagonskega nalagalnika in ga izvedete, vendar bo to zahtevalo nizko raven popravljanja vdelane programske opreme, da bi popravili prehodne naslove. Spodaj se boste sami prepričali in razumeli, kako to storiti. Za kaj? To je drugo vprašanje, v 99,999% primerov to ni potrebno :)

Uspelo nam je in šli naprej. Dodajmo spremenljivko, res je ne potrebujemo in brez nje nima smisla uvajati spremenljivk, se pa učimo. Če so spremenljivke dodane znotraj telesa funkcije, potem so lokalne in obstajajo samo v tej funkciji. Ko zapustite funkcijo, se te spremenljivke izbrišejo, pomnilnik RAM pa se dodeli za pomembnejše potrebe. .

1 2 3 4 5 6 int main(void) (unsigned char i; return 0;)

int main(void) (unsigned char i; return 0; )

nepodpisan pomeni nepodpisano. Dejstvo je, da je v binarni predstavitvi najpomembnejši bit dodeljen znaku, kar pomeni, da se število +127/-128 prilega enemu bajtu (char), če pa znak zavržemo, se prilega od 0 do 255. Običajno znak ni potreben. torej nepodpisan.
jaz je samo ime spremenljivke. Nič več.

Zdaj moramo inicializirati vrata in UART. Seveda lahko vzamete in povežete knjižnico ter pokličete nekakšen UartInit(9600); potem pa ne boste vedeli, kaj se je v resnici zgodilo.

Naredimo to:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main(void) (unsigned char i; #define XTAL 8000000L #define baudrate 9600L #define bauddivider (XTAL/(16*baudrate)-1)#define HI(x) ((x)>>8) #define LO(x) ((x)& 0xFF) UBRRL = LO(bauddivider) ; UBRRH = HI(bauddivider) ; UCSRA = 0; UCSRB = 1<< RXEN| 1 << TXEN| 1 << RXCIE| 0 << TXCIE; UCSRC = 1 << URSEL| 1 << UCSZ0| 1 << UCSZ1; }

int main(void) ( unsigned char i; #define XTAL 8000000L #define baudrate 9600L #define bauddivider (XTAL/(16*baudrate)-1) #define HI(x) ((x)>>8) #define LO( x) ((x)& 0xFF) UBRRL = LO(bauddivider); UBRRH = HI(bauddivider); UCSRA = 0; UCSRB = 1<

Strašljivo? Pravzaprav obstaja samo pet zadnjih vrstic prave kode. Vse, to #definiraj je predprocesorski makro jezik. Skoraj enake stvari kot v Assembly, vendar je sintaksa nekoliko drugačna.

Olajšali vam bodo rutinske operacije izračunavanja potrebnih koeficientov. V prvi vrstici rečemo, da namesto tega XTAL lahko varno zamenjate 8000000, in L- navedba tipa, pri čemer je long urna frekvenca procesorja. Enako baudrate— frekvenca prenosa podatkov prek UART.

bauddividerže bolj zapleteno, namesto njega bo zamenjan izraz, izračunan po formuli iz prejšnjih dveh.
No in L.O. in HI nizki in visoki bajti bodo vzeti iz tega rezultata, ker Očitno se morda ne prilega enemu bajtu. IN HI X (vhodni parameter makra) se premakne osemkrat v desno, zaradi česar ostane samo najpomembnejši bajt. In v L.O. naredimo bitni IN s številko 00FF, posledično bo ostal samo spodnji bajt.

Torej je vse, kar je narejeno, podobno #definiraj lahko varno zavržete, potrebne številke pa izračunate na kalkulatorju in jih takoj vnesete v vrstice UBBRL = …. in UBBRH = …..

Lahko. Ampak! To storite POPOLNOMA NEMOGOČE!

Delovalo bo tako ali drugače, vendar boste imeli t.i magične številke- vrednote, ​​vzete od nikoder in iz neznanih razlogov, in če čez nekaj let odprete tak projekt, bo presneto težko razumeti, kaj so te vrednote. Tudi zdaj, če hočeš spremeniti hitrost, ali spremeniti frekvenco kvarca, bo treba vse znova izračunati, ampak si spremenil par številk v kodi in to je to. Na splošno, če ne želite, da vas označijo za kodirnika, naredite kodo tako, da bo lahko berljiva, razumljiva in enostavna za spreminjanje.

Potem je vse preprosto:
Vsi ti “UBRRL in Co” so konfiguracijski registri UART oddajnika, s pomočjo katerega bomo komunicirali s svetom. In zdaj smo jim dodelili zahtevane vrednosti, jih nastavili na želeno hitrost in način.

Vrsta snemanja 1< Pomeni naslednje: vzemite 1 in ga postavite na mesto RXEN v bajtu. RXEN to je 4. bit registra UCSRB, Torej 1< tvori binarno število 00010000, TXEN- to je 3. bit in 1< bo dal 00001000. En sam "|" bitno je ALI, torej 00010000 | 00001000 = 00011000. Na enak način se nastavijo preostali potrebni konfiguracijski biti in dodajo splošni kopici. Posledično se zbrana številka zabeleži v UCSRB. Več podrobnosti je opisanih v podatkovnem listu na MK v razdelku USART. Naj nas torej ne zamotijo ​​tehnične podrobnosti.

Končano, čas je, da vidimo, kaj se je zgodilo. Kliknite kompilacijo in zaženite emulacijo (Ctrl+F7).

Odpravljanje napak
Vrstile so se najrazličnejše vrstice napredka, studio se je spremenil in blizu vhoda v glavno funkcijo se je pojavila rumena puščica. Tukaj se trenutno izvaja procesor in simulacija je začasno ustavljena.

Dejstvo je, da je bilo na začetku pravzaprav na liniji UBRRL = LO(bauddivider); Navsezadnje to, kar imamo v definiciji, ni koda, ampak le predhodni izračuni, zato je simulator nekoliko dolgočasen. Zdaj pa je spoznal, da je prvo navodilo opravljeno in če splezaš na drevo V/I pogled, v razdelek USART in tam poglejte bajt UBBRL, videli boste, da je vrednost že tam! 0x33.

Naredite še korak naprej. Oglejte si, kako se spreminja vsebina drugega registra. Torej pojdite skozi vse, bodite pozorni na dejstvo, da so vsi označeni biti nastavljeni, kot sem vam povedal, in so nastavljeni hkrati za celoten bajt. Dlje od Vrnitve ne bo šlo - programa je konec.

Otvoritev
Zdaj ponastavite simulacijo na nič. Kliknite tam Ponastavi (Shift+F5). Odprite razstavljen seznam, zdaj boste videli, kaj se dejansko dogaja v krmilniku. Pogled -> Disassembler. In ne JAAAAAAA!!! Sestavljalec!!! GROZA!!! IN JE NUJNO. Da kasneje, ko gre kaj narobe, ne boš neumen v kodi in ne postavljaš neumnih vprašanj na forumih, ampak se takoj poglobi v drobovje in vidiš, kje si se zataknil. Tam ni nič strašnega.

Najprej bodo vrhovi iz serije:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 +00000000: 940C002A JMP 0x0000002A Skok +00000002: 940C0034 JMP 0x00000034 Skok +00000004: 940C0034 JMP 0x00000034 Skok +00000006: 940C0034 JMP 0x00000034 Skok +00000008: 940C0034 JMP 0x00000034 Skok +0000000A: 940C0034 JMP 0x00000034 Skok +0000000C: 940C0034 JMP 0x00000034 Skok + 0000000E: 940C0034 JMP 0x00000034 Skok +00000010: 940C0034 JMP 0x00000034 Skok +00000012: 940C0034 JMP 0x00000034 Skok +00000014: 940C0034 JMP 0x00000034 Skok +00000016: 940C0034 JMP 0x00000034 Skok +00000018: 940C0034 JMP 0x00000034 Skok +0000001A: 940C0034 JMP 0x00000034 Skok +0000001C : 940C0034 JMP 0x00000034 Jump +0000001E: 940C0034 JMP 0x00000034 Jump +00000020: 940C0034 JMP 0x00000034 Jump +00000022: 940C0034 JMP 0x000000 34 Skok +00000024: 940C0034 JMP 0x00000034 Skok +00000026: 940C0034 JMP 0x00000034 Skok +00000028: 940C0034 JMP 0x00000034 Skok

00000000: 940C002A JMP 0x0000002A Skok +00000002: 940C0034 JMP 0x00000034 Skok +00000004: 940C0034 JMP 0x00000034 Skok +00000006: 940C0034 JMP 0x00000034 Skok +00000008: 940C0034 JMP 0x00000034 Skok +0000000A: 940C0034 JMP 0x00000034 Skok +0000000C: 940C0034 JMP 0x00000034 Skok +0000000E : 940C0034 JMP 0x00000034 Skok +00000010: 940C0034 JMP 0x00000034 Skok +00000012: 940C0034 JMP 0x00000034 Skok +00000014: 940C0034 JMP 0x000000 34 Skok +00000016: 940C0034 JMP 0x00000034 Skok +00000018: 940C0034 JMP 0x00000034 Skok +0000001A: 940C0034 JMP 0x00000034 Skok +0000001C : 940C0034 JMP 0x00000034 Jump +0000001E: 940C0034 JMP 0x00000034 Jump +00000020: 940C0034 JMP 0x00000034 Jump +00000022: 940C0034 JMP 0x000000 34 Skok +00000024: 940C0034 JMP 0x00000034 Skok +00000026: 940C0034 JMP 0x00000034 Skok +00000028: 940C0034 JMP 0x00000034 Skok

To je tabela vektorjev prekinitev. K temu se bomo vrnili kasneje, za zdaj pa samo poglejte in se spomnite, da obstaja. Prvi stolpec je naslov bliskovne celice, v kateri je ukaz, drugi je koda ukaza, tretji je mnemonika ukaza, isto navodilo za sestavljanje, tretji so operandi ukaza. No, samodejni komentar.
Torej, če pogledate, obstajajo neprekinjeni prehodi. In koda ukaza JMP je štiribajtna, vsebuje naslov skoka, zapisan nazaj - nizki bajt na nizkem naslovu in kodo ukaza skoka 940C

0000002B: BE1F OUT 0x3F,R1 Out to I/O location

Snemanje te ničle na naslov 0x3F.Če pogledate stolpec pogleda I/O, boste videli, da je naslov 0x3F naslov registra SREG - registra zastavic krmilnika. Tisti. ponastavimo SREG za izvajanje programa pod ničelnimi pogoji.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F Naloži takoj +0000002D: E0D4 LDI R29,0x04 Naloži takoj +0000002E: BFDE OUT 0x3E,R29 Out to I/O location +0000002F: BFCD OUT 0x3D,R28 Out to I/O location

0000002C: E5CF LDI R28,0x5F Naloži takoj +0000002D: E0D4 LDI R29,0x04 Naloži takoj +0000002E: BFDE OUT 0x3E,R29 Out to I/O location +0000002F: BFCD OUT 0x3D,R28 Out to I/O location

To je nalaganje kazalca sklada. Ne morete neposredno nalagati v V/I registre, samo prek vmesnega registra. Zato najprej LDI do vmesnega, nato pa od tam OUT do I/O. Kasneje vam bom povedal tudi več o skladu. Za zdaj vedite, da je to območje dinamičnega pomnilnika, ki visi na koncu RAM-a in shranjuje naslove in vmesne spremenljivke. Zdaj smo navedli, od kod se bo začel naš sklad.

00000032: 940C0041 JMP 0x00000041 Skok

Skoči na sam konec programa in tam imamo prepoved prekinitev in tesno zanko samega sebe:

1 2 +00000041: 94F8 CLI Global Interrupt Disable +00000042: CFFF RJMP PC-0x0000 Relativni skok

00000041: 94F8 CLI Global Interrupt Disable +00000042: CFFF RJMP PC-0x0000 Relativni skok

To je v primeru nepredvidenih okoliščin, kot je izstop iz glavne funkcije. Krmilnik je mogoče odstraniti iz takšne zanke s ponastavitvijo strojne opreme ali, bolj verjetno, s ponastavitvijo psa čuvaja. No, ali pa, kot sem rekel zgoraj, popravimo to v hex urejevalniku in oddirjamo, kamor nam srce poželi. Upoštevajte tudi, da obstajata dve vrsti prehodov: JMP in RJMP; prvi je neposreden prehod na naslov. Zavzema štiri bajte in lahko neposredno skače skozi celotno območje pomnilnika. Druga vrsta prehoda je RJMP - relativni. Njegov ukaz traja dva bajta, vendar se premakne s trenutnega položaja (naslova) 1024 korakov naprej ali nazaj. In njegovi parametri kažejo odmik od trenutne točke. Uporablja se pogosteje, ker pri izpiranju zavzame polovico prostora in redko so potrebni dolgi prehodi.

1 +00000034: 940C0000 JMP 0x00000000 Skok

00000034: 940C0000 JMP 0x00000000 Skok

In to je skok na sam začetek kode. Nekakšen ponovni zagon. Tukaj lahko preverite, ali vsi vektorji skačejo. Zaključek iz tega je, da če zdaj omogočite prekinitve (privzeto so onemogočene) in se vaša prekinitev pojavi, vendar ni upravljalnika, potem bo prišlo do ponastavitve programske opreme - program bo vrnjen nazaj na sam začetek.

Glavna funkcija. Vse je podobno, ni vam treba niti opisovati. Samo poglejte že izračunano število, ki se vpisuje v registre. Predprocesor prevajalnika je neverjeten!!! Torej brez "čarobnih" številk!

1 2 3 4 5 6 7 8 9 10 11 12 <

00000036: E383 LDI R24,0x33 Nalaganje takoj +00000037: B989 OUT 0x09,R24 Izhod na V/I lokacijo 15: UBRRH = HI(bauddivider); +00000038: BC10 OUT 0x20,R1 Izhod na V/I lokacijo 16: UCSRA = 0; +00000039: B81B OUT 0x0B,R1 Out to I/O location 17: UCSRB = 1<

In tukaj je napaka:

1 2 3 +0000003E: E080 LDI R24.0x00 Naloži takoj +0000003F: E090 LDI R25.0x00 Naloži takoj +00000040: 9508 RET Vrnitev podprograma

0000003E: E080 LDI R24.0x00 Naloži takoj +0000003F: E090 LDI R25.0x00 Naloži takoj +00000040: 9508 RET Vrnitev podprograma

Vprašanje je, zakaj prevajalnik dodaja takšne vrhove? In to ni nič drugega kot Return 0, funkcijo smo definirali kot int main(void) in tako smo zapravili še štiri bajte za nič :) In če naredite void main(void), bo ostal samo RET, vendar se bo pojavilo opozorilo , da naša glavna funkcija ne vrne ničesar. Na splošno naredite, kot želite :)

Težko? Očitno ne. Kliknite na izvajanje korak za korakom v načinu disassemblerja in si oglejte, kako procesor izvaja posamezna navodila, kaj se zgodi z registri. Kako poteka premikanje skozi ukaze in končno zanko?

Nadaljevanje čez par dni...

Offtop:
Aleksej78 Ustvaril sem vtičnik za Firefox, ki olajša krmarjenje po mojem spletnem mestu in forumu.
Razprava in prenos,

Atmel Studio je integrirana razvojna platforma, ki omogoča načrtovanje in odpravljanje napak v aplikacijah, razvitih za mikrokontrolerje Atmel, ki temeljijo na procesorski arhitekturi serije ARM Cortex-M. Atmel Studio je brezhibno okolje, preprosto za uporabo, ki omogoča odpravljanje napak in gradnjo aplikacij, ustvarjenih v C/C++ ali zbirnem jeziku. Ima vgrajeno obsežno knjižnico popolnoma brezplačne izvorne kode Atmel Software Framework, ki vključuje več kot 1600 projektov za arhitekture ARM in AVR. Imeti takšno knjižnico je velik bonus za vsakega programerja. Ta IDE se lahko uporablja za programiranje najrazličnejših mikrokrmilnikov, ki temeljijo na AVR, kot tudi bliskovnih mikrokrmilnikov, ki temeljijo na Atmel SAM3 in uporabljajo jedra Cortex-M3, Cortex-M4.

Atmel Studio vključuje tudi orodja, ki bodo vsakemu programerju zelo olajšala življenje. Platforma vključuje rešitve, kot sta Atmel Spaces in Atmel Gallery. Atmel Gallery je spletna trgovina z razvojnimi orodji in integrirano programsko opremo. Atmel Spaces je prostor v oblaku za skupen razvoj in shranjevanje projektnih datotek strojne in programske opreme za mikrokrmilnike Atmel.

Ključne značilnosti in funkcije

  • je popolnoma brezplačno integrirano razvojno okolje;
  • podpira jezike C/C++ in Assembler;
  • priložena podrobna dokumentacija;
  • vključuje obsežno knjižnico s primeri izvorne kode za različne aplikacije;
  • namenjen programiranju mikrokrmilnikov Atmel.

Posebne zahteve

  • taktna frekvenca procesorja 1,6 GHz in več;
  • za 32-bitne sisteme od 1 GB RAM-a;
  • za 64-bitne sisteme od 2 GB RAM-a;
  • pri izvajanju na virtualnem računalniku je priporočljivo dodatnih 512 MB RAM-a;
  • 6 GB prostega prostora na trdem disku.

Kaj je novega v tej različici?

7.0.790 (25.02.2016)

  • dodana podpora za razširjeni razhroščevalnik (EDBG);
  • dodana podpora za profile nastavitev vmesnika. Med profili lahko preklapljate s tipkami na plošči z nastavitvami;
  • dodana možnost uvoza knjižnic v predhodno uvožene projekte. Dodana podpora za Arduino Zero in Zero Pro;
  • vzporedna gradnja je zdaj privzeto omogočena;
  • posodobljena vdelana programska oprema za Xplained Mini;
  • Funkcija »Prikaži vse datoteke« v Raziskovalcu rešitev je bila popravljena.