AVR: programiranje u okruženju AVR Studio. Integrirano okruženje za otklanjanje pogrešaka AVR Studio iz Atmel Avr studija

Za rad s AVR Studio 4 morate ga instalirati samog. Ako je već instaliran, možete preskočiti ovaj korak.

Montaža:
kreirajte direktorij c:/avr/ - ovdje će se nalaziti radni programi.
stvorite direktorij, na primjer c:/works/ – ovo je mjesto gdje će vaši radovi biti pohranjeni.
Potrebno je da postoje prečaci kako s njima ne bi bilo problema.

Generalno postoji AVRStudio5, ali AVRStudio4 je još uvijek sasvim dovoljan.

Sav rad će se odvijati u AVRStudio4, WinAVR je potreban samo zbog AVR-GCC biblioteke (tako da možete pisati u C)
ALI! Prvo morate instalirati WinAVR, inače se AVR-GCC biblioteka neće preuzeti.

Mislim da ćeš to ovdje shvatiti.
AVR-GCC za pisanje u C
Atmel Avr Asembler odnosno za asembler.

Bolje je početi razumijevati MK od nule. A to znači iz asemblera, što znači da kreirate onaj koji je Atmel AVR asembler.

Zatim odaberite mikrokontroler Atmega8.

kada se projekt napravi, bit će velika, bijela, prazna ploča. ovdje će biti šifra.

malo o sadržaju ovog lista

“komentari” su tekst koji prevodilac preskače prilikom prevođenja.
prije početka komentara mora biti poseban simbol, ja koristim simbol; “točka-zarez”, tu je i “dupla kosa crta” (//),
evo primjera komentara

/* * Komentar ove vrste (više redaka), * obično se koristi za * popratne informacije * o izvornom kodu, tj. * ime, programer itd. */ NOP // Ovaj komentar se uglavnom koristi za objašnjenje svrhe naredbe ili dijela koda SLEEP ; Ovaj komentar, kao i prethodni, može poslužiti za objašnjenje (za bilješke) u kodu

naredbe su ispisane u svakom redu. oni. jedna naredba - jedan redak.
Recimo da postoje naredbe s dva “parametra”, s jednim ili bez ičega

MOV R16, R17; dva parametra INC R16 ; jedan SEI parametar; bez parametara

MOV R16, R17; tri bajta INC R16; dva bajta SEI; jedan bajt

Vidite li vezu između veličine tima i parametara?

Svaki mikrokontroler ima svoj asembler, iako su im mnemotehnike slične, tj. Naredba MOV za MK jedne serije izgledat će u strojnom kodu, recimo 0x12, a za drugu 0x55.
Kako bi tijekom kompilacije bio kompajliran u kod koji nam je potreban, moramo reći kompajleru za koji mikrokontroler pišemo program.
Ovo se općenito odabire prilikom izrade projekta.
Iz tog razloga odabrali smo mikrokontroler Atmega8.

Ali to nije sve. Kako bi nam olakšao život, AVRStudio4 ima skup konstanti, koje se nazivaju nešto poput "Macroassembler".

Da biste ih učitali, morate umetnuti redak na početku koda

Uključi "m8def.inc" // pomoću naredbe .include učitali smo datoteku m8def.inc; i sada će nam biti lakše;)

Na samom početku koda nalazi se tablica prekida. Objasnit ću što je to i kako funkcionira u drugom postu. Ali za sada, zapišimo to ovako:

RJMP RESET ; Reset rukovatelja RETI; RJMP EXT_INT0 ; IRQ0 rukovatelj RETI; RJMP EXT_INT1 ; IRQ1 rukovatelj RETI; RJMP TIM2_COMP ; Timer2 Rukovatelj usporedbe RETI; RJMP TIM2_OVF ; Timer2 Overflow Handler RETI; RJMP TIM1_CAPT; Timer1 rukovatelj snimanjem 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 Rukovatelj preljevom RETI; RJMP SPI_STC ; SPI Transfer Complete Handler RETI; RJMP USART_RXC ; USART RX Complete Handler RETI; RJMP USART_UDRE ; UDR Rukovatelj praznim 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; Analog Comparator Handler RETI; RJMP TWSI ; Dvožični rukovatelj serijskim sučeljem RETI; RJMP SPM_RDY; Rukovatelj spreman za memoriju programa za pohranu

Nakon toga dolazi sam kod

PONOVNO POKRETANJE: ; inicijalizacijski token MAIN: NOP ; glavna oznaka petlje RJMP MAIN

Ali postoji jedna (ili bolje rečeno ne jedna, već mnogo) značajki.

Za praktičnost pisanja koda, za njegovu jasnoću i olakšavanje relativnih prijelaza, dobili smo markere, kako oni izgledaju? “RESET:” i “MAIN:” su markeri; njihova imena mogu sadržavati gotovo sve latinične znakove i brojeve. Markeri ne mogu imati nazive funkcija i naredbi, na primjer “NOP”.
Kako doći do njih? Recimo RJMP naredba.

Također, od Markera možemo napraviti potprogram (proceduru) po čijem ćemo se završetku vratiti odakle je pozvan. Za poziv koristite naredbu “RCALL (podprogram)”, a za povratak iz podprograma (procedure) potrebno ga je prekinuti naredbom “RET”. Trebali bismo završiti s ovakvim kodom:

RESTART: MAIN: NOP RCALL PPP1 ; poziv potprograma RJMP MAIN PPP1: NOP RET ; izađite iz potprograma

Kako radi naredba “RCALL”, kada se pozove, adresa s koje je pozvana stavlja se na STAK, a kada se pozove naredba “RET”, uklanja se iz registra “skup”. STACK treba inicijalizirati.

Da bismo mogli raditi s našim MK-om, moramo ga inicijalizirati. jer mk, ovaj uređaj je univerzalan, ima mnogo ulazno/izlaznih portova i perifernih uređaja. kao što su USART, PWM, DAC, ADC itd. Prvi korak u inicijalizaciji mikrokontrolera je označavanje početka "skupa". Inicijalizaciju provodimo nakon oznake "RESET:".

LDI R16,VISOKI(RAMEND) IZLAZ SPH,R16 LDI R16,NISKI(RAMEND) IZLAZ SPL,R16

Da nismo unijeli naredbu .include “m8def.inc” na početku koda, morali bismo je napisati ovako:

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

Razlika je značajna, po mom mišljenju.

STACK je memorija tipa pohrane: (zadnji ušao, prvi izašao).
Tip trgovine nije samoposluga, nego truba iz mitraljeza. Nadam se da svatko može zamisliti kako se patrone pune u njega i kako se onda odatle vade.
Morate obratiti puno pažnje na STACK memoriju, jer... svaka manja pogreška u radu s njim može dovesti do kvara na stogu. Ovo je toliko važna tema da sam joj odlučio posvetiti cijelu temu i to ću napisati u zasebnoj bilješci.

Tako smo dobili sljedeći kod:

Uključi "m8def.inc" RJMP RESET ; Reset rukovatelja RETI; RJMP EXT_INT0 ; IRQ0 rukovatelj RETI; RJMP EXT_INT1 ; IRQ1 rukovatelj RETI; RJMP TIM2_COMP ; Timer2 Rukovatelj usporedbe RETI; RJMP TIM2_OVF ; Timer2 Overflow Handler RETI; RJMP TIM1_CAPT; Timer1 rukovatelj snimanjem 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 Rukovatelj preljevom RETI; RJMP SPI_STC ; SPI Transfer Complete Handler RETI; RJMP USART_RXC ; USART RX Complete Handler RETI; RJMP USART_UDRE ; UDR Rukovatelj praznim 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; Analog Comparator Handler RETI; RJMP TWSI ; Dvožični rukovatelj serijskim sučeljem RETI; RJMP SPM_RDY; Spremni program spreman za rukovanje memorijom RESET: LDI R16,HIGH(RAMEND) OUT SPH,R16 LDI R16,LOW(RAMEND) OUT SPL,R16 RGMP RESET MAIN: NOP ; glavna oznaka petlje RJMP MAIN

U ovoj fazi možemo prevesti projekt i pokrenuti ga za ispravljanje pogrešaka, ali budući da naš kod ne radi ništa, bit će moguće samo identificirati sintaktičke pogreške u kodu.

Za ispravan postupak ispravljanja pogrešaka morate postaviti emulator učestalost kojom će MK raditi, to se radi tek nakon kompajliranja i pokretanja ispravljanja pogrešaka,
To znači da pronađemo “Build” u traci izbornika, otvorimo ga i vidimo “Build and Run”, nakon čega ćemo vidjeti žutu strelicu nasuprot prve naredbe u našem popisu kodova. Sada tražimo "Debug" u traci izbornika i kliknemo "AVR Simulator Options", otvara se sljedeći prozor:

U kojem možemo promijeniti MK i njegovu frekvenciju, također, na ploči s desne strane, vidimo neke informacije o našem MK: njegovu maksimalnu frekvenciju, kapacitet memorije (EEPROM, RAM, FLASH). Sada otvorite podatkovnu tablicu na Atmega8, na stranici 203 (opći popis registara) i 205 (opći popis naredbi) i počnite pisati svoj program.
I zapamtite, nemojte se bojati eksperimentirati sa simulatorom, neće se pokvariti!


Zdravo.

Ovaj će se članak svidjeti onima koji vjeruju da su “izrasli” na Arduinu i spremni su zakoračiti u svijet “ozbiljnog” programiranja mikrokontrolera. Osim što ćete "napumpati svoje programerske vještine", imat ćete priliku odabrati bilo koji mikrokontroler za svoje projekte, a naravno da ćete cijeniti brzinu programa i veličinu memorije koju zauzimaju.

Sve će biti opisano (za    ), od početka do kraja, - instalacija i priprema potrebnog softvera, montaža najjednostavnijeg programatora “Gromov” (nemojte se bojati, postoje samo tri diode i sedam otpornika), MK firmware i pisanje koda u AVR Studio. Cijeli proces bit će popraćen ilustracijama i primjerima.

Odmah ću rezervirati: računalo mora biti opremljeno COM priključkom (USB na COM adapter ne radi dobro). Ako vaše računalo nema takav konektor na stražnjoj strani, onda je vjerojatno na matičnoj ploči (u obliku pinova), onda se sve može riješiti ovim “izbacivanjem”

Nažalost, za vlasnike prijenosnih računala bez COM-a, članak je samo od akademskog interesa.

Dakle, počnimo…

Što će vam trebati?

"meko"


UniProf- univerzalni program za treptanje raznih ATmega mikrokontrolera, jednostavan i praktičan, i što je najvažnije, savršeno radi s našim programatorom. Autor je ruski programer Mikhail Nikolaev.

Naravno, možete bljeskati MK iz AVR Studio, ali za to vam je potreban poseban programer. Stoga ćemo napisati kod u studiju i flashati dobivene heksadecimalne datoteke s UniProf-om koristeći naš domaći programator. Osim toga, bit će opisana metoda bljeskanja firmvera iz naredbenog retka.

Korisnici Linuxa morat će koristiti ili virtualni stroj ili Wine. Nije mi išlo s Wineom, uopće ne vidim port, a nisam probao s virtualnim strojem.

  Radi besprijekorno u Wineu (Debian 8.5, wine1.6).

Sav softver je besplatan.

"Željezo"

Provest ćemo pokuse na Arduino pro mini s ATmega328 čipom. Frekvencija kvarca (8/16MHz), kao i napon (3,3/5v), nije važno. (Pogledaj ispod)

U budućnosti ćete programirati razne Atmel mikrokontrolere, ali za prvi put ova ploča je taman. Dobar je jer je praktički goli kontroler s minimalnim ožičenjem i zalemljenim pinovima. Baš ono što vam treba.

O oznakama na mikrokontrolerima

Nakon naziva nalaze se brojevi, koji najčešće označavaju količinu memorije.

Slovo iza brojeva označava parametre napona napajanja.

Bez pisma- napon napajanja regulatora je unutar 4,5-5,5 volti.
L- verzije regulatora koji rade na smanjenom (nisko) napon napajanja (2,7 - 5,5 volti).
V- izvedbe regulatora koji rade na niskom naponu napajanja (1,8-5,5 volti).
U- verzije regulatora koji rade na ultraniskom naponu napajanja (0,7-5,5 volti).
P- verzije male snage (do 100 nA u načinu rada isključenog napajanja).
A- smanjena potrošnja struje, pokriva cijeli raspon frekvencije takta svih verzija, napon napajanja 1,8-5,5 volti (u nekim modelima dodane su nove značajke i novi registri, uz zadržavanje pune kompatibilnosti s prethodnim verzijama).

mikrokontroleri « A" i "ne- A" obično imaju isti potpis, što uzrokuje određene poteškoće, budući da su Fuse-bitovi različiti.

Primjeri:

ATmega8- kapacitet programske memorije je 8 kilobajta, napon napajanja je 4,5-5,5 volti.
ATmega8L- kapacitet programske memorije je 8 kilobajta, napon napajanja je 2,7-5,5 volti.
ATtiny43U- kapacitet memorije 4 kilobajta, modifikacija - 3, napon napajanja - 0,7-5,5 volti.
ATtiny44A- kapacitet memorije 4 kilobajta, modifikacija - 4, smanjena potrošnja struje, napon napajanja 1,8-5,5 volti.

Dešava se da regulator bez slova može imati smanjeni napon napajanja (1,7 ili 1,8 volti). Ovo treba razjasniti u podatkovnoj tablici.

ATtiny841- kapacitet memorije 8 kilobajta, modifikacija - 41, napon napajanja - 1,7-5,5 volti.

Nakon crtice navedena je verzija mikrokontrolera koja se sastoji od brojeva koji označavaju maksimalnu frekvenciju kontrolera. (pri odgovarajućem naponu napajanja), i od slova koja označavaju opciju kućišta, raspon radne temperature i značajke proizvodnje.

Jedno ili dva slova iza učestalosti označavaju tip kućišta:

UniProf
Pisanje programa je pola uspjeha; još ga morate nekako strpati u kontroler. Pa obratimo više pažnje na ovo.

Bilo bi lijepo da vaš Arduino ima standardni Blink (dolazi s njim iz tvornice).

Pokrenimo UniProf... Možda će se pojaviti sljedeći prozor:

Ovo je spojeno na LPT priključak, pa samo kliknite u redu.

Zatim će se otvoriti prozor programa:

Ako priključak nije ispravno odabran, pojavit će se prozor s pitanjem...

Pritisnite OK i odaberite željeni priključak.

Ako se MK ne otkrije automatski, pojavit će se prozor s ručnim odabirom:

Nažalost nije na popisu atmega328, pa biramo mega32 (imaju istu količinu flash memorije) i pritisnite u redu.

Nakon toga umjesto riječi nepoznat pojavit će se povezani kontroler...

32K je količina Flash memorije, i 1024 - Volumen EEPROM-a.

Sada, ako je sve kao na slici, otvorite pomoć   i pažljivo pročitajte što je tamo napisano. Autor je bio vrlo koncizan, tako da neće oduzeti puno vremena. Nemojte još pritiskati gumbe.

Jeste li se upoznali? Super, sad možemo dalje. Poništite okvir uz EEPROM i vidjet ćete promijenjeno sučelje:

Nakon poništavanja okvira za izbor EEPROM-a, čitanje i pisanje ovog memorijskog područja se ne izvodi.

Budući da ćemo raditi s hex datotekama, uklonit ćemo "kvačice" Općenito I BIN, a također potvrdite okvir Kočnica!, ovo će povećati vrijeme čitanja/pisanja, ali će povećati stabilnost.

Proces nije brz pa ćete morati pričekati. Plavi kvadrati će puzati ispod, a brojevi će se brojati u donjem desnom kutu. Prvi prolaz će očitati PROGRAM područje, a drugi će očitati EEPROM.

Imam novi Arduino sa standardnim Blinkom ugrađenim u njega (kada je programator spojen, dioda će prestati treptati). Ako imate istu stvar, pojavit će se sljedeća slika:

Desno vidimo da nema ništa u EEPROM-u, a lijevo, u PROGRAMU, nalazi se snimljeni program (kao što rekoh, ovo je Blink). Sada upotrijebite strelicu prema dolje za pomicanje klizača dok ne ponestane podataka...

...sada dođite do kraja. Vidjet ćete više podataka - ovo je Arduino bootloader.

Sada predlažem da se odmorite od svog članka i pročitate o strukturi MK, to će uvelike povećati vaše razumijevanje materijala. Sve je jako dobro i jasno napisano. Pa, kad ga pročitate, vratite se i nastavimo...

Poništite odabir EEPROM. Ne treba nam baš, ali bit će jasno da postoji "kvačica" Kočnica!

Spremimo sada sve što je firmware u kontroler, tako da ga nakon eksperimenata možemo vratiti u prvobitno stanje.

Pritisnite gumb   i spremite firmware, nazovite ga nekako kao - origProMini328.hex. To je to, sada imate rezervnu kopiju.

... a zatim kliknite već poznati gumb Read. Nakon toga vidjet ćete da su sve ćelije u PROGRAMU prazne. Nije uklonjen samo program, već i Arduino bootloader.
Odnosno, sada nećete moći učitavati skice tradicionalnom metodom. Zatim, ako želite, laganim pokretom ruke vratite sve iz backupa.

Sada ćemo bljeskati kontroler s istim "Blinkom", samo napisanim u AVR Studio.

Ovako kod izgleda:

#definiraj F_CPU 16000000UL #uključi #uključ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; }
Ako koristite Arduino s kvarcom od 8 MHz, onda nema ništa loše u tome, dioda će samo treptati upola manje.

Evo koliko prostora zauzima:

AVRD čovječe

Uniprof, kao i mnogi drugi slični programi, samo je grafički dodatak programu AVRDude (AVR Downloader-Uploader), koji zatim izvodi sve gore opisane radnje na mikrokontroleru.
Jer AVRD čovječe nema vlastito grafičko sučelje, s njim morate raditi iz naredbenog retka. Možda će se to nekome činiti nezgodno, ali upravo je suprotno; rad s konzole jednostavno je izvrstan. Zgodan, jednostavan i nije vezan ni za jedan OS, jer avrdude vjerojatno postoji za sve. Sada ćete vidjeti ovo.

Za korisnike

Avrdude uključen je u AVR toolchain, pa ga instalirajte (nakon instalacije AVR Studio) kao što je napisano na početku članka.

CD\
...idite u korijen diska S.

Unosom naredbe:

Ako je to slučaj, onda avrdude spreman za polazak i nastavak.

Sada moramo dodati naš programator u konfiguracijsku datoteku avrdude (C:\Program Files (x86)\Atmel\AVR Tools\AVR Toolchain\bin\ avrdude.konf) . Otvorite ga u programu Notepad++ a nakon natpisa “PROGRAMER DEFINICIJE” dodajte ove retke:

Programer id = "gromov"; desc = "lukanje serijskog porta, reset=dtr sck=rts mosi=txd miso=cts"; vrsta = serbb; reset = 4; scck = 7; mosi = 3; miso = 8; ;
Bitno lupanje.

Spremite i zatvorite datoteku; više nije potrebna.

Vratite se na terminal i dajte naredbu za provjeru komunikacije između MK i programatora:

Avrdude -n -c gromov -P com1 -p m328p
Možda imate drugačiji com port.

Instalirati avrdude

Sudo apt instalirajte avrdude

Unosom naredbe:

Trebali biste vidjeti informacije o pomoći.

Ako je to slučaj, onda avrdude spreman za rad.

Konfigurirajte priključak:

Sudo stty 9600 ignbrk -brkint -icrnl -imaxbel -opost -isig -icanon -iexten -echo noflshTo morate učiniti nakon svakog ponovnog pokretanja računala ili ga dodajte u rc.local.

Gdje je /dev/ttyS0 com1, /dev/ttyS1 - com2 itd.
Ubuduće ću pisati u timovima /dev/ttyS0, možeš imati /dev/ttyS1 itd.

Dodajte programator konfiguracijskoj datoteci /etc/avrdude.conf

Sudo nano /etc/avrdude.conf

Nakon “DEFINICIJE PROGRAMERA” dodajte sljedeće retke:

Programer id = "gromov"; desc = "lukanje serijskog porta, reset=dtr sck=rts mosi=txd miso=cts"; tip = "serbb"; reset = 4; scck = 7; mosi = 3; miso = 8; ;
Programer koristi Bit-banging tehnologiju.

Pazite da kod kopiranja navodnici ostanu samo navodnici, inače se mogu promijeniti (zbog razlike u kodiranju) i avrdude će psovati.

Spremite i zatvorite datoteku.

Dajte naredbu za provjeru veze između MK i programatora:

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

Ako postoji veza, tada će odgovor biti ovakav:

Ovdje završavaju razlike između operativnih sustava i naredbe se dupliciraju.

Dodajte argument naredbi -v ili -v -v (može se dodati bilo kojoj naredbi) za prikaz potpunih informacija:

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


Avrdudeov zaključak je da su i u Windowsima i u Linuxu isti, pa ću od sada snimati screenshotove samo u Winu.

Ovdje ima više informacija, na primjer, možete vidjeti koji su osigurači ugrađeni. Ovdje su ispisani u heksadecimalnom obliku (HEX) brojevima. Na primjer, hfuse 0xDA, u binarnom obliku izgleda ovako - . To jest, to su isti bitovi koji se odjavljuju u grafičkim sučeljima.

Kada imate posla s osiguračima, zapamtite da su u ATmega mikrokontrolerima osigurači obrnuti. To je 0 - Ovo na Yucheno, i 1 - isključeno Yucheno. To uzrokuje zabunu u online kalkulatorima (vidi dolje).

Pročitajmo firmware iz tog područja bljesak (isto kao PROGRAM u uniprofu) naredba:

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

U uniprofu kod je prikazan u programu, ali ovdje će biti zapisan u datoteku.

Firmware čita i zapisuje u datoteku readfl.txt. Pismo h (hex) na kraju označava da podatke treba pisati u heksadecimalnom formatu. Ako napišete pismo b (binarni), bit će zapisano u binarnom sustavu, a ako r (sirovo), tada će podaci biti u "sirovom" obliku (kryakozyabra).

Odavde se pretpostavlja da se win korisnici nalaze u korijenu diska S (C:\), a korisnici Linuxa rade iz svoje početne mape, tako da će datoteke biti tamo spremljene (osim ako nije drugačije navedeno). Tamo bi se trebao nalaziti firmware koji će biti postavljen na MK.

Za win, datoteka će se nalaziti ovdje C:\readfl.txt, a za linux, u /home/user/readfl.txt. Možete otvoriti ovu datoteku i pogledati.

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

Čitanje flash-a i eeproma zajedno:

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 kontrolera:

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

Odspojite pin "reset" - dioda neće treptati, program će biti izbrisan.

Idemo bljeskati MK s prethodno preuzetom datotekom 328test.hex. Leži u korijenu diska C(c:\328test.hex) u sustavu Windows ili u početnoj mapi (/home/user/328test.hex) u 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###

Sada ako isključite "resetiranje", kontroler će oživjeti.

Bilješka. Prilikom treptanja MK putem avrdude, nije potrebno brisati kontroler, program to radi sam. Međutim, ako navedete parametar -D, tada se MK neće automatski očistiti.

EEPROM firmware:

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

Očitavanje svih osigurača:

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

Neki kontroleri možda nemaju osigurač.

Samo čitanje Niski osigurač:

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

Niski osigurač odgovoran je za odabir izvora signala sata (unutarnji, vanjski), njegovu frekvenciju i pauzu prije nego što se regulator pokrene nakon što se na njega priključi napajanje. Sada imate napisanu vrijednost - 0xff, što odgovara vanjskom kvarcu od 8 MHz i više.

Sada ćemo bljeskati još jedan lfuse, koji će prebaciti vaš ATmeg na rad s internog generatora od 8 MHz.

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

Ako imate Arduino od 16 MHz, dioda će treptati dvostruko sporije.
Ubuduće, kod kodiranja u AVR Studio, možete odrediti frekvenciju od 8 MHz i odlemiti kvarc, čime ćete dobiti još dva besplatna digitalna pina na raspolaganju.

Ali to je kasnije, a sada vratimo sve kako je bilo treptanjem prethodnog osigurača:

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 će bljeskati ispravno.

Osigurači se mogu paliti pojedinačno ili zajedno:

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###
Ove naredbe nije potrebno davati. Predstavljam ih radi jasnoće.

Ubuduće, kada budete trebali koristiti druge kontrolere, označit ćete kućice u online kalkulatoru i dobiti vrijednosti (link je u gornjem lijevom kutu) u hex formatu i bljeskajte ga.

Sada preostaje samo odrediti parametre avrdude i možete prijeći na završni dio.

-c gromov- vrsta programera, odnosno naziv pod kojim je napisan u konfiguraciji (avrdude.conf).
-P kom1- Pa, ovdje je sve jasno.
-p m328p- oznaka tipa MK.
-U- nakon ove opcije naznačeno je područje memorije (flash, eeprom, xfuse), na kojem će se izvršiti bilo kakve radnje (r - čitanje, w - pisanje).
Dvotočke služe kao razdjelnici.

Ovdje, s nazivima mikrokontrolera i njihovim aliasima, programatorima i drugim opcijama.

Nadimci 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

Korisnici Linuxa mogu koristiti wine.

Nadam se da ste već sve instalirali, pa pokrenimo AVR Studio...


Ovdje se od nas traži da stvorimo novi projekt ili otvorimo stari. Klik Novi projekt


Odaberite AVR GCC, jer ćemo pisati u SI, a ne u asembleru.
Projektu dajemo naziv i označavamo okvire.
Odaberite Mjesto (Napravio sam AVR mapu na disku C:\) tamo će se automatski kreirati mape s projektima.
Klik Sljedeći


Odaberite AVR simulator, budući da nemamo poseban programator koji omogućuje otklanjanje pogrešaka, a naš mikrokontroler jest ATmega328p.
Klik Završi.

Nakon ovih manipulacija, studio je spreman za rad.

S lijeve strane su staze do projekta. U sredini je uređivač teksta u kojem je napisan kod. S desne strane su registri kontrolera. Dolje lijevo nalaze se informacije o otklanjanju pogrešaka.

Od gumba koji nas trenutno zanimaju ovi -

Izgradite projekt.
Izradite projekt i počnite otklanjati pogreške.
Sastavljanje datoteke.
Čišćenje.
Postavljanje projekta. Pa kliknite na to...

Ovdje možete promijeniti vrstu MK, postaviti frekvenciju sata (napisat ćemo to izravno u kodu), razinu optimizacije, kao i odrediti koje će se datoteke kreirati.
Kliknite na ikone s lijeve strane za interes i kliknite Otkazati.
Neću objašnjavati ove i druge opcije, ali kasnije ću dati vezu s kompetentnim opisom.

Sada kopirajte kod napisan na početku članka i zalijepite ga u editor:

Naveli smo frekvenciju takta u kodu jer to knjižnica zahtijeva kašnjenje.h.

Izgradnja je bila uspješna, nije bilo grešaka niti upozorenja.

Sada idemo dalje C:\AVR\my328\zadano\, tamo nalazimo hex datoteku koju smo stvorili - moj328.hex i flash ga u kontroler. Što bljeskati (avrdude ili uniprof) izaberite sami.

U avrdude će izgledati ovako:

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

Onemogućite "poništavanje" i vidjet ćete da dioda trepće jednom u sekundi. Nadam se da sam vas uvjerio u jednostavnost i praktičnost naredbenog retka.

Da biste Arduino ponovno pretvorili u Arduino, imate rezervnu kopiju.

Kao što je već gore napisano, neću ulaziti u objašnjenja rada sa AVR Studio, niti ću držati lekcije o SI jeziku. Prije svega, ovo nije bio moj plan. (Samo sam želio pomoći u prijelazu s Arduina na AVR Studio)

IDE je integrirano razvojno okruženje koje uključuje različite predloške, biblioteke i funkcije programa za ispravljanje pogrešaka. Ako govorimo o tome, od 2004. za njih je razvijen moćan softverski paket, AVR studio.

Prve verzije

Prve verzije studija uključivale su asembler za , možete ga izdvojiti iz prvih sklopova, ali kasnije je ovaj projekt napušten, a C AVR je odabran kao glavni jezik. Kompajler je bio plaćeni i vrlo ozbiljan IAR proizvod. Možete besplatno preuzeti WINAVR; da biste to učinili, morate ga instalirati nakon instaliranja studija.

Bilješka! Bolje je to učiniti tek nakon instaliranja AVR studio 4 i drugih verzija.

AVR studio 4 (na slici gore) bio je predstavljen dugo vremena. Mnogi programeri mikrokontrolera susreli su se s ovim problemom. Kasnije je IDE nadograđen na AVR studio 5. Osim sučelja, nije bilo posebnih promjena, a tek tada je razvojna tvrtka rebrandirala proizvod i promijenila ime u Atmel studio 6.

Okruženje AVR studio 5 podržava sljedeće mikrokontrolere:

  • AVR32;
  • XMEGA.

Atmel studio 6 značajno se razlikovao od AVR studija 5, a najuočljivije inovacije u verziji bile su:

  1. Microsoft Visual Studio 2010 počeo je raditi s AVR obitelji.
  2. Poboljšano isticanje sintakse u usporedbi s AVR studio 5.
  3. Dodani savjeti i automatsko dovršavanje skupa naredbi, što ubrzava razvojni proces.
  4. Općenito, cjelokupni rad okoline postao je pouzdaniji.
  5. Dodana podrška za ARM Cortex-M.
  6. WinAVR više nije potrebno zasebno instalirati; GCC se sada instalira tijekom procesa instalacije, za razliku od mlađih verzija.

U Atmel studiju 6 došlo je do iskoraka nabolje za korisnika programa, što je utjecalo na popularnost Atmel obitelji. Međutim, nije bilo moguće postići odgovarajuću podršku za ruske znakove u stazama datoteka.

Trenutna verzija – Atmel studio 7

Razvojno okruženje koje sam koristio je Visual Studio Isolated Shell 2015; s jedne strane, ovo rješenje nije podržano u sustavu Windows XP, s druge strane, ove su mjere poduzete kako bi se poboljšao i izgled programa i njegova funkcionalnost.

Možda je najznačajniji dodatak podrške za Arduino u Atmel studiju 7. To znači da možete ići od skupa jednostavnih skica do korištenja svih C funkcija, otklanjanja pogrešaka, MCU simulatora i drugih funkcija. Kombinacija Arduina i Atmel studija 7 dala je novi krug u razvoju ove jednostavne platforme za učenje.

Proučavanje Atmel studija uz Arduino pružit će priliku za prelazak na potpuno i produktivno svladavanje i dublje upoznavanje sa srcem Arduina - mikrokontrolerom Atmega.

Dodatno, s Atmel web stranice možete preuzeti paket za rad i povezivanje LCD-a. Kao primjer za svladavanje možete koristiti LCD 1602; na Internetu ima mnogo lekcija o njemu, a programer ima na zaslonu dostupno 16 znakova i 2 retka.

Gdje početi učiti?

Trebali biste početi, naravno, kupnjom programatora; Najpovoljniji je USBASP. USBASP programator nije podržan u Atmel Studio 7.


Skinite drivere za programator i program AVRdude, a kako bi sve zajedno radilo možete koristiti naredbu preko naredbenog retka:

"avrdude -c usbasp -p atmega32 -U flash:w: naziv datoteke firmvera. šesterokutni -U lfuse:w:0x6a:m -U hfuse:w:0xff:m"

i omogućite njegovu podršku kreiranjem profila u atmel studiju 7 (naslov – vanjski alati), te u stavku Argumenti unesite “-c usbasp -p atmega32 -U flash:w:$(TargetName).hex” i tako dalje za svaki tipa koristite mikrokontrolere.

Ovo je jedini način povezivanja studija i USBASP programatora. Budite oprezni pri bljeskanju - možete oštetiti potpis mikrokontrolera, a on se može vratiti samo programatorom od 12 V (visokonaponski).

Koju literaturu trebam koristiti za obuku?

Prije svega, preuzmite priručnike sa službene web stranice za svaki mikrokontroler. Teško je preporučiti određeni udžbenik, ali postoji “DI Halt - AVR. Tečaj obuke" možete ga koristiti - kreator ovog materijala je praktičar, autor mnogih članaka na raznim internetskim resursima i jednostavno cijenjena osoba u stručnim krugovima.

Rekao sam više od jednom ili dvaput da proučavanje MK treba početi s asemblerom. Cijeli tečaj na web stranici bio je posvećen tome (iako nije baš konzistentan, ali postupno ga češljam do adekvatnog izgleda). Da, teško je, rezultat neće biti prvi dan, ali ćete naučiti razumjeti što se događa u vašem kontroleru. Znat ćete kako radi, a ne kopirati tuđe izvore kao majmun i pokušavati shvatiti zašto je odjednom prestao raditi. Osim toga, C-u je mnogo lakše stvoriti redneck kod koji će izaći s vilama u najnepovoljnijem trenutku.

Nažalost, svi žele rezultate odmah. Pa sam odlučio krenuti drugim putem - napraviti tutorial o C-u, ali s pokazivanjem njegovog donjeg rublja. Dobar embedder programer uvijek čvrsto drži svoj komad hardvera za vijak, ne dopuštajući mu da napravi nijedan korak bez dopuštenja. Dakle, prvo će biti C kod, zatim ono što je kompajler proizveo i kako sve to zapravo radi :)

S druge strane, jaka strana C-a je prenosivost koda. Ako, naravno, sve ispravno napišete. Razdvajanje algoritama rada i njihove hardverske implementacije u različite dijelove projekta. Zatim, za prijenos algoritma na drugi mikrokontroler, bit će dovoljno prepisati samo sloj sučelja, gdje se pišu svi pozivi prema hardveru, i ostaviti sav radni kod kakav jest. I, naravno, čitljivost. C izvorni kod je lakše razumjeti na prvi pogled (iako... na primjer, nije me briga na što pokazati - bio C ili ASM :)), ali, opet, ako je sve ispravno napisano. Također ću obratiti pozornost na ove točke.

Moja debug ploča služit će kao eksperimentalni hardver na koji će biti instaliran lavovski dio svih primjera.

Prvi C program za AVR

Odabir kompajlera i postavljanje okruženja
Postoji mnogo različitih C prevodilaca za AVR:
Prije svega ovo IAR AVR C- gotovo je definitivno prepoznat kao najbolji prevodilac za AVR, jer sam kontroler stvoren je u bliskoj suradnji između Atmela i stručnjaka iz IAR-a. Ali za sve morate platiti. A ovaj kompajler nije samo skupi komercijalni softver, već ima i toliku tonu postavki da je potrebno mnogo truda da se jednostavno kompajlira u njemu. S njim se stvarno nisam sprijateljio; projekt je trunuo zbog čudnih grešaka u fazi povezivanja (kasnije sam saznao da je to bio krivi crack).

Drugi dolazi WinAVR GCC- snažan optimizirajući prevodilac. Potpuno otvoreni kod, više platformi, općenito, sve radosti života. Također se savršeno integrira u AVR Studio, omogućujući vam otklanjanje pogrešaka upravo ondje, što je prokleto zgodno. Općenito, odabrao sam ga.

Postoji također CodeVision AVR C je vrlo popularan prevodilac. Postao je popularan zbog svoje jednostavnosti. U njemu možete dobiti radni program u samo nekoliko minuta - čarobnjak za početni kod to uvelike olakšava ukidanjem standarda za inicijalizaciju svih vrsta stvari. Da budem iskren, nekako sam sumnjičav prema tome - jednom kada sam morao rastaviti program napisan ovim kompajlerom, ispostavilo se da je to nekakav nered, a ne kod. Ogromna količina nepotrebnih pokreta i operacija, što je rezultiralo značajnom količinom koda i sporim performansama. Međutim, možda postoji pogreška u DNK osobe koja je napisala originalni firmware. Osim toga, želi novac. Ne toliko kao IAR, ali primjetno. A u demo načinu rada omogućuje vam da napišete ne više od 2kb koda.
Naravno da postoji crack, ali ako ćeš ukrasti, to je milijun, u IAR smislu :)

Postoji također Slika Craft AVR C I MicroC iz mikroelektronike. Nisam morao koristiti ni jedno ni drugo, ali S.W.G. vrlo pohvalno MicroPascal, kažu, užasno zgodno programsko okruženje i biblioteke. Mislim da MicroC neće biti ništa lošiji, ali se također plaća.

Kao što sam rekao, izabrao sam WinAVR iz tri razloga: besplatan je, integrira se u AVR Studio i postoji samo tona gotovog koda napisanog za sve prilike.

Dakle, preuzmite WinAVR instalaciju s AVR Studio. Zatim se prvo instalira studio, zatim se WinAVR postavlja na vrh i pričvršćuje na studio u obliku dodatka. Toplo preporučam instaliranje WinAVR-a na kratkoj stazi, nešto poput C:\WinAVR, na taj način ćete izbjeći puno problema sa stazama.

Izrada projekta
Dakle, studio je instaliran, C je uvrnut, vrijeme je da pokušamo nešto programirati. Počnimo s jednostavnim, najjednostavnijim. Pokrenite studio, tamo odaberite novi projekt kao AVR GCC prevodilac i unesite naziv projekta.

Otvara se radno polje s praznom *.c datotekom.

Sada neće škoditi konfigurirati prikaz staza u knjižnim oznakama studija. Da biste to učinili, idite na:
Izbornik Alati - Opcije - Općenito - Kartice datoteka i odaberite "Samo naziv datoteke" s padajućeg popisa. Inače će biti nemoguće raditi - kartica će sadržavati punu putanju datoteke i na zaslonu neće biti više od dvije ili tri kartice.

Postavljanje projekta
Općenito, klasičnim se smatra stvaranje make datoteke u kojoj su opisane sve ovisnosti. I to je vjerojatno točno. Ali za mene, koji sam odrastao s potpuno integriranim IDE-ima poput uVision ili AVR studio ovaj pristup je duboko stran. Stoga ću to učiniti na svoj način, sve koristeći studio znači.

Pritisnite gumb zupčanikom.


Ovo su postavke za vaš projekt, odnosno postavke za automatsko generiranje make datoteke. Na prvoj stranici samo trebate unijeti frekvenciju na kojoj će vaš MK raditi. Ovo ovisi o bitovima osigurača, pa pretpostavljamo da je naša frekvencija 8000000Hz.
Također obratite pozornost na liniju optimizacije. Sada postoji -Os - ovo je optimizacija veličine. Za sada ostavite kako jest, a zatim se možete pokušati igrati s ovim parametrom. -O0 nije nikakva optimizacija.

Sljedeći korak je konfiguriranje staza. Prije svega, tamo dodajte direktorij svog projekta - tamo ćete dodati biblioteke trećih strana. Putanja “.\” pojavit će se na popisu.

Datoteka Make je generirana, možete je pogledati u zadanoj mapi u vašem projektu, samo pogledajte i vidite što je tamo.


To je sve za sada. Svugdje kliknite OK i idite na izvor.

Formulacija problema
Prazan list papira primamljiv je za implementaciju neke lukave ideje, jer banalno treptanje diode više ne radi. Idemo odmah uhvatiti bika za rogove i implementirati vezu s računalom - to je prva stvar koju radim.

Radit će ovako:
Kada na COM port stigne jedinica (šifra 0x31), dioda će se uključiti, a kada stigne nula (šifra 0x30) ona se gasi. Štoviše, sve će se raditi na prekidima, a pozadinski zadatak bit će treptanje druge diode. Jednostavno i smisleno.

Sastavljanje kruga
Moramo spojiti USB-USART modul pretvarača na USART pinove mikrokontrolera. Da biste to učinili, uzmite skakač iz dvije žice i postavite ga na igle unakrsno. Odnosno, spajamo Rx kontrolera na Tx pretvarača, a Tx pretvarača na Rx regulatora.

Na kraju, ovo je dijagram:


Ne razmatram spajanje preostalih pinova, napajanje ili resetiranje, to je standardno.

Pisanje koda

Dopustite mi da odmah rezerviram da se neću posebno upuštati u opis samog jezika C. Za to postoji naprosto kolosalna količina materijala, od klasičnog “programskog jezika C” od K&R do raznih priručnika.

Pronašao sam jednu takvu metodu u svojoj zalihi; jednom sam je koristio za proučavanje ovog jezika. Tamo je sve kratko, jasno i poenta. Postupno ga sastavljam i povlačim na svoju web stranicu.

Istina je da još nisu sva poglavlja prenesena, ali mislim da neće još dugo.

Malo je vjerojatno da to mogu bolje opisati, pa ću iz tečaja obuke, umjesto detaljnog objašnjenja suptilnosti, jednostavno dati izravne veze na pojedinačne stranice ovog priručnika.

Dodavanje knjižnica.
Prije svega, dodajemo potrebne biblioteke i zaglavlja s definicijama. Uostalom, C je univerzalni jezik i moramo mu objasniti da radimo posebno s AVR-om, pa napišite redak u izvornom kodu:

1 #uključi

#uključi

Ova se datoteka nalazi u mapi WinAVR a sadrži opis svih registara i portova kontrolera. Štoviše, sve je lukavo, s vezanjem na određeni kontroler, koji prevodilac prenosi putem napraviti datoteka u parametru MCU i na temelju ove varijable, datoteka zaglavlja povezana je s vašim projektom s opisom adresa svih portova i registara za ovaj određeni kontroler. Wow! Bez njega je također moguće, ali tada nećete moći koristiti simbolička imena registara kao što su SREG ili UDR i morat ćete zapamtiti adresu svakog od njih kao što je "0xC1", što će biti glavobolja.

Sama ekipa #uključi<имя файла> omogućuje vam da svom projektu dodate sadržaj bilo koje tekstualne datoteke, na primjer, datoteku s opisom funkcija ili dio drugog koda. I kako bi direktiva mogla pronaći ovu datoteku, odredili smo put do našeg projekta (WinAVR direktorij je tamo već registriran prema zadanim postavkama).

Glavna funkcija.
C program se u potpunosti sastoji od funkcija. Mogu se ugniježđivati ​​i pozivati ​​jedni od drugih bilo kojim redoslijedom i na različite načine. Svaka funkcija ima tri potrebna parametra:

  • Povratna vrijednost je npr. grijeh(x) vraća vrijednost sinusa od x. Kao u matematici, ukratko.
  • Preneseni parametri su isti X.
  • Funkcijsko tijelo.

Sve vrijednosti koje se prenose i vraćaju moraju biti neke vrste, ovisno o podacima.

Svaki C program mora sadržavati funkciju glavni kao ulazna točka u glavni program, inače uopće nije C :). Po prisutnosti glavnog u tuđem izvornom kodu iz milijun datoteka, možete shvatiti da je ovo glavni dio programa, gdje sve počinje. Pa pitajmo:

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

int main(void) ( return 0; )

To je to, prvi najjednostavniji program je napisan, nema veze što ne radi ništa, tek smo krenuli.

Shvatimo što smo učinili.
int Ovo je vrsta podataka koju glavna funkcija vraća.

Naravno, u mikrokontroleru glavni u principu se ništa ne može vratiti a u teoriji bi trebalo biti void glavni (praznina), ali GCC je izvorno dizajniran za PC i tamo program može vratiti vrijednost operativnom sustavu nakon završetka. Stoga GCC na void glavni (praznina) kune Upozorenje.

Ovo nije greška, radit će, ali ne volim upozorenja.

poništiti ovo je tip podataka koji prosljeđujemo funkciji, u ovom slučaju glavni također ne može prihvatiti ništa izvana, dakle poništiti- lutka. Dopuna se koristi kada nema potrebe ništa slati ili vraćati.

Evo ih { } vitičaste zagrade su programski blok, u ovom slučaju tijelo funkcije glavni, kod će se nalaziti tamo.

povratak- ovo je povratna vrijednost koju će glavna funkcija vratiti po završetku, pošto imamo int, odnosno broj, onda moramo vratiti broj. Iako to još uvijek nema smisla, jer... na mikrokontroleru, jedino ne možemo ići nikamo od glavnog. vraćam nulu. Jer nije bitno. Ali prevodilac je obično pametan i ne generira kod za ovaj slučaj.
Iako, ako je izopačen, onda iz glavni Možete otići na MK - na primjer, ući u odjeljak pokretačkog programa i izvršiti ga, ali to će zahtijevati nisku razinu petljanja s firmverom kako bi se ispravile prijelazne adrese. U nastavku ćete vidjeti sami i razumjeti kako to učiniti. Za što? Ovo je drugo pitanje, u 99,999% slučajeva to nije potrebno :)

Uspjeli smo i krenuli dalje. Dodajmo varijablu, ne treba nam baš i nema smisla uvoditi varijable bez nje, ali učimo. Ako se varijable dodaju unutar tijela funkcije, onda su lokalne i postoje samo u ovoj funkciji. Kada izađete iz funkcije, te se varijable brišu, a RAM memorija se dodjeljuje za važnije potrebe. .

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

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

nepotpisan znači nepotpisano. Činjenica je da je u binarnom prikazu najvažniji bit dodijeljen znaku, što znači da broj +127/-128 stane u jedan bajt (char), ali ako se znak odbaci, stat će od 0 do 255. Obično znak nije potreban. Tako nepotpisan.
ja je samo ime varijable. Ne više.

Sada moramo inicijalizirati portove i UART. Naravno, možete uzeti i spojiti knjižnicu i pozvati neku vrstu UartInit(9600); ali tada nećeš znati što se zapravo dogodilo.

Mi radimo ovo:

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<

Zastrašujuće? Zapravo, postoji samo pet zadnjih redaka pravog koda. Sve, to #definirati to je predprocesorski makro jezik. Gotovo iste stvari kao u Assemblyju, ali je sintaksa malo drugačija.

Oni će vam olakšati rutinske operacije izračuna potrebnih koeficijenata. U prvom redu kažemo da umjesto toga XTAL možete sigurno zamijeniti 8000000, i L- oznaka tipa, govoreći long je taktna frekvencija procesora. Isto brzina prijenosa podataka— učestalost prijenosa podataka putem UART-a.

bauddivider već kompliciraniji, umjesto njega će se zamijeniti izraz izračunat pomoću formule iz prethodna dva.
Dobro i L.O. I BOK niski i visoki bajt će se uzeti iz ovog rezultata, jer Očito možda ne stane u jedan bajt. U BOK X (ulazni parametar makronaredbe) pomaknut je osam puta udesno, što rezultira time da ostaje samo najznačajniji bajt. I u L.O. radimo bitni AND s brojem 00FF, kao rezultat će ostati samo niži bajt.

Dakle, sve što je učinjeno je kao #definirati možete ga mirno baciti, a potrebne brojke izračunati na kalkulatoru i odmah ih unijeti u retke UBBRL = …. i UBBRH = …..

Limenka. Ali! Napravi to APSOLUTNO NEMOGUĆE!

Radit će ovako ili onako, ali ćete imati tzv magični brojevi- vrijednosti uzete niotkuda i iz nepoznatih razloga, a ako za par godina otvorite takav projekt, bit će vraški teško shvatiti koje su to vrijednosti. Čak i sada, ako želite promijeniti brzinu, ili promijeniti frekvenciju kvarca, sve će se morati ponovno izračunati, ali promijenili ste par brojeva u šifri i to je to. Općenito, ako ne želite biti označeni kao koder, napravite svoj kod tako da bude lak za čitanje, razumljiv i lak za modifikaciju.

Onda je sve jednostavno:
Svi ovi “UBRRL and Co” su konfiguracijski registri UART odašiljača uz pomoć kojih ćemo komunicirati sa svijetom. Sada smo im dodijelili tražene vrijednosti, postavljajući ih na željenu brzinu i način rada.

Vrsta snimanja 1< Znači sljedeće: uzmite 1 i stavite ga na mjesto RXEN u bajtu. RXEN ovo je 4. bit registra UCSRB, Dakle 1< tvori binarni broj 00010000, TXEN- ovo je 3. bit, i 1< dat će 00001000. Jedan "|" to je bitwise ILI, dakle 00010000 | 00001000 = 00011000. Na isti način, preostali potrebni konfiguracijski bitovi se postavljaju i dodaju općoj hrpi. Kao rezultat toga, prikupljeni broj se bilježi u UCSRB. Više detalja opisano je u podatkovnoj tablici na MK u odjeljku USART. Dakle, nemojmo se ometati tehničkim detaljima.

Gotovo, vrijeme je da vidimo što se dogodilo. Kliknite na kompilaciju i pokrenite emulaciju (Ctrl+F7).

Otklanjanje pogrešaka
Prolazile su razne trake napretka, studio se mijenjao i žuta strelica se pojavila blizu ulaza u glavnu funkciju. Ovdje trenutno radi procesor i simulacija je pauzirana.

Činjenica je da je inicijalno, zapravo, bilo na liniji UBRRL = LO(bauddivider); Uostalom, ono što imamo u definiciji nije kod, već samo preliminarne kalkulacije, zbog čega je simulator malo dosadan. Ali sada je shvatio, prva uputa je završena i ako se popnete na drvo I/O pogled, u odjeljak USART i tamo pogledajte bajt UBBRL, vidjet ćete da je vrijednost već tamo! 0x33.

Napravite korak dalje. Pogledajte kako se mijenja sadržaj drugog registra. Dakle, prođite ih kroz sve, obratite pozornost na to da su svi naznačeni bitovi postavljeni kao što sam vam rekao, i da su postavljeni istovremeno za cijeli bajt. Neće dalje od Povratka – program je gotov.

Otvor
Sada vratite simulaciju na nulu. Kliknite tamo Reset (Shift+F5). Otvorite rastavljeni popis, sada ćete vidjeti što se zapravo događa u kontroleru. Pogled -> Disassembler. A ne JAAAAAAA!!! Asembler!!! UŽAS!!! I POTREBNO JE. Tako da kasnije, kad nešto pođe po zlu, ne budete glupi u kodu i ne postavljate jadna pitanja na forumima, već odmah uđite u srž i vidite gdje ste zapeli. Nema tu ništa strašno.

Prvo će biti 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 Jump +00000010: 940C0034 JMP 0x00000034 Jump +00000012: 940C0034 JMP 0x00000034 Jump +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

Ovo je tablica vektora prekida. Kasnije ćemo mu se vratiti, ali za sada samo pogledajte i zapamtite da postoji. Prvi stupac je adresa flash ćelije u kojoj se nalazi naredba, drugi je kod naredbe, treći je mnemonika naredbe, ista instrukcija za sklapanje, treći su operandi naredbe. Pa, automatski komentar.
Dakle, ako pogledate, postoje kontinuirani prijelazi. A kod JMP naredbe je četiri bajta, sadrži adresu skoka napisanu unatrag - niži bajt na nižoj adresi i kod naredbe skoka 940C

0000002B: BE1F IZLAZ 0x3F,R1 Izlaz na I/O lokaciju

Snimanje ove nule na adresi 0x3F. Ako pogledate stupac prikaza I/O, vidjet ćete da je adresa 0x3F adresa SREG registra - registra zastavice kontrolera. Oni. resetiramo SREG da pokrene program pod nultim uvjetima.

1 2 3 4 +0000002C: E5CF LDI R28,0x5F Učitaj odmah +0000002D: E0D4 LDI R29,0x04 Učitaj odmah +0000002E: BFDE OUT 0x3E,R29 Izlaz na I/O lokaciju +0000002F: BFCD OUT 0x3D,R28 Izlaz na I/O lokaciju

0000002C: E5CF LDI R28,0x5F Učitaj odmah +0000002D: E0D4 LDI R29,0x04 Učitaj odmah +0000002E: BFDE OUT 0x3E,R29 Izlaz na I/O lokaciju +0000002F: BFCD OUT 0x3D,R28 Izlaz na I/O lokaciju

Ovo je učitavanje pokazivača stoga. Ne možete izravno učitati u I/O registre, samo kroz srednji registar. Stoga, prvo LDI do posrednika, a zatim odatle OUT do I/O. Kasnije ću vam reći više o hrpi. Za sada znajte da je ovo područje dinamičke memorije koje visi na kraju RAM-a i pohranjuje adrese i međuvarijable. Sada smo naznačili odakle će početi naš stog.

00000032: 940C0041 JMP 0x00000041 Skok

Skočite na sam kraj programa, a tamo imamo zabranu prekida i uske petlje po sebi:

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 u slučaju nepredviđenih okolnosti, kao što je napuštanje glavne funkcije. Upravljač se može izvesti iz takve petlje ili hardverskim resetiranjem ili, što je vjerojatnije, resetiranjem od strane čuvara. Pa, ili, kao što rekoh gore, ispravite ovo u hex editoru i odgalopirajte gdje god nam srce želi. Također imajte na umu da postoje dvije vrste prijelaza: JMP i RJMP; prvi je izravan prijelaz na adresu. Zauzima četiri bajta i može izravno skakati kroz cijelo područje memorije. Drugi tip prijelaza je RJMP - relativni. Njegova naredba zauzima dva bajta, ali se on pomiče s trenutne pozicije (adrese) 1024 koraka naprijed ili natrag. A njegovi parametri pokazuju pomak od trenutne točke. Češće se koristi jer zauzima pola prostora u ispiranju, a dugi prijelazi rijetko su potrebni.

1 +00000034: 940C0000 JMP 0x00000000 Skok

00000034: 940C0000 JMP 0x00000000 Skok

A ovo je skok na sam početak koda. Svojevrsno ponovno pokretanje. Ovdje možete provjeriti da li svi vektori skaču. Zaključak iz ovoga je da ako sada omogućite prekide (oni su onemogućeni prema zadanim postavkama) i vaš se prekid dogodi, ali nema rukovatelja, tada će doći do resetiranja softvera - program će biti vraćen na sam početak.

Glavna funkcija. Sve je slično, ne treba ni opisivati. Pogledajte samo već izračunati broj koji se upisuje u registre. Predprocesor prevoditelja je odličan!!! Dakle, nema “čarobnih” brojeva!

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

00000036: E383 LDI R24,0x33 Učitaj odmah +00000037: B989 OUT 0x09,R24 Izlaz na I/O lokaciju 15: UBRRH = HI(bauddivider); +00000038: BC10 OUT 0x20,R1 Izlaz na I/O lokaciju 16: UCSRA = 0; +00000039: B81B OUT 0x0B,R1 Izlaz na I/O lokaciju 17: UCSRB = 1<

A evo buga:

1 2 3 +0000003E: E080 LDI R24.0x00 Učitaj odmah +0000003F: E090 LDI R25.0x00 Učitaj odmah +00000040: 9508 RET Povratak potprograma

0000003E: E080 LDI R24.0x00 Učitaj odmah +0000003F: E090 LDI R25.0x00 Učitaj odmah +00000040: 9508 RET Povratak potprograma

Pitanje je, zašto kompilator dodaje takve vrhove? I ovo nije ništa više od Return 0, definirali smo funkciju kao int main(void) i tako smo uzalud potrošili još četiri bajta :) A ako napravite void main(void) onda će ostati samo RET, ali će se pojaviti upozorenje , da naša glavna funkcija ne vraća ništa. Općenito, radi kako hoćeš :)

teško? Očigledno nije. Kliknite izvođenje korak po korak u disassembler modu i pogledajte kako procesor izvršava pojedinačne instrukcije, što se događa s registrima. Kako se odvija kretanje kroz naredbe i završna petlja?

Nastavak za par dana...

Offtop:
Aleksej78 Napravio sam dodatak za Firefox koji olakšava navigaciju mojom web stranicom i forumom.
Rasprava i preuzimanje,

Atmel Studio je integrirana razvojna platforma koja pruža mogućnost dizajniranja i otklanjanja pogrešaka u aplikacijama razvijenim za Atmel mikrokontrolere temeljene na procesorskoj arhitekturi serije ARM Cortex-M. Atmel Studio je besprijekorno okruženje jednostavno za korištenje koje pruža mogućnost otklanjanja pogrešaka i izrade aplikacija kreiranih u C/C++ ili asemblerskom jeziku. Ima ugrađenu opsežnu biblioteku potpuno besplatnog izvornog koda Atmel Software Frameworka, koja uključuje više od 1600 projekata za ARM i AVR arhitekture. Imati takvu biblioteku veliki je bonus za svakog programera. Ovaj IDE se može koristiti za programiranje širokog spektra AVR-baziranih mikrokontrolera, kao i Atmel SAM3-baziranih flash mikrokontrolera koji koriste Cortex-M3, Cortex-M4 jezgre.

Atmel Studio također uključuje alate koji će svakom programeru uvelike olakšati život. Platforma uključuje rješenja kao što su Atmel Spaces i Atmel Gallery. Atmel Gallery je online trgovina razvojnih alata i integriranog softvera. Atmel Spaces je prostor temeljen na oblaku za kolaborativni razvoj i pohranu projektnih datoteka hardvera i softvera za Atmel mikrokontrolere.

Ključne značajke i funkcije

  • je potpuno besplatno integrirano razvojno okruženje;
  • podržava C/C++ i asembler jezike;
  • popraćeno detaljnom dokumentacijom;
  • uključuje opsežnu biblioteku s primjerima izvornog koda za razne aplikacije;
  • dizajniran za programiranje Atmel mikrokontrolera.

Posebni zahtjevi

  • takt procesora od 1,6 GHz i više;
  • za 32-bitne sustave od 1 GB RAM-a;
  • za 64-bitne sustave od 2 GB RAM-a;
  • pri radu na virtualnom stroju preporučuje se dodatnih 512 MB RAM-a;
  • 6 GB slobodnog prostora na tvrdom disku.

Što je novo u ovoj verziji?

7.0.790 (25.02.2016)

  • dodana podrška za prošireni program za ispravljanje pogrešaka (EDBG);
  • dodana podrška za profile postavki sučelja. Možete se prebacivati ​​između profila pomoću tipki na ploči postavki;
  • dodana mogućnost uvoza knjižnica u prethodno uvezene projekte. Dodana podrška za Arduino Zero i Zero Pro;
  • paralelna izgradnja sada je omogućena prema zadanim postavkama;
  • ažurirani firmware za Xplained Mini;
  • Ispravljena je funkcija "Prikaži sve datoteke" u Solution Exploreru.