AVR: programmering i AVR Studio-miljøet. Integrert feilsøkingsmiljø AVR Studio fra Atmel Avr studio

For å jobbe med AVR Studio 4 må du installere det selv. Hvis det allerede er installert, kan du hoppe over dette trinnet.

Installasjon:
lag en katalog c:/avr/ - det er her arbeidsprogrammene vil bli plassert.
lag en katalog, for eksempel c:/works/ – det er her verkene dine vil bli lagret.
Det er nødvendig at det finnes snarveier slik at det ikke er problemer med dem.

Det er generelt AVRStudio5, men AVRStudio4 er fortsatt ganske nok.

Alt arbeid vil foregå i AVRStudio4, WinAVR er kun nødvendig på grunn av AVR-GCC-biblioteket (Slik at du kan skrive i C)
MEN! Du må installere WinAVR først, ellers vil ikke AVR-GCC-biblioteket bli hentet.

Jeg tror du finner ut av det her.
AVR-GCC for skriving i C
Atmel Avr Assembler henholdsvis for montør.

Det er bedre å begynne å forstå MK fra bunnen av. Og dette betyr fra Assembler, som betyr at du lager den som er Atmel AVR Assembler.

Velg deretter Atmega8-mikrokontrolleren.

når prosjektet er opprettet, vil det være et stort, hvitt, blankt ark. det vil være en kode her.

litt om innholdet i dette arket

"kommentarer" er tekst som kompilatoren hopper over når den kompileres.
det må være et spesielt symbol før begynnelsen av kommentaren, jeg bruker symbolet; "semikolon", det er også "dobbel skråstrek" (//),
her er eksempler på kommentarer

/* * En kommentar av denne typen (flerlinje), * brukes vanligvis for * medfølgende informasjon * om kildekoden, dvs. * navn, utvikler osv. */ NOP // Denne kommentaren brukes hovedsakelig for å forklare hensikten med en kommando, eller et kodestykke SLEEP ; Denne kommentaren, akkurat som den forrige, kan brukes til forklaring (for notater) i koden

kommandoer skrives på hver linje. de. én kommando - én linje.
La oss si at det er kommandoer med to "parametere", med en eller uten noe

MOV R16, R17; to parametere INC R16 ; en SEI-parameter; uten parametere

MOV R16, R17; tre byte INC R16; to byte SEI ; én byte

Ser du sammenhengen mellom lagstørrelse og parametere?

Hver mikrokontroller har sin egen assembler, selv om deres mnemonikk er like, dvs. MOV-kommandoen for MK av en serie vil se i maskinkode, si 0x12, og for en annen 0x55.
For at det under kompilering vil bli kompilert i koden vi trenger, må vi fortelle kompilatoren hvilken mikrokontroller vi skriver programmet for.
Dette velges vanligvis når du oppretter et prosjekt.
Av denne grunn valgte vi Atmega8 mikrokontroller.

Men det er ikke alt. For å gjøre livet vårt enklere, har AVRStudio4 et sett med konstanter, som kalles noe sånt som "Macroassembler".

For å laste dem må du sette inn linjen i begynnelsen av koden

Inkluder "m8def.inc" // ved å bruke .include-kommandoen lastet vi m8def.inc-filen; og nå vil det bli enklere for oss;)

Helt i begynnelsen av koden plasseres en avbruddstabell. Jeg vil forklare hva det er og hvordan det fungerer i et annet innlegg. Men foreløpig, la oss skrive det slik:

RJMP RESET ; Tilbakestill behandler RETI; RJMP EXT_INT0 ; IRQ0 Handler RETI; RJMP EXT_INT1 ; IRQ1 Handler RETI; RJMP TIM2_COMP ; Timer2 Sammenlign Handler RETI; RJMP TIM2_OVF ; Timer2 Overløpshåndterer RETI; RJMP TIM1_CAPT ; Timer1 Capture Handler RETI; RJMP TIM1_COMPA ; Timer1 SammenlignA Handler RETI; RJMP TIM1_COMPB ; Timer1 SammenlignB Handler RETI; RJMP TIM1_OVF ; Timer1 Overløpshåndtering RETI; RJMP TIM0_OVF ; Timer0 Overløpshåndtering RETI; RJMP SPI_STC ; SPI Overføring Komplett Handler RETI; RJMP USART_RXC ; USART RX Complete Handler RETI; RJMP USART_UDRE ; UDR Tom Handler RETI; RJMP USART_TXC ; USART TX komplett håndtering RETI; RJMP ADC ; ADC Conversion Complete Handler RETI; RJMP EE_RDY ; EEPROM Ready Handler RETI; RJMP ANA_COMP ; Analog Comparator Handler RETI; RJMP TWSI ; To-tråds seriell grensesnittbehandler RETI; RJMP SPM_RDY ; Lagre Program Memory Ready Handler

Etter dette kommer selve koden

OMSTART: ; initialiseringstoken MAIN: NOP ; hovedsløyfemarkør RJMP MAIN

Men det er én (eller rettere sagt ikke én, men mange) funksjoner.

For å gjøre det enklere å skrive kode, for dens klarhet og for å lette relative overganger, fikk vi markører, hvordan ser de ut? "RESET:" og "MAIN:" er markører; deres navn kan inneholde nesten alle latinske tegn og tall. Markører kan ikke ha navn på funksjoner og kommandoer, for eksempel "NOP".
Hvordan kommer man til dem? La oss si RJMP-kommandoen.

Fra Markers kan vi også lage en subrutine (prosedyre), når den er fullført, kommer vi tilbake til der den ble kalt fra. For å kalle det, bruk kommandoen "RCALL (subrutine)", og for å gå tilbake fra subrutinen (prosedyre), må du avslutte den med kommandoen "RET". Vi bør ende opp med kode som dette:

OMSTART: HOVED: NOP RCALL PPP1 ; kall subrutinen RJMP MAIN PPP1: NOP RET ; gå ut av subrutinen

Hvordan "RCALL"-kommandoen fungerer, når den kalles, plasseres adressen som den ble oppringt fra på STAKKEN, og når "RET"-kommandoen kalles, fjernes den fra "stack"-registeret. STAKKEN må initialiseres.

For at vi skal kunne jobbe med vår MK, må vi initialisere den. fordi mk, denne enheten er universell, den har mange inngangs-/utgangsporter og eksterne enheter. som USART, PWM, DAC, ADC, etc. Det første trinnet i initialiseringen av mikrokontrolleren er å indikere begynnelsen av "stabelen". Vi utfører initialisering etter "RESET:"-markøren.

LDI R16,HØY(RAMEND) UT SPH,R16 LDI R16,LAV(RAMEND) UT SPL,R16

Hvis vi ikke hadde skrevet inn kommandoen .include “m8def.inc” i begynnelsen av koden, ville vi ha måttet skrive det slik:

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

Forskjellen er betydelig, etter min mening.

STACK er et lagringsminne: (sist inn, først ut).
Butikktypen er ikke et supermarked, men et horn fra et maskingevær. Jeg håper alle kan forestille seg hvordan kassetter lastes inn i den og hvordan de deretter fjernes derfra.
Du må betale mye oppmerksomhet til STACK-minnet, fordi... Enhver mindre feil i arbeidet med den kan føre til stabelfeil. Dette er et så viktig emne at jeg bestemte meg for å dedikere et helt emne til det og vil skrive det i et eget notat.

Dermed fikk vi følgende kode:

Inkluder "m8def.inc" RJMP RESET ; Tilbakestill behandler RETI; RJMP EXT_INT0 ; IRQ0 Handler RETI; RJMP EXT_INT1 ; IRQ1 Handler RETI; RJMP TIM2_COMP ; Timer2 Sammenlign Handler RETI; RJMP TIM2_OVF ; Timer2 Overløpshåndterer RETI; RJMP TIM1_CAPT ; Timer1 Capture Handler RETI; RJMP TIM1_COMPA ; Timer1 SammenlignA Handler RETI; RJMP TIM1_COMPB ; Timer1 SammenlignB Handler RETI; RJMP TIM1_OVF ; Timer1 Overløpshåndtering RETI; RJMP TIM0_OVF ; Timer0 Overløpshåndtering RETI; RJMP SPI_STC ; SPI Overføring Komplett Handler RETI; RJMP USART_RXC ; USART RX Complete Handler RETI; RJMP USART_UDRE ; UDR Tom Handler RETI; RJMP USART_TXC ; USART TX komplett håndtering RETI; RJMP ADC ; ADC Conversion Complete Handler RETI; RJMP EE_RDY ; EEPROM Ready Handler RETI; RJMP ANA_COMP ; Analog Comparator Handler RETI; RJMP TWSI ; To-tråds seriell grensesnitthåndterer RETI; RJMP SPM_RDY ; Lagre programminne klar Håndter RESET: LDI R16,HIGH(RAMEND) OUT SPH,R16 LDI R16,LOW(RAMEND) OUT SPL,R16 RGMP RESET MAIN: NOP ; hovedsløyfemarkør RJMP MAIN

På dette stadiet kan vi kompilere prosjektet og kjøre det for feilsøking, men siden koden vår ikke gjør noe, vil det kun være mulig å identifisere syntaksfeil i koden.

For riktig feilsøkingsprosess må du stille inn emulatoren frekvensen som MK skal fungere med, dette gjøres bare etter kompilering og start av feilsøking,
Dette betyr at vi finner "Bygg" i menylinjen, åpner den og ser "Bygg og kjør", hvoretter vi vil se en gul pil på motsatt side av den første kommandoen i kodelisten vår. Nå ser vi etter "Debug" i menylinjen og klikker på "AVR Simulator Options", følgende vindu åpnes:

Der vi kan endre MK og dens frekvens, også, på panelet til høyre, ser vi litt informasjon om vår MK: dens maksimale frekvens, minnekapasitet (EEPROM, RAM, FLASH). Åpne nå dataarket på Atmega8, på side 203 (generell liste over registre) og 205 (generell liste over kommandoer) og begynn å skrive programmet.
Og husk, ikke vær redd for å eksperimentere med simulatoren, den går ikke i stykker!


Hallo.

Denne artikkelen vil appellere til de som tror at de har "vokst opp" fra Arduino og er klare til å gå inn i verden av "seriøs" mikrokontrollerprogrammering. I tillegg til at du vil "pumpe opp programmererens ferdigheter", vil du ha muligheten til å velge hvilken som helst mikrokontroller for prosjektene dine, og selvfølgelig vil du sette pris på hastigheten til programmene og størrelsen på minnet de opptar.

Alt vil bli beskrevet (for    ), fra start til slutt, - installasjon og klargjøring av nødvendig programvare, montering av den enkleste "Gromov" -programmereren (ikke vær redd, det er bare tre dioder og syv motstander), MK firmware og skrive kode i AVR Studio. Hele prosessen vil bli ledsaget av illustrasjoner og eksempler.

La meg gjøre en reservasjon med en gang: datamaskinen må være utstyrt med en COM-port (USB til COM-adapteren fungerer ikke bra). Hvis datamaskinen din ikke har en slik kontakt på baksiden, er den sannsynligvis på hovedkortet (i form av pinner), så alt kan løses med denne typen "utkast"

Akk, for eiere av bærbare datamaskiner uten COM, er artikkelen kun av akademisk interesse.

Så la oss begynne...

Hva trenger du?

"Myk"


UniProf- et universelt program for å blinke forskjellige ATmega-mikrokontrollere, enkelt og praktisk, og viktigst av alt, fungerer perfekt med programmereren vår. Forfatteren er den russiske utvikleren Mikhail Nikolaev.

Selvfølgelig kan du flashe MK fra AVR Studio, men for dette trenger du en spesiell programmerer. Derfor vil vi skrive koden i studioet, og flashe de resulterende hex-filene med UniProf ved å bruke vår hjemmelagde programmerer. I tillegg vil metoden for å blinke fastvare fra kommandolinjen bli beskrevet.

Linux-brukere må bruke enten en virtuell maskin eller Wine. Det fungerte ikke for meg med Wine, jeg kan ikke se porten i det hele tatt, og jeg har ikke prøvd det med en virtuell maskin.

  Fungerer feilfritt i vin (Debian 8.5, vin 1.6).

All programvare er gratis.

"Jern"

Vi vil gjennomføre eksperimenter på Arduino pro mini med ATmega328-brikke. Kvarts frekvens (8/16MHz), samt spenning (3,3/5v), spiller ingen rolle. (se nedenfor)

I fremtiden vil du programmere ulike Atmel-mikrokontrollere, men for første gang er dette brettet helt riktig. Det er bra fordi det praktisk talt er en bar kontroller med minimalt med ledninger og loddede pinner. Akkurat det du trenger.

Om merking på mikrokontrollere

Etter navnet er det tall, som oftest indikerer mengden minne.

Bokstaven etter tallene angir forsyningsspenningsparametrene.

Ikke noe brev- regulatorens forsyningsspenning er innenfor 4,5-5,5 volt.
L- versjoner av kontrollere som opererer på redusert (Lav) forsyningsspenning (2,7 - 5,5 volt).
V- versjoner av kontrollere som opererer på lav forsyningsspenning (1,8-5,5 volt).
U- versjoner av kontrollere som opererer på ultralav forsyningsspenning (0,7-5,5 volt).
P- laveffektversjoner (opptil 100 nA i avslåingsmodus).
EN- redusert strømforbruk, som dekker hele klokkefrekvensområdet for alle versjoner, forsyningsspenning 1,8-5,5 volt (i noen modeller er nye funksjoner og nye registre lagt til, samtidig som full kompatibilitet med tidligere versjoner opprettholdes).

Mikrokontrollere « EN" og ikke- EN" har vanligvis samme signatur, noe som forårsaker noen vanskeligheter, siden Fuse-bitene er forskjellige.

Eksempler:

ATmega8- Programminnekapasitet er 8 kilobyte, forsyningsspenning er 4,5-5,5 volt.
ATmega8L- Programminnekapasitet er 8 kilobyte, forsyningsspenning er 2,7-5,5 volt.
ATtiny43U- minnekapasitet 4 kilobyte, modifikasjon - 3, forsyningsspenning - 0,7-5,5 volt.
ATtiny44A- minnekapasitet 4 kilobyte, modifikasjon - 4, redusert strømforbruk, forsyningsspenning 1,8-5,5 volt.

Det hender at en kontroller uten bokstav kan ha redusert forsyningsspenning (1,7 eller 1,8 volt). Dette må avklares i databladet.

ATtiny841- minnekapasitet 8 kilobyte, modifikasjon - 41, forsyningsspenning - 1,7-5,5 volt.

Etter bindestreken er mikrokontrollerversjonen indikert, bestående av tall som indikerer maksimal frekvens til kontrolleren (ved passende forsyningsspenning), og fra bokstaver som indikerer husalternativ, driftstemperaturområde og produksjonsfunksjoner.

En eller to bokstaver etter frekvensen indikerer hustype:

UniProf
Å skrive et program er halve kampen; du må fortsatt stappe det inn i kontrolleren på en eller annen måte. Så la oss være mer oppmerksomme på dette.

Det ville vært fint om din Arduino var lastet med standard Blink (den følger med fra fabrikken).

La oss starte UniProf... Kanskje følgende vindu dukker opp:

Denne er koblet til LPT-porten, så bare klikk OK.

Programvinduet åpnes da:

Hvis porten ikke er valgt riktig, vises et vindu som spør...

Klikk OK og velg ønsket port.

Hvis MK ikke oppdages automatisk, vil et vindu med manuelt valg vises:

Dessverre ikke på listen atmega328, så vi velger mega32 (de har samme mengde flash-minne) og trykk OK.

Etter dette, i stedet for ordet ukjent, vil den tilkoblede kontrolleren vises...

32K er mengden Flash-minne, og 1024 - EEPROM-volum.

Nå, hvis alt er som på bildet, åpne hjelpen   og les nøye hva som står der. Forfatteren var veldig kortfattet, så det vil ikke ta mye tid. Ikke trykk på noen knapper ennå.

Har du møtt? Flott, nå kan vi gå videre. Fjern merket i boksen ved siden av EEPROM og du vil se det endrede grensesnittet:

Etter å ha fjernet merket for EEPROM, blir ikke lesing og skriving av dette minneområdet utført.

Siden vi skal operere med hex-filer, fjerner vi "hakene" Generell Og BIN, og merk også av i boksen Brems!, vil dette øke lese-/skrivetiden, men øke stabiliteten.

Prosessen er ikke rask, så du må vente. Blå firkanter vil krype under og tall vil telles i nedre høyre hjørne. Den første passeringen vil lese PROGRAM-området, og den andre vil lese EEPROM.

Jeg har en ny Arduino med en standard Blink innebygd (når programmereren er tilkoblet, vil dioden slutte å blinke). Hvis du har det samme, vil følgende bilde vises:

Til høyre ser vi at det ikke er noe i EEPROM, og til venstre, i PROGRAM, er det et innspilt program (som jeg sa, dette er Blink). Bruk nå pil ned for å rulle glidebryteren til dataene går tom...

...nå bla til slutten. Du vil se mer data - dette er Arduino bootloader.

Nå foreslår jeg å ta en pause fra artikkelen min og lese om strukturen til MK, dette vil i stor grad øke din forståelse av materialet. Alt er skrevet veldig bra og tydelig. Vel, når du har lest den, kom tilbake og la oss fortsette...

Fjern merket for EEPROM. Vi trenger det egentlig ikke, men det vil være klart at det er en "hake" Brems!

La oss nå lagre alt som er fastvare i kontrolleren, slik at vi etter eksperimenter kan returnere den til sin opprinnelige tilstand.

Trykk på  -knappen og lagre fastvaren, og kall den noe sånt som - origProMini328.hex. Det er det, nå har du en sikkerhetskopi.

... og klikk deretter på den allerede kjente Les-knappen. Etter dette vil du se at alle cellene i PROGRAM er tomme. Ikke bare programmet ble fjernet, men også Arduino bootloader.
Det vil si at nå vil du ikke kunne laste opp skisser med den tradisjonelle metoden. Deretter, hvis du vil, gjenopprett alt fra sikkerhetskopien med en lett håndbevegelse.

Nå vil vi blinke kontrolleren med samme "Blink", bare skrevet i AVR Studio.

Slik ser koden ut:

#define F_CPU 16000000UL #inkluder #inkludere #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; }
Bruker du en Arduino med 8 MHz kvarts så er det ikke noe galt med dette, dioden vil bare blinke halvparten så ofte.

Her er hvor mye plass den tar:

AVRDude

Uniprof, som mange andre lignende programmer, er kun et grafisk tillegg over AVRDude-programmet (AVR Downloader-Uploader), som deretter utfører alle de ovenfor beskrevne handlingene på mikrokontrolleren.
Fordi det AVRDude har ikke sitt eget grafiske grensesnitt; du må jobbe med det fra kommandolinjen. Dette kan virke upraktisk for noen, men det er akkurat det motsatte; å jobbe fra konsollen er rett og slett flott. Praktisk, enkel og ikke knyttet til noe OS, fordi avrdude sannsynligvis eksisterer for alt. Nå vil du se dette.

For brukere

Avrdude er inkludert i AVR-verktøykjeden, så installer den (etter å ha installert AVR Studio) som skrevet i begynnelsen av artikkelen.

Cd\
...gå til roten på disken MED.

Ved å skrive inn kommandoen:

Hvis det er tilfelle, da avrdude klar til å gå og fortsette.

Nå må vi legge til programmereren vår i konfigurasjonsfilen avrdude (C:\Program Files (x86)\Atmel\AVR Tools\AVR Toolchain\bin\ avrdude.conf) . Åpne den i programmet Notisblokk++ og etter inskripsjonen "PROGRAMMER DEFINITIONS" legg til disse linjene:

Programmerer-id = "gromov"; desc = "serial port banging, reset=dtr sck=rts mosi=txd miso=cts"; type = serbb; tilbakestill = 4; sck = 7; mosi = 3; miso = 8; ;
Bit-banking.

Lagre og lukk filen; den er ikke lenger nødvendig.

Gå tilbake til terminalen og gi kommandoen for å sjekke kommunikasjonen mellom MK og programmereren:

Avrdude -n -c gromov -P com1 -p m328p
Du kan ha en annen com-port.

Installere avrdude

Sudo apt install avrdude

Ved å skrive inn kommandoen:

Du bør se hjelpeinformasjon.

Hvis det er tilfelle, da avrdude klar for jobb.

Konfigurer porten:

Sudo stty 9600 ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflshDette må gjøres etter hver omstart av datamaskinen, eller legg det til i rc.local.

Hvor /dev/ttyS0 er com1, /dev/ttyS1 - com2 etc.
I fremtiden vil jeg skrive i lag /dev/ttyS0, du kan ha /dev/ttyS1 etc.

Legg til programmereren i konfigurasjonsfilen /etc/avrdude.conf

Sudo nano /etc/avrdude.conf

Etter "PROGRAMMERDEFINISJONER" legg til følgende linjer:

Programmerer-id = "gromov"; desc = "serial port banging, reset=dtr sck=rts mosi=txd miso=cts"; type = "serbb"; tilbakestill = 4; sck = 7; mosi = 3; miso = 8; ;
Programmereren bruker Bit-banging-teknologi.

Pass på at når du kopierer, forblir sitatene bare anførselstegn, ellers kan de endre seg (på grunn av forskjellen i kodinger) og avrdude vil banne.

Lagre og lukk filen.

Gi kommandoen for å sjekke forbindelsen mellom MK og programmereren:

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

Hvis det er en forbindelse, vil svaret være slik:

Det er her forskjellene mellom operativsystemer slutter og kommandoene dupliseres.

Legg til et argument til kommandoen -v eller -v -v (kan legges til alle kommandoer) for å vise fullstendig informasjon:

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


Avrdudes konklusjon er at både i Windows og i Linux er det samme, så fra nå av tar jeg kun skjermbilder i Win.

Det er mer informasjon her, for eksempel kan du se hvilke sikringer som er installert. Her skrives de ut i heksadesimal (HEX) tall. For eksempel, hfuse 0xDA, i binær ser det slik ut - . Det vil si at dette er de samme bitene som er krysset av i grafiske grensesnitt.

Når du arbeider med sikringer, husk at i ATmega mikrokontrollere er sikringene omvendt. Det er 0 - Dette Yucheno, og 1 - av Yucheno. Dette skaper forvirring i nettkalkulatorer (se nedenfor).

La oss lese fastvaren fra området blits (samme som PROGRAM i uniprof) kommando:

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###

I uniprof ble koden vist i programmet, men her vil den bli skrevet til en fil.

Firmware lest og skrevet til fil readfl.txt. Brev h (hex) på slutten, indikerer at dataene skal skrives i heksadesimalt format. Hvis du skriver et brev b (binær), vil bli skrevet i det binære systemet, og hvis r (rå), da vil dataene være i "rå" form (kryakozyabra).

Fra nå av antas det at vinnerbrukere befinner seg i roten av disken MED (C:\), og Linux-brukere jobber fra hjemmemappen, så filene vil bli lagret der (med mindre annet er spesifisert). Fastvaren som skal lastes opp til MK skal være plassert der.

For win vil filen være plassert her C:\readfl.txt, og for linux, i /home/user/readfl.txt. Du kan åpne denne filen og ta en titt.

Leser EEPROM:

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###

Lese flash og eeprom sammen:

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###

Sletting av kontrolleren:

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

Koble fra "reset"-pinnen - dioden vil ikke blinke, programmet vil bli slettet.

La oss flashe MK med den tidligere nedlastede filen 328test.hex. Ligger ved roten av disken C(c:\328test.hex) i Windows eller i hjemmemappen (/home/user/328test.hex) i linux.

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###

Nå hvis du slår av "tilbakestilling", vil kontrolleren komme til live.

Merk. Når du blinker MK via avrdude, det er ikke nødvendig å slette kontrolleren, programmet gjør det selv. Men hvis du angir parameteren -D, vil ikke MK rengjøres automatisk.

EEPROM-fastvare:

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###

Leser alle sikringer:

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 ###VINN###
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###

Noen kontrollere har kanskje ikke noen sikring.

Kun lesing Lav sikring:

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###

Lav sikring er ansvarlig for å velge klokkesignalkilden (intern, ekstern), dens frekvens og pausen før kontrolleren starter etter at den er tilført strøm. Nå har du verdien skrevet der - 0xff, som tilsvarer ekstern kvarts fra 8 MHz og oppover.

Nå vil vi blinke en annen lunte, som vil overføre din ATmeg til å fungere fra en intern 8 MHz generator.

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###

Har du en 16 MHz Arduino vil dioden blinke dobbelt så sakte.
I fremtiden, når du koder i AVR Studio, kan du spesifisere en frekvens på 8 MHz og løsne kvartsen, og dermed få ytterligere to gratis digitale pinner til din disposisjon.

Men det er senere, og la oss nå returnere alt som det var ved å blinke den forrige sikringen:

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###

Dioden vil blinke riktig.

Sikringer kan blinke enkeltvis eller sammen:

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###
Disse kommandoene trenger ikke å gis. Jeg presenterer dem for klarhet.

I fremtiden, når du trenger å bruke andre kontrollere, vil du krysse av i boksene i den elektroniske kalkulatoren og få verdiene (lenken er oppe i venstre hjørne) i hex-format og flash det.

Nå gjenstår det bare å finne ut parameterne avrdude og du kan gå videre til siste del.

-c gromov- type programmerer, eller rettere sagt navnet den er skrevet under i konfigurasjonen (avrdude.conf).
-P com1– Vel, alt er klart her.
-p m328p- betegnelse type MK.
-U- etter dette alternativet vises minneområdet (flash, eeprom, xfuse), som alle handlinger vil bli utført på (r - les, w - skriv).
Kolon fungerer som skilletegn.

Her, med navn på mikrokontrollere og deres aliaser, programmerere og andre alternativer.

Kallenavn 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

Linux-brukere kan bruke vin.

Jeg håper du allerede har alt installert, så la oss starte AVR Studio...


Her blir vi bedt om å lage et nytt prosjekt eller åpne et gammelt. Klikk Nytt prosjekt


Velge AVR GCC, siden vi vil skrive i SI, og ikke i assembler.
Vi gir prosjektet et navn og krysser av i boksene.
Velge plassering (Jeg opprettet AVR-mappen på C:\-stasjonen) mapper med prosjekter vil automatisk bli opprettet der.
Klikk Neste


Velge AVR Simulator, siden vi ikke har en spesiell programmerer som tillater feilsøking, og mikrokontrolleren vår er det ATmega328p.
Klikk Bli ferdig.

Etter disse manipulasjonene er studioet klart for arbeid.

Til venstre er stiene til prosjektet. I midten er et tekstredigeringsprogram der koden er skrevet. Til høyre er kontrollerregistrene. Nederst til venstre er feilsøkingsinformasjon.

Av knappene vi for øyeblikket er interessert i disse -

Bygg prosjektet.
Bygg prosjektet og begynn å feilsøke.
Kompilere filen.
Rengjøring.
Prosjektoppsett. Så klikk på den...

Her kan du endre type MK, stille inn klokkefrekvensen (vi skriver det direkte i koden), optimaliseringsnivå, samt bestemme hvilke filer som skal opprettes.
Klikk på ikonene til venstre for interesse og klikk Avbryt.
Jeg vil ikke forklare disse og andre alternativer, men senere vil jeg gi en lenke med en kompetent beskrivelse.

Kopier nå koden skrevet i begynnelsen av artikkelen og lim den inn i editoren:

Vi spesifiserte klokkefrekvensen i koden fordi biblioteket krever det forsinkelse.h.

Byggingen var vellykket, det var ingen feil eller advarsler.

La oss nå gå videre C:\AVR\my328\default\, finner vi der hex-filen vi opprettet - my328.hex og flash den inn i kontrolleren. Hva du skal blinke (avrdude eller uniprof) velg selv.

I avrdude vil det se slik ut:

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###

Deaktiver "tilbakestilling" og se dioden blinke en gang i sekundet. Jeg håper at jeg har overbevist deg om enkelheten og bekvemmeligheten til kommandolinjen.

For å gjøre Arduino tilbake til en Arduino, har du en sikkerhetskopi.

Som allerede skrevet ovenfor, vil jeg ikke gå inn på forklaringer på arbeidet med AVR Studio, og jeg vil heller ikke gi leksjoner om SI-språket. For det første var ikke dette planen min. (Jeg ville bare hjelpe til med overgangen fra Arduino til AVR Studio)

En IDE er et integrert utviklingsmiljø som inkluderer ulike maler, biblioteker og feilsøkingsfunksjoner. Hvis vi snakker om, siden 2004 har en kraftig programvarepakke, AVR studio, blitt utviklet for dem.

Første versjoner

De første versjonene av studioet inkluderte en assembler for , du kan trekke den ut fra de første byggene, men senere ble dette prosjektet forlatt, og C AVR ble valgt som hovedspråk. Kompilatoren var et betalt og veldig seriøst produkt IAR. Du kan laste ned gratis WINAVR; for å gjøre dette, etter at du har installert studioet, må du installere det.

Merk! Det er bedre å gjøre dette bare etter å ha installert AVR studio 4 og andre versjoner.

AVR studio 4 (bildet over) ble omtalt i lang tid. Mange mikrokontrollerutviklere har støtt på dette problemet. Senere ble IDE oppgradert til AVR studio 5. Bortsett fra grensesnittet var det ingen spesielle endringer, og først da endret utviklerselskapet produktet og endret navnet til Atmel studio 6.

AVR studio 5-miljøet støttet følgende mikrokontrollere:

  • AVR32;
  • XMEGA.

Atmel studio 6 skilte seg betydelig fra AVR studio 5; de mest merkbare nyvinningene i versjonen var:

  1. Microsoft Visual Studio 2010 begynte å jobbe med AVR-familien.
  2. Forbedret syntaksutheving sammenlignet med AVR studio 5.
  3. Lagt til hint og autofullføring av et sett med kommandoer, noe som fremskynder utviklingsprosessen.
  4. Generelt har hele driften av miljøet blitt mer pålitelig.
  5. Lagt til støtte for ARM Cortex-M.
  6. WinAVR trenger ikke lenger å installeres separat; GCC er nå installert under installasjonsprosessen, i motsetning til yngre versjoner.

I Atmel studio 6 var det et sprang til det bedre for brukeren av programmet, noe som påvirket populariteten til Atmel-familiene. Det var imidlertid ikke mulig å oppnå tilstrekkelig støtte for russiske tegn i filstier.

Gjeldende versjon – Atmel studio 7

Utviklingsmiljøet jeg brukte var Visual Studio Isolated Shell 2015; på den ene siden støttes ikke denne løsningen på Windows XP, på den annen side ble disse tiltakene tatt for å forbedre både utseendet til programmet og dets funksjonalitet.

Det mest betydningsfulle er kanskje tillegget av Arduino-støtte i Atmel studio 7. Dette betyr at du kan gå fra et sett med enkle skisser til å bruke alle C-funksjonene, feilsøking, MCU-simulator og andre funksjoner. Kombinasjonen av Arduino og Atmel studio 7 ga en ny runde i utviklingen av denne enkle læringsplattformen.

Å studere Atmel-studio med Arduino vil gi en mulighet til å gå videre til en fullstendig og produktiv mestring og dypere bekjentskap med hjertet av Arduino - Atmega-mikrokontrolleren.

I tillegg, fra Atmel-nettstedet kan du laste ned en pakke for betjening og tilkobling av LCD-skjermen. Som et eksempel for mestring kan du bruke LCD 1602; det er mange leksjoner om det på Internett, og utvikleren har 16 tegn og 2 linjer tilgjengelig på skjermen.

Hvor skal man begynne å lære?

Du bør selvfølgelig starte med å kjøpe en programmerer; Den mest budsjettvennlige er USBASP. USBASP-programmereren støttes ikke i Atmel Studio 7.


Last ned driverne for programmereren og AVRdude-programmet, og for å få det til å fungere sammen, kan du bruke kommandoen via kommandolinjen:

"avrdude -c usbasp -p atmega32 -U flash:w: navnet på fastvarefilen. hex -U lfuse:w:0x6a:m -U hfuse:w:0xff:m"

og aktiver støtten ved å opprette en profil i atmel studio 7 (tittel – eksterne verktøy), og i Arguments-elementet skriv inn "-c usbasp -p atmega32 -U flash:w:$(TargetName).hex" og så videre for hver typen du bruker mikrokontrollere.

Dette er den eneste måten å koble sammen studioet og USBASP-programmereren. Vær forsiktig når du blinker - du kan skade mikrokontrollersignaturen, og den kan bare gjenopprettes med en 12 V (høyspent) programmerer.

Hvilken litteratur bør jeg bruke til trening?

Først av alt, last ned manualer fra den offisielle nettsiden for hver mikrokontroller. Det er vanskelig å anbefale en spesifikk lærebok, men det er «DI Halt - AVR. Opplæringskurs" kan du bruke det - skaperen av dette materialet er en utøver, forfatteren av mange artikler om forskjellige Internett-ressurser og rett og slett en respektert person i spesialistkretser.

Jeg har sagt mer enn en eller to ganger at å studere MK bør begynne med assembler. Et helt kurs på nettsiden ble viet til dette (selv om det ikke er særlig konsekvent, men etter hvert kjemmer jeg det til et adekvat utseende). Ja, det er vanskelig, resultatet vil ikke være den første dagen, men du vil lære å forstå hva som skjer i kontrolleren din. Du vil vite hvordan det fungerer, og ikke kopiere andres kilder som en ape og prøve å forstå hvorfor det plutselig sluttet å fungere. I tillegg er det mye lettere for C å lage redneck-kode som vil komme ut med en høygaffel på det mest uleilige tidspunktet.

Dessverre ønsker alle resultater umiddelbart. Så jeg bestemte meg for å gå den andre veien - lage en tutorial på C, men med å vise undertøyet hans. En god embedder-programmerer holder alltid maskinvaren tett ved bolten, og lar den ikke ta et eneste skritt uten tillatelse. Så først vil det være C-koden, deretter hva kompilatoren produserte og hvordan det hele faktisk fungerer :)

På den annen side er Cs sterke side kodeportabilitet. Hvis du selvfølgelig skriver alt riktig. Separering av arbeidsalgoritmene og deres maskinvareimplementeringer i ulike deler av prosjektet. Deretter, for å overføre algoritmen til en annen mikrokontroller, vil det være nok å bare skrive om grensesnittlaget, der alle anrop til maskinvaren skrives, og la all arbeidskoden være som den er. Og selvfølgelig lesbarhet. C-kildekoden er lettere å forstå ved første øyekast (selv om ... for eksempel, jeg bryr meg ikke om hva jeg skal peke på - det være seg C eller ASM :)), men igjen, hvis alt er skrevet riktig. Jeg vil også ta hensyn til disse punktene.

Feilsøkingskortet mitt vil fungere som den eksperimentelle maskinvaren som brorparten av alle eksemplene vil bli installert på.

Det første C-programmet for AVR

Velge en kompilator og sette opp miljøet
Det er mange forskjellige C-kompilatorer for AVR:
Først av alt dette IAR AVR C- er nesten definitivt anerkjent som den beste kompilatoren for AVR, fordi selve kontrolleren ble laget i nært samarbeid mellom Atmel og spesialister fra IAR. Men du må betale for alt. Og denne kompilatoren er ikke bare en dyr kommersiell programvare, men har også så massevis av innstillinger at det krever mye innsats å ganske enkelt kompilere den i den. Jeg utviklet virkelig ikke et vennskap med ham; prosjektet råtnet på grunn av merkelige feil på koblingsstadiet (senere fant jeg ut at det var en skjev sprekk).

Andre kommer WinAVR GCC- en kraftig optimaliserende kompilator. Helt åpen kildekode, på tvers av plattformer, generelt, alle livets gleder. Den integreres også perfekt i AVR Studio, slik at du kan feilsøke akkurat der, noe som er veldig praktisk. Generelt valgte jeg det.

Det er også CodeVision AVR C er en veldig populær kompilator. Den ble populær på grunn av sin enkelhet. Du kan få et fungerende program i den på bare noen få minutter - startkodeveiviseren letter dette i stor grad ved å stemple ut standarder for initialisering av alle mulige ting. For å være ærlig, er jeg litt mistenksom overfor det - når jeg først måtte demontere et program skrevet av denne kompilatoren, viste det seg å være en slags rot og ikke kode. En forferdelig mengde unødvendige bevegelser og operasjoner, som resulterte i en betydelig mengde kode og treg ytelse. Imidlertid var det kanskje en feil i DNA-et til personen som skrev den originale fastvaren. I tillegg vil han ha penger. Ikke så mye som IAR, men merkbart. Og i demomodus lar den deg ikke skrive mer enn 2kb kode.
Selvfølgelig er det en sprekk, men hvis du skal stjele, er det en million, i IAR-forstand :)

Det er også Image Craft AVR C Og MicroC fra mikroelektronikk. Jeg trengte ikke å bruke noen av dem, men S.W.G. veldig rosende MicroPascal, sier de, et fryktelig praktisk programmeringsmiljø og biblioteker. Jeg tror MicroC ikke vil være verre, men det er også betalt.

Som sagt, jeg valgte WinAVR av tre grunner: det er gratis, det integreres i AVR Studio og det er bare massevis av ferdig kode skrevet for det for alle anledninger.

Så last ned WinAVR-installasjonen med AVR Studio. Deretter installeres studioet først, deretter rulles WinAVR oppå og festes til studioet i form av en plugin. Jeg anbefaler på det sterkeste å installere WinAVR på en kort bane, noe som C:\WinAVR, på denne måten vil du unngå mange problemer med stier.

Opprette et prosjekt
Så, studioet er installert, C er skrudd inn, det er på tide å prøve å programmere noe. La oss starte med det enkle, det enkleste. Start studioet, velg et nytt prosjekt der, som AVR GCC-kompilatoren og skriv inn navnet på prosjektet.

Et arbeidsfelt åpnes med en tom *.c-fil.

Nå vil det ikke skade å konfigurere visningen av stier i studiobokmerkene. For å gjøre dette, gå til:
Meny Verktøy - Alternativer - Generelt - Filfaner og velg "Kun filnavn" fra rullegardinlisten. Ellers vil det være umulig å jobbe - fanen vil inneholde hele banen til filen, og det vil ikke være mer enn to eller tre faner på skjermen.

Prosjektoppsett
Generelt anses det som klassisk å lage en make-fil der alle avhengigheter er beskrevet. Og det er nok riktig. Men for meg, som vokste opp med fullt integrerte IDE-er som uVision eller AVR Studio denne tilnærmingen er dypt fremmed. Derfor vil jeg gjøre det på min måte, alt med studiomidler.

Stikk i knappen med giret.


Dette er innstillingene for prosjektet ditt, eller snarere innstillingene for automatisk generering av en make-fil. På den første siden trenger du bare å angi frekvensen som din MK skal operere med. Dette avhenger av sikringsbitene, så vi antar at frekvensen vår er 8000000Hz.
Vær også oppmerksom på optimaliseringslinjen. Nå er det -Os - dette er størrelsesoptimalisering. La det være som det er for nå, så kan du prøve å leke med denne parameteren. -O0 er ingen optimalisering i det hele tatt.

Det neste trinnet er å konfigurere banene. Først av alt, legg til prosjektkatalogen din der - du vil legge til tredjepartsbiblioteker der. Banen ".\" vil vises i listen.

Make-filen er generert, du kan se på den i standardmappen i prosjektet ditt, bare ta en titt og se hva som er der.


Det er alt for nå. Klikk OK overalt og gå til kilden.

Formulering av problemet
Et blankt ark er fristende å implementere en utspekulert idé, siden den banale blinkingen av en diode ikke lenger fungerer. La oss umiddelbart ta oksen ved hornene og implementere forbindelsen med datamaskinen - dette er det første jeg gjør.

Det vil fungere slik:
Når en ener (kode 0x31) kommer til COM-porten, vil vi slå på dioden, og når en null kommer (kode 0x30) slås den av. Dessuten vil alt bli gjort på avbrudd, og bakgrunnsoppgaven vil være blinking av en annen diode. Enkelt og meningsfylt.

Montering av kretsen
Vi må koble USB-USART-omformermodulen til USART-pinnene på mikrokontrolleren. For å gjøre dette, ta en jumper fra to ledninger og plasser den på pinnene på kryss og tvers. Det vil si at vi kobler Rx-en til kontrolleren til Tx-en til omformeren, og Tx-en til omformeren til Rx-en til kontrolleren.

Til slutt er dette diagrammet:


Jeg vurderer ikke å koble til de gjenværende pinnene, strøm eller tilbakestilling, det er standard.

Skrive kode

La meg ta en reservasjon med en gang at jeg ikke skal fordype meg spesifikt i beskrivelsen av selve C-språket. Det er rett og slett en kolossal mengde materiale for dette, alt fra det klassiske "C Programming Language" fra K&R til forskjellige manualer.

Jeg fant en slik metode i oppbevaringen min; jeg brukte den en gang for å studere dette språket. Alt der er kort, klart og saklig. Jeg setter det gradvis sammen og drar det inn på nettstedet mitt.

Det er sant at ikke alle kapitlene er overført ennå, men jeg tror det ikke blir så lenge til.

Det er usannsynlig at jeg kan beskrive det bedre, så fra kurset, i stedet for en detaljert forklaring av finessene, vil jeg ganske enkelt gi direkte lenker til individuelle sider i denne håndboken.

Legger til biblioteker.
Først av alt legger vi til de nødvendige bibliotekene og overskriftene med definisjoner. Tross alt er C et universelt språk, og vi må forklare ham at vi jobber spesifikt med AVR, så skriv linjen i kildekoden:

1 #inkludere

#inkludere

Denne filen ligger i mappen WinAVR og den inneholder en beskrivelse av alle registre og porter til kontrolleren. Dessuten er alt der utspekulert, med binding til en spesifikk kontroller, som overføres av kompilatoren via gjøre fil i parameter MCU og basert på denne variabelen kobles en header-fil til prosjektet ditt med en beskrivelse av adressene til alle porter og registre for denne spesifikke kontrolleren. Wow! Uten det er det også mulig, men da vil du ikke kunne bruke symbolske registernavn som SREG eller UDR, og du må huske adressen til hver som "0xC1", som vil være en hodepine.

Selve laget #inkludere<имя файла> lar deg legge til innholdet i en hvilken som helst tekstfil til prosjektet ditt, for eksempel en fil med en beskrivelse av funksjoner eller et stykke annen kode. Og for at direktivet kunne finne denne filen, spesifiserte vi banen til prosjektet vårt (WinAVR-katalogen er allerede registrert der som standard).

Hovedfunksjon.
Et C-program består utelukkende av funksjoner. De kan nestes og kalles fra hverandre i hvilken som helst rekkefølge og på forskjellige måter. Hver funksjon har tre nødvendige parametere:

  • Returverdien er f.eks. synd(x) returnerer verdien av sinusen til x. Som i matematikk, kort sagt.
  • De overførte parameterne er de samme X.
  • Funksjonskropp.

Alle verdier som sendes og returneres må være av en eller annen type, avhengig av dataene.

Ethvert C-program må inneholde en funksjon hoved- som et inngangspunkt til hovedprogrammet, ellers er det ikke C i det hele tatt :). Ved tilstedeværelsen av main i andres kildekode fra en million filer, kan du forstå at dette er hoveddelen av programmet, der alt begynner. Så la oss spørre:

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

int main(void) ( return 0; )

Det er det, det første enkleste programmet er skrevet, det spiller ingen rolle at det ikke gjør noe, vi har nettopp startet.

La oss finne ut hva vi gjorde.
int Dette er datatypen som hovedfunksjonen returnerer.

Selvfølgelig i en mikrokontroller hoved- i prinsippet kan ingenting returneres, og i teorien burde det være det void main(void), men GCC er opprinnelig designet for PC-en og der kan programmet returnere verdien til operativsystemet ved ferdigstillelse. Derfor GCC på void main(void) sverger til advarsel.

Dette er ikke en feil, det vil fungere, men jeg liker ikke advarsler.

tomrom dette er typen data vi sender til funksjonen, i dette tilfellet hoved- kan heller ikke akseptere noe utenfra, derfor tomrom- en dummy. En stubbe brukes når det ikke er behov for å sende eller returnere noe.

Her er de { } krøllete klammeparenteser er en programblokk, i dette tilfellet kroppen til en funksjon hoved-, vil koden være plassert der.

komme tilbake- dette er returverdien som hovedfunksjonen vil returnere ved fullføring, siden vi har en int, altså et tall, så må vi returnere et tall. Selv om dette fortsatt ikke gir mening, fordi... på mikrokontrolleren kan vi bare gå ingensteds fra main. Jeg returnerer null. For det spiller ingen rolle. Men kompilatoren er vanligvis smart og genererer ikke kode for denne saken.
Selv om, hvis pervertert, så fra hoved- Du kan gå til MK - for eksempel fall inn i bootloader-seksjonen og utføre den, men dette vil kreve triksing på lavt nivå med fastvaren for å korrigere overgangsadressene. Nedenfor vil du se selv og forstå hvordan du gjør det. For hva? Dette er et annet spørsmål, i 99,999% av tilfellene er dette ikke nødvendig :)

Vi gjorde det og gikk videre. La oss legge til en variabel, vi trenger den egentlig ikke og det er ingen vits i å introdusere variabler uten den, men vi lærer. Hvis variabler legges til inne i kroppen til en funksjon, er de lokale og eksisterer bare i denne funksjonen. Når du avslutter funksjonen, slettes disse variablene, og RAM-minnet tildeles for viktigere behov. .

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

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

usignert betyr usignert. Faktum er at i den binære representasjonen er den mest signifikante biten allokert til tegnet, noe som betyr at tallet +127/-128 passer inn i en byte (char), men hvis tegnet forkastes vil det passe fra 0 til 255. Vanligvis er skiltet ikke nødvendig. Så usignert.
Jeg er bare et variabelnavn. Ikke mer.

Nå må vi initialisere portene og UART. Selvfølgelig kan du ta og koble til biblioteket og ringe en slags UartInit(9600); men da vet du ikke hva som egentlig skjedde.

Vi gjør dette:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 int main(void) (usignert 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) ( usignert 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<

Skummelt? Faktisk er det bare fem siste linjer med ekte kode. Alt, det #definere det er et forprosessor makrospråk. Nesten det samme som i Assembly, men syntaksen er litt annerledes.

De vil lette rutineoperasjonene dine med å beregne de nødvendige koeffisientene. I første linje sier vi det i stedet XTAL du kan trygt erstatte 8000000, og L- indikasjon på typen, sier lang er klokkefrekvensen til prosessoren. Det samme baudrate— frekvens for dataoverføring via UART.

bauddivider allerede mer komplisert, i stedet for det vil uttrykket beregnet ved hjelp av formelen fra de to foregående erstattes.
Vel og L.O. Og HI de lave og høye bytene vil bli tatt fra dette resultatet, fordi Det kan åpenbart ikke passe inn i én byte. I HI X (makroinndataparameteren) forskyves åtte ganger til høyre, noe som resulterer i at bare den mest signifikante byten gjenstår. Og i L.O. vi gjør en bitvis OG med tallet 00FF, som et resultat vil bare den lave byten forbli.

Så alt som er gjort er som #definere du kan trygt kaste det, og beregne de nødvendige tallene på en kalkulator og umiddelbart legge dem inn på linjene UBBRL = …. og UBBRH = …..

Kan. Men! Gjør dette HELT UMULIG!

Det vil fungere slik eller slik, men du vil ha såkalte magiske tall- verdier hentet fra ingensteds og av ukjente årsaker, og hvis du åpner et slikt prosjekt om et par år, vil det være vanskelig å forstå hva disse verdiene er. Selv nå, hvis du vil endre hastigheten eller endre kvartsfrekvensen, må alt beregnes på nytt, men du endret et par tall i koden, og det er det. Generelt, hvis du ikke ønsker å bli merket som en koder, så lag koden din slik at den er lett å lese, forståelig og enkel å endre.

Da er alt enkelt:
Alle disse "UBRRL og Co" er konfigurasjonsregistre for UART-senderen ved hjelp av hvilke vi vil kommunisere med verden. Og nå har vi tildelt dem de nødvendige verdiene, satt dem til ønsket hastighet og modus.

Opptakstype 1< Betyr følgende: ta 1 og sett den på plass RXEN i byte. RXEN dette er den fjerde biten i registeret UCSRB, Så 1< danner det binære tallet 00010000, TXEN- dette er den tredje biten, og 1< vil gi 00001000. Singel "|" det er bitvis ELLER, altså 00010000 | 00001000 = 00011000. På samme måte settes de gjenværende nødvendige konfigurasjonsbitene og legges til den generelle heapen. Som et resultat blir det innsamlede nummeret registrert i UCSRB. Flere detaljer er beskrevet i dataarket om MK i USART-delen. Så la oss ikke la oss distrahere av tekniske detaljer.

Ferdig, på tide å se hva som skjedde. Klikk på kompilering og start emulering (Ctrl+F7).

Feilsøking
Alle slags fremdriftslinjer løp gjennom, studioet endret seg og en gul pil dukket opp nær inngangen til hovedfunksjonen. Det er her prosessoren kjører og simuleringen er satt på pause.

Faktum er at det i utgangspunktet faktisk var på linjen UBRRL = LO(bauddivider); Tross alt, det vi har i definere er ikke kode, men bare foreløpige beregninger, som er grunnen til at simulatoren er litt kjedelig. Men nå skjønte han at den første instruksjonen er fullført og om du klatrer opp i treet I/O-visning, til USART-delen og se på UBBRL-byten der, vil du se at verdien allerede er der! 0x33.

Ta det ett skritt videre. Se hvordan innholdet i det andre registeret endres. Så gå gjennom dem alle, vær oppmerksom på det faktum at alle de angitte bitene er satt som jeg fortalte deg, og de settes samtidig for hele byten. Det går ikke lenger enn til Return – programmet er over.

Åpning
Tilbakestill simuleringen til null. Klikk der Tilbakestill (Shift+F5). Åpne den demonterte oppføringen, nå vil du se hva som faktisk skjer i kontrolleren. Vis -> Demonter. Og ikke YYAAAAAA!!! Monter!!! SKREKK!!! OG DET ER NØDVENDIG. Slik at du senere, når noe går galt, ikke er dum i koden og ikke stiller dumme spørsmål på forumene, men umiddelbart gå inn i magen og se hvor du sitter fast. Det er ikke noe skummelt der.

Først blir det topper fra serien:

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 Hopp +00000002: 940C0034 JMP 0x00000034 Hopp +00000004: 940C0034 JMP 0x000000 +6000000 +6000000 +4C 0x00000034 Hopp +00000008: 940C0034 JMP 0x00000034 Hopp +0000000A: 940C0034 JMP 0x00000034 Hopp +0000000C: 34 J0C00x04 Hopp 0000000E: 940C0034 JMP 0x00000034 Hopp +00000010: 940C0034 JMP 0x00000034 Hopp +00000012: 940C0034 JMP 0x00000 +4C0000 +4C0000 +40000 0x00000034 Hopp +00000016: 940C0034 JMP 0x00000034 Hopp +00000018: 940C0034 JMP 0x00000034 Hopp +0000001A: 940 J0C000x34 J0C000x4 : 940C0034 JMP 0x00000034 Hopp +0000001E: 940C0034 JMP 0x00000034 Hopp +00000020: 940C0034 JMP 0x00000030 9 JMP 020000034 JMP 020000034 0200000034 0200000309 JMP 020000034 34 Hopp +00000024: 940C0034 JMP 0x00000034 Hopp +00000026: 940C0034 JMP 0x00000034 Hopp +00000028: 940C0030 Hopp 00x04

00000000: 940C002A JMP 0x0000002A Hopp +00000002: 940C0034 JMP 0x00000034 Hopp +00000004: 940C0034 JMP 0x00000 JMP 0x00000 +600000 0x00000034 Hopp +00000008: 940C0034 JMP 0x00000034 Hopp +0000000A: 940C0034 JMP 0x00000034 Hopp +0000000C: 940 J0C000000E4 : 940C0034 JMP 0x00000034 Hopp +00000010: 940C0034 JMP 0x00000034 Hopp +00000012: 940C0034 JMP 0x00000030 9 JMP 040000034 Hopp +000000034 JMP 0400000034 34 Hopp +00000016: 940C0034 JMP 0x00000034 Hopp +00000018: 940C0034 JMP 0x00000034 Hopp +0000001A: 940C0034 Hopp +00004 JMP 000004 JMP 00000 : 940C0034 JMP 0x00000034 Hopp +0000001E: 940C0034 JMP 0x00000034 Hopp +00000020: 940C0034 JMP 0x00000030 9 JMP 020000034 JMP 020000034 0200000034 0200000309 JMP 020000034 34 Hopp +00000024: 940C0034 JMP 0x00000034 Hopp +00000026: 940C0034 JMP 0x00000034 Hopp +00000028: 940C0030 Hopp 00x04

Dette er avbruddsvektortabellen. Vi kommer tilbake til det senere, men foreløpig er det bare å se og huske at det eksisterer. Den første kolonnen er adressen til flashcellen der kommandoen ligger, den andre er kommandokoden, den tredje er kommandoen mnemonic, den samme monteringsinstruksjonen, den tredje er operandene til kommandoen. Vel, automatisk kommentar.
Så hvis du ser, er det kontinuerlige overganger. Og JMP-kommandokoden er fire byte, den inneholder hoppadressen skrevet bakover - den lave byten på den lave adressen og hoppkommandokoden 940C

0000002B: BE1F UT 0x3F,R1 Ut til I/O plassering

Registrerer denne nullen på adressen 0x3F. Hvis du ser på I/O-visningskolonnen, vil du se at adressen 0x3F er adressen til SREG-registeret - flaggregisteret til kontrolleren. De. vi tilbakestiller SREG for å kjøre programmet på null betingelser.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F Last umiddelbart +0000002D: E0D4 LDI R29,0x04 Last umiddelbart +0000002E: BFDE OUT 0x3E,R29 Ut til I/O plassering +0000002F:/8 Ut til I/O plassering +00000002F:/8

0000002C: E5CF LDI R28,0x5F Last umiddelbart +0000002D: E0D4 LDI R29,0x04 Last umiddelbart +0000002E: BFDE OUT 0x3E,R29 Ut til I/O plassering +00000002F:/8 Ut til I/O plassering +0000002F:

Dette laster stabelpekeren. Du kan ikke laste direkte inn i I/O-registre, kun gjennom et mellomregister. Derfor, først LDI til mellomliggende, og deretter derfra OUT til I/O. Jeg vil også fortelle deg mer om stabelen senere. For nå, vet at dette er et dynamisk minneområde som henger på slutten av RAM og lagrer adresser og mellomliggende variabler. Nå har vi indikert hvor stabelen vår skal starte fra.

00000032: 940C0041 JMP 0x00000041 Hopp

Hopp helt til slutten av programmet, og der har vi forbud mot avbrudd og looping tett på seg selv:

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

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

Dette er i tilfelle uforutsette omstendigheter, som for eksempel å avslutte hovedfunksjonen. Kontrolleren kan bringes ut av en slik sløyfe enten ved en tilbakestilling av maskinvare, eller, mer sannsynlig, ved en tilbakestilling fra en vakthund. Vel, eller, som jeg sa ovenfor, korriger dette i hex-editoren og galopper bort dit hjertet måtte ønske. Vær også oppmerksom på at det er to typer overganger: JMP og RJMP; den første er en direkte overgang til en adresse. Den opptar fire byte og kan hoppe direkte gjennom hele minneområdet. Den andre typen overgang er RJMP - relativ. Kommandoen hans tar to byte, men han beveger seg fra gjeldende posisjon (adresse) 1024 skritt fremover eller bakover. Og parameterne indikerer forskyvningen fra det nåværende punktet. Det brukes oftere pga tar halve plassen i en spyling, og lange overganger er sjelden nødvendig.

1 +00000034: 940C0000 JMP 0x00000000 Hopp

00000034: 940C0000 JMP 0x00000000 Hopp

Og dette er et hopp helt til begynnelsen av koden. En slags omstart. Du kan sjekke at alle vektorene hopper her. Konklusjonen fra dette er at hvis du nå aktiverer avbrudd (de er deaktivert som standard) og avbruddet ditt oppstår, men det er ingen behandler, vil det bli en tilbakestilling av programvaren - programmet vil bli kastet tilbake til begynnelsen.

Hovedfunksjon. Alt er likt, du trenger ikke engang å beskrive det. Bare se på det allerede beregnede antallet som føres inn i registrene. Kompilator-forprosessoren rocker!!! Så ingen "magiske" tall!

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

00000036: E383 LDI R24,0x33 Last umiddelbart +00000037: B989 OUT 0x09,R24 Ut til I/O plassering 15: UBRRH = HI(bauddivider); +00000038: BC10 UT 0x20,R1 Ut til I/O plassering 16: UCSRA = 0; +00000039: B81B UT 0x0B,R1 Ut til I/O plassering 17: UCSRB = 1<

Og her er feilen:

1 2 3 +0000003E: E080 LDI R24.0x00 Last umiddelbart +0000003F: E090 LDI R25.0x00 Last umiddelbart +00000040: 9508 RET Subrutine retur

0000003E: E080 LDI R24.0x00 Last umiddelbart +0000003F: E090 LDI R25.0x00 Last umiddelbart +00000040: 9508 RET Subrutine retur

Spørsmålet er hvorfor kompilatoren legger til slike topper? Og dette er ikke noe mer enn Return 0, vi definerte funksjonen som int main(void) og så kastet vi bort ytterligere fire byte for ingenting :) Og hvis du gjør void main(void) vil bare RET forbli, men en advarsel vises , at vår hovedfunksjon ikke returnerer noe. Generelt, gjør som du vil :)

Vanskelig? Tydeligvis ikke. Klikk trinn-for-trinn-utførelse i disassembler-modus og se hvordan prosessoren utfører individuelle instruksjoner, hva som skjer med registrene. Hvordan skjer bevegelse gjennom kommandoer og siste looping?

Fortsettelse om et par dager...

Offtop:
Alexei78 Jeg opprettet en plugin for Firefox som gjør det enklere å navigere på nettstedet og forumet mitt.
Diskusjon og nedlasting,

Atmel Studio er en integrert utviklingsplattform som gir muligheten til å designe og feilsøke applikasjoner utviklet for Atmel-mikrokontrollere basert på ARM Cortex-M-seriens prosessorarkitektur. Atmel Studio er et sømløst, brukervennlig miljø som gir muligheten til å feilsøke og bygge applikasjoner laget i C/C++ eller assemblerspråk. Den har et innebygd voluminøst bibliotek med helt gratis Atmel Software Framework-kildekode, som inkluderer mer enn 1600 prosjekter for ARM- og AVR-arkitekturer. Å ha et slikt bibliotek er en stor bonus for enhver programmerer. Denne IDE kan brukes til å programmere et bredt utvalg av AVR-baserte mikrokontrollere, så vel som Atmel SAM3-baserte flash-mikrokontrollere som bruker Cortex-M3, Cortex-M4-kjerner.

Atmel Studio inkluderer også verktøy som vil gjøre livet til enhver programmerer mye enklere. Plattformen inkluderer løsninger som Atmel Spaces og Atmel Gallery. Atmel Gallery er en nettbutikk med utviklingsverktøy og integrert programvare. Atmel Spaces er en skybasert plass for samarbeidsutvikling og lagring av maskinvare- og programvareprosjektfiler for Atmel-mikrokontrollere.

Nøkkelfunksjoner og funksjoner

  • er et helt gratis integrert utviklingsmiljø;
  • støtter C/C++ og Assembler-språk;
  • ledsaget av detaljert dokumentasjon;
  • inkluderer et omfattende bibliotek med kildekodeeksempler for ulike applikasjoner;
  • designet for programmering av Atmel-mikrokontrollere.

Spesielle krav

  • prosessor klokkefrekvens på 1,6 GHz og høyere;
  • for 32-bits systemer fra 1 GB RAM;
  • for 64-bits systemer fra 2 GB RAM;
  • når du kjører på en virtuell maskin, anbefales ytterligere 512 MB RAM;
  • 6 GB ledig harddiskplass.

Hva er nytt i denne versjonen?

7.0.790 (25.02.2016)

  • lagt til støtte for utvidet debugger (EDBG);
  • lagt til støtte for grensesnittinnstillingsprofiler. Du kan bytte mellom profiler ved å bruke tastene i innstillingspanelet;
  • lagt til muligheten til å importere biblioteker til tidligere importerte prosjekter. Lagt til støtte for Arduino Zero og Zero Pro;
  • parallellbygging er nå aktivert som standard;
  • oppdatert firmware for Xplained Mini;
  • "Vis alle filer"-funksjonen i Solution Explorer er fikset.