Hvorfor begynne å programmere atmega8. Programmering av AVR-mikrokontrollere. Hvordan blinke kontrolleren, og hvilket tilbehør og tilbehør som kreves for manuell betjening med dem


I dette introduksjonskurset med AVR prøvde jeg å beskrive alt det viktigste for nybegynnere innen programmering av mikrokontrollere avr. Alle applikasjoner er basert på mikrokontrollere atmega8. Dette betyr at for å gjenta alle leksjonene trenger du bare én MK. Som en emulator av elektroniske kretser brukes Proteus - etter min mening det beste alternativet for nybegynnere. Programmene for alle applikasjoner er skrevet i C-kompilatoren for CodeVision AVR AVR. Hvorfor ikke bruke assemblerspråk? Fordi folk er så fascinert av informasjon, og et program som multipliserer to tall i assemblerspråk tar opp nærmere hundre rader, er det enkelt å bruke i komplekse prosjekter.CodeVision AVR-kompilatoren for atmel-mikrokontrollere kan være enkel kodegenerator, dårlig grensesnitt og rett fra Du kan nå flashe mikrokontrolleren.

I dette innledende kurset vil det bli vist og vist på enkle romper som følger:

  • Begynn å programmere mikrokontrollere, start med det du trenger.
  • Hva slags programmer du skal bruke for å skrive fastvare for avr, for å simulere og forbedre koden på en PC,
  • Hvilke eksterne enheter er plassert i midten av MK, hvordan de støtter tilleggsprogrammer
  • Hvordan skrive den ferdige fastvaren til mikrokontrolleren og hvordan du kan dra nytte av den
  • Yak zrobiti drukovanu-avgift for vedlegget ditt
For å tjene dine første penger på måten å programmere MK på, trenger du bare to programmer:
  • Proteus er en emulatorprogrammerer (med den kan du utvikle en krets uten å gå til poenget med ekte lodding og deretter teste programmet vårt på denne kretsen). Alle prosjekter lanseres i utgangspunktet i Proteus, og deretter er det mulig å lodde en ekte enhet.
  • CodeVisionAVR er en filmkompilator for AVR. Vi har utviklet programmer for mikrokontrolleren, og du kan flashe en ekte MK direkte fra den.
Etter å ha installert Proteus, starter vi den
Vi vil bli overrasket over prosjektene som følger med det, som vi kan forestille oss. La oss nå lage den enkleste ordningen for henne. Når du klikker på ikonet, vises ingenting visuelt. Nå må du trykke på den lille bokstaven P (velg fra biblioteket) på komponentlistepanelet åpnes vinduet for valg av komponent
I maskefeltet skriver du inn navnet på komponenten du vil vite fra biblioteket. For eksempel må vi legge til en mega8 mikrokontroller
i resultatlisten, klikk på mega8 og trykk på knappen OK. Vår liste over komponenter inkluderer mega8-mikrokontrolleren
I denne metoden kan du legge til en motstand i listen over komponenter ved å skrive inn ordmasken i feltet res og LED ledet

For å plassere deler på diagrammet, klikk på delen, klikk deretter på diagramfeltet, velg stedet der komponenten skal plasseres, og klikk igjen. For å legge til bakken eller et negativt minus til det onde diagrammet, klikk på "Terminal" og velg Ground. Dermed, etter å ha lagt til alle komponentene og koblet dem til, kan vi lage en så enkel krets
Det var det, nå er vårt første opplegg klart! Ale du, kanskje, sover, men hva kan du gjøre? Ingenting. Ingenting, for for å be om en mikrokontroller, må du skrive et program. Et program er en liste over kommandoer som ligner på konfigurasjonen til en mikrokontroller. Vi trenger mikrokontrolleren som skal installeres på beina PC0 logisk 0 (0 volt) og logisk 1 (5 volt).

Skrive programmer for mikrokontrolleren

Programmet er skrevet med min C-kompilator CodeVisionAVR. Etter å ha lansert CVen, vil den spørre oss hva vi vil lage: Kilde eller prosjekt Vi velger å forbli og trykker på OK-knappen. Deretter vil vi bli bedt om å starte CVAVR CodeWizard-mesteren (dette er et uvurderlig verktøy for å komme i gang, for i det kan du generere hovedskjelettet til programmet) vi samler inn Ja
Masteren startes fra den aktive Chip-fanen, her kan vi velge modellen til vår MK - mega8, og frekvensen som MK opererer med (for eksempel er mega8 satt til en frekvens på 1 megahertz), så setter vi alt som vist i skjermbildet ovenfor. Gå til fanen Porter
Atmega8-mikrokontrolleren har 3 porter: Port C, Port D, Port B. Skinporten har 8 ben. Benene til havnene finnes i to land:
  • Vikhid
Bak tilleggsregisteret DDRx.y kan vi installere inngangs- og utgangspinnene. Yakshcho inn
  • DDRx.y = 0 - visnovok fungerer slik VHID
  • DDRx.y = 1 visnovka pr VIHID
Hvis pinnen er konfigurert som en utgang, kan vi sette den til logisk 1 (+5 volt) og logisk 0 (0 volt). Registrer deg med PORTx.y-registeret. Ytterligere informasjon om I/O-porter vil bli diskutert i detalj. Og umiddelbart installerer vi alt, som vist på skjermbildet, og klikker Fil->Generer, Lagre og Avslutt. Deretter instruerer CodeWizard oss ​​om å lagre prosjektet, vi lagrer det og ser på koden:

#inkludere //bibliotek for å lage klokkeforsinkelser void main(void) ( PORTB=0x00; DDRB=0x00; PORTC=0x00; DDRC=0x01; // sjekk nøye PC0-utgang PORTD=0x00; DDRD=0x00; // Timer/teller 0 initialisering TCCR0=0x00, TCNT0=0x00;// Timer/Teller 1 initialisering TCCR1A=0x00; TCCR1B=0x00; TCNT1H=0x00; =0x00 OCR1BL = 0x00; // Timer/Teller 0 initialisering AS00 = TC0 CR20SR; TCNT2 = 0x00; ) Interrupt(s) initialization TIMSK=0x00;// Analog Comparator initialization ACSR=0x80; SFIOR=0x00; mens (1) ( );


Her tenker du kanskje at alt er skummelt og ukjent, men i virkeligheten er ikke alt slik. Koden kan tilgis ved å forkaste initialiseringen av de eksterne enhetene til MK, for ikke å bli ødelagt. Etter tilgivelse ser det slik ut:

#inkludere //Bibliotek for roboter med mega8 mikrokontroller #include //bibliotek for å lage tidsur void main(void) ( DDRC=0x01; /* Vær oppmerksom på at PC0-utdataposten 0x01 kan være ukjent for deg, men så lenge tallet 1 er i heksadesimal form, vil denne raden tilsvare 0b00 000001 Jeg skriver til meg selv slik.* / while (1) ( );


Alt er bra. Men for at LED-en skal lyse, må vi endre det logiske nivået på PC0. For dette til hovedsyklusen er det nødvendig å legge til et antall rader:

#inkludere //Bibliotek for roboter med mega8 mikrokontroller #include //bibliotek for å lage tidsur void main(void) ( DDRC=0x01; /* Vær oppmerksom på at PC0-utdataposten 0x01 kan være ukjent for deg, men så lenge tallet 1 er i heksadesimal form, vil denne raden tilsvare 0b00 000001 Jeg skal skrive det selv. 500 millisekunder PORTC.0=0; //sett til bunn 0 port 3 0 delay_ms(500); //robust forsinkelse på 500 millisekunder);//lukker operatørhåndtaket til programmets hodeløkke)


Nå er koden klar. Klikk på Bygg alle prosjektfiler-ikonet for å kompilere programmet vårt (oversett til MK-prosessorinstruksjonene). Exe-mappen, som ligger i prosjektet vårt, kan ha en fil med hex-utvidelser, som også inkluderer en fastvarefil for MK. For å bruke fastvaren vår på den virtuelle mikrokontrolleren i Proteus, må du dobbeltklikke på bildet av mikrokontrolleren i Proteus. Aksen vises til slutt
Klikk på mappeikonet i Program File-feltet, velg hex-filen til fastvaren vår og klikk OK. Nå kan vi kjøre simuleringen av kretsen vår. For å gjøre dette, klikk på "Åpne på nytt"-knappen nederst til venstre i Proteus-vinduet.

Hei, MySku-beboere! Helten i vår anmeldelse er Atmega8A-16PU-mikrokontrolleren. Jeg vil fortelle deg om programmeringen av denne mikrokontrolleren i den integrerte kjernen av CodeVisionAvr-utviklingen, LED-en blinker, og vi vil se på fordeler og ulemper ved å jobbe i denne kjernen. Kanskje det vil tjene som et alternativ for deg til den allerede "folkelige" Arduinoen. Hvis du ble sittende fast, fortsett og kutt.

Innledning.
Det hendte at jeg begynte min kunnskap om MK med Arduino. Ved å skinne lysdioden, koble til forskjellige sensorer og skjold, jobbe med forskjellige prosjekter. Alt ordnet seg, jeg var overveldet, men jeg ville ha noe mer. Etter å ha kommet over ett prosjekt, der Atmega8A er den samme, må jeg skrive fastvaren selv. Selv presset han meg opp til prosessen med å programmere den nakne MK.
Vel, vi har en mikrokontroller fra Atmel, AVR Atmega8A-familien.

Tekniske egenskaper:


Rozpinuvannya:


Kjenner folk her
Nå for robotprogrammering må du koble den til programmereren ved hjelp av kretsen:

Det er synd at jeg som innfødt ikke har en programmerer for hånden, så jeg bruker Arduino UNO for å installere ferdig firmware og stille inn sikringer i MK. Alt du trenger å gjøre er å laste ned "Arduinoisp"-skissen fra Arduino IDE-applikasjonsmappen og koble den til kretsen:


Men hvis avgjørelse har en sutteva vada, som vi vil diskutere litt senere. Før vi begynner å skrive CodeVisionAvr (heretter referert til som CvAvr)-programmene, må vi vite med hvilken frekvens vår MK vil operere. Fra fabrikken driver helten vår en intern rc-generator med en frekvens på 1 MHz (med mulighet for omjustering til 2, 4 og 8 MHz). Delene til den interne RC-generatoren er kalibrert på fabrikken av spesifikke årsaker (nøyaktig spenning, temperatur), da kan nøyaktigheten av arbeidet i feltet variere fra 3% til 10%. For prosjekter der høy presisjon av timing ikke er nødvendig, er det mulig å få tak i, i andre tilfeller er det bedre å bruke ekstern kvarts. Prosjektet ditt har en ekstern kvarts med en frekvens på 8 MHz. Nå må vi "forklare" til MK hva som må gjøres med moderne kvarts. Prøv å bytte sikringer for å hjelpe. For å forklare "til fingerspissene", betyr det at du på BIOS-skjermen, som på hovedkortet, angir driftsmodusene, på samme måte blir vi informert av MK, i hvilke moduser, foruten frekvensen, du er skyldig i uaktsomhet. All informasjon lagres i ikke-flyktig minne.
Jeg vil fortelle deg om fastvaren til sikringer under spoileren, de som er i stand til å jobbe på egenhånd kan snakke videre.

tilleggsinformasjon

Hvordan registrere denne fusien?! Av denne grunn brukte jeg AvrDude-programmet, det er gratis og kan enkelt finnes på Internett. For å stille inn sikringen riktig i henhold til den nødvendige frekvensen, er det åpenbart, men vi kan også raskt tilgi.
Vi kan stille inn parameterne som på bildet.


Alt er enkelt her:
Klokkekilde – still inn frekvensen (ekstern krystall 3 – 16 Mhz) fra den eksterne kvartsen.
Oppstartstid – oppstartshastighet etter at RESET er sluppet eller etter strømtilførsel (16K CK + 4,1ms raskt).
Kryss av i boksen: Ekst. Klokke/RC Osc./Lavfrek. Krystall: aktiver interne kondensatorer (36 pF)
Intern R/C Osc.: la være umerket! Ekstern krystall: aktiver full sving (påkrevd >8 MHz).
Dermed valgte vi Low Fuse 0xEF og High Fuse 0xC9. Mirakuløst, de fikk rett. Nå kobler vi til Arduino UNO, og selve Arduino kobles til datamaskinen. Vi starter kommandoraden, gå til mappen med AvrDude. Følgende rad legges inn: avrdude -C avrdude.conf -c avrisp -P COM13 -b 19200 -p m8 -U lfuse:w:0xef:m -U hfuse:w:0xc9:m
Aksen ser slik ut på bildet:


La oss ta en titt på raden som ble introdusert:
avrisp er en type vår Arduino-lignende programmerer
COM13 - com-portnummer, som er der Arduinoen vår identifiseres på systemet (hvis du trenger å se dette i enhetsbehandlingen)
19200 - båndbredden til com-porten, fratatt den
m8 – det er tydelig at vår MK er Atmega8
-U sikring:w:0xef:m -U hsikring:b:0xc9:m - vår lav sikring 0xEF og høy sikring 0xC9 er indikert her
Være RESPEKT!!, feil inntastet sikring kan føre til keruvannya mk (danser med tamburin er ikke lenger nødvendig for oss).
Vi trykker på "Introduksjon" og ved utgangen trekker vi ut resultatet, som en baby:


Siden prosessen ikke mottok noen tjenester, er arbeidet til Vikonan, vår MK nå brukt som en erstatning for moderne kvarts.
Du kan lese om fuzi i detalj, samt wiki-søk på Google.


Nå er vi klare til å skrive ut programmeringen. For meg selv valgte jeg midten av rozrobki CvAvr. Vår programmering vil være basert på "Arduino"-versjonen, i CvAvr i den C-lignende versjonen. La oss skrive vårt første Blink.
Når mellomvaren er installert og lansert, akselereres opprettelsen av prosjekter av masteren. Velg "Fil" - "Ny" - "Prosjekt". På grunnlag av vår kunnskap er vår mester fast overbevist. Target AVR Chip Type kan spesifiseres som AT90, ATtity, ATmega.
Slik ser en prosjektmester ut:


På Chip-fanen velger du ATmega8A, Klokke 8.000 000 Mhz. Gå til fanen Porter. LED-en vår vil være koblet til den 14. pinouten på mikrokontrolleren, med start fra pinouten - PB0. På fanen er port B valgt, bit 0 byttes fra IN til OUT, deretter. Vi overfører robotmodus 14 til bena på vår MK for å avslutte.


Mesterens arbeid er ferdig. Velg "Program" - "Generer, lagre og avslutt". Vi lagrer for eksempel prosjektet vårt under navnet Blink.

La oss fjerne denne aksen

/*******************************************************
Dette programmet for kreasjoner for
CodeWizardAVR V3.12 Avansert
Automatisk programgenerator
Brikketype: ATmega8A
Programtype: Søknad
AVR kjerneklokkefrekvens: 8,000000 MHz
Minnemodell: Liten
Ekstern RAM-størrelse: 0
Datastabelstørrelse: 256
*******************************************************/
#inkludere
#inkludere
// Deklarer dine globale variabler her

Void main(void)
{
// Deklarer dine lokale variabler her

// Input/Output-porter initialisering
// Port B initialisering
// Funksjon: Bit7 = In Bit6 = In Bit5 = In Bit4 = In Bit3 = In Bit2 = In Bit1 = In Bit0 = Out
DDRB=(0<// Status: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=0
PORTB=(0<

// Port C initialisering
// Funksjon: Bit6=I Bit5=I Bit4=I Bit3=I Bit2=I Bit1=I Bit0=I
DDRC=(0<// Status: Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTC=(0<

// Port D initialisering
// Funksjon: Bit7 = In Bit6 = In Bit5 = In Bit4 = In Bit3 = In Bit2 = In Bit1 = In Bit0 = In
DDRD=(0<// Status: Bit7=T Bit6=T Bit5=T Bit4=T Bit3=T Bit2=T Bit1=T Bit0=T
PORTD=(0<

// Timer/Teller 0 initialisering

// Klokkeverdi: Timer 0 Stoppet
TCCR0=(0<TCNT0 = 0x00;

// Timer/Teller 1 initialisering
// Klokkekilde: Systemklokke
// Klokkeverdi: Timer1 Stoppet
// Modus: Normal topp=0xFFFF
// OC1A-utgang: Frakoblet
// OC1B-utgang: Frakoblet
// Støyreduksjon: Av
// Input Capture on Falling Edge
// Timer1 Overløpsavbrudd: Av
// Input Capture Interrupt: Av
// Sammenlign A Match Interrupt: Av
// Sammenlign B Match Interrupt: Av
TCCR1A=(0<TCCR1B=(0<TCNT1H = 0x00;
TCNT1L=0x00;
ICR1H = 0x00;
ICR1L = 0x00;
OCR1AH=0x00;
OCR1AL = 0x00;
OCR1BH = 0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialisering
// Klokkekilde: Systemklokke
// Klokkeverdi: Timer2 Stoppet
// Modus: Normal topp=0xFF
// OC2-utgang: Frakoblet
ASSR=0<TCCR2=(0<TCNT2 = 0x00;
OCR2 = 0x00;

// Timer(e)/Teller(e) Avbrudd(e) initialisering
TIMSK = (0<

// Initialisering av eksterne avbrudd(er).
// INT0: Av
// INT1: Av
MCUCR=(0<

//USART initialisering
// USART deaktivert
UCSRB=(0<

// Analog Comparator initialisering
// Analog komparator: Av
// Den analoge komparatorens positive inngang er
// koblet til AIN0-pinnen
// Den analoge komparatorens negative inngang er
// koblet til AIN1-pinnen
ACSR=(1<SFIOR=(0<

// ADC-initialisering
//ADC deaktivert
ADCSRA=(0<

// SPI-initialisering
// SPI deaktivert
SPCR=(0<

// TWI initialisering
// TWI deaktivert
TWCR=(0<

Mens (1)
{


Det er ikke noe skummelt her, prosjektet har moduser for å jobbe med porter, tidtakere, avbrudd, USART, Analog Comparator, ADC, SPI og tilkoblede biblioteker. Kort sagt, alle parameterne som ble spesifisert i masteren, alt unntatt portene og brikken, er finjustert hos oss. Hovedprogramsløyfen vil bli skrevet i mens (1) (programtekst). Fordi Vi jobber med PB0 (14 nizhka), i programsyklusen skriver vi:
mens (1)
{
PORTB.0=1;
delay_ms(1000);
PORTB.0 = 0;
delay_ms(1000);
}
Her setter vi det høye nivået PB0, venter i 1 sekund og setter det lave nivået, så gjentas syklusen. Ikke glem å inkludere biblioteket i prosjektet #inkluder . Programmet vårt er klart! Du skjønner, alt er veldig enkelt. Velg nå "Prosjekt" - "Bygg alle". Hvis benådningen er gitt, vil Mesteren ringe:

Størrelsen på programmet vårt ble 198 byte, og tok opp 2,4 % av minnet.
Deretter velger vi ordningen:


Nå går vi til mappen med prosjektet vårt, går til Debug-mappen, deretter Exe, det er en fil med hex-utvidelsen. Etter min mening blink.hex.
Etter å ha tapt de resterende pengene. Vi kopierer denne filen til mappen med AvrDude. La oss starte kommandolinjen igjen og gå til mappen vår. Skriv inn raden avrdude -C avrdude.conf -c avrisp -P COM13 -b 19200 -p m8 -U flash:w:blink.hex
Slik ser det ut på bildet:


Hvis alt er skrevet inn riktig, vil det bli stemplet "Introduksjon"


Jeg flyr! Arbeidet til Wikonan, LED-en er din feil, skinn gjerne :)
Visnovok.
Til slutt vil jeg si om mangelen på Arduino-lignende programmerer, CvAvr støtter det rett og slett ikke. Med for eksempel AVRISP mkII i hendene kan du laste ned fastvaren til sikringer og laste ned programmer direkte fra CodeVisionAvr. Før du snakker, bruk det grafiske grensesnittet til AvrDude, en hjemmelaget programmerer som også har lært og jobbet bare fra kommandolinjen.
Med CodeVisionAvr bestemte jeg meg for å få mye tekst- og videotimer på Internett. Gjennom årene har jeg mestret arbeidet med maskinvare PWM, avbryting, timere, arbeid med knapper og tilkobling av grafisk skjerm. Spesielt trengte jeg å fullføre en del av prosjektet mitt: organisere en maskinvare 16-bit PWM på Atmega8, koble til 2 knapper for driften, og også vise driftsmodusene på en grafisk skjerm, noe jeg enkelt kan gjøre :)

tilleggsinformasjon





Poser tilpasset fra Arduino:
+ Å registrere seg for CvArv er ikke vanskelig, fordi... є mester i prosjektoppretting;
+ Tilgjengeligheten av biblioteker som er tilkoblet er tilstrekkelig;
+ Shvidka-samling;
+ Mulighet for å simulere et prosjekt i Proteus, så vel som selve utviklingen ved hjelp av kraften til en innebygd debugger;
+ Størrelsen på programmet er mye mindre. Vår standard Blink tar 198 byte, en lignende Arduino IDE-skisse tar 1084 byte + 2 KB plass;
+ Evne til å implementere moduser som ikke kan implementeres på Arduino. For eksempel, 16-bit PWM (ja, det er mulig på Arduino, men bare med "milits");
+ Mulighet for å sette opp for prosjektene dine mk type ATtiny, ATmega der, hvor Arduino vil være overnaturlig;
– Likevel bør en nybegynner begynne å mestre MK bedre med Arduino;
- Språkprogrammering oppdateres ved hjelp av Arduino-behandling;
– Det er fortsatt flere biblioteker for Arduino;
- CodeVisionAvr er et betalt program, og det finnes gratisversjoner med begrensninger;
Etter å ha programmert den "nakne" MK med CodeVisionAvr, tok jeg bort den store kunnskapen om roboten fra skattekisten min. Utvikling av tidtakere, registre, driftsmoduser, arkitektur, lesing av dataark vil øke kvalifikasjonene dine, utvide horisonten din og oppdage nye aspekter ved å jobbe med mikrokontrollere.
Som en bonus vil jeg legge til et par bilder, når jeg har funnet ut den grafiske LCD-skjermen, har jeg mistet litt.





P.s. Det er så mye du vil skrive, men det er ikke bare et blikk, men en majestetisk statue. Klar til å svare på spørsmål innenfor din kompetanse, privat og i kommentarer. Du kan se mange leksjoner fra AVR.

Mikrokontrollere er små, men samtidig veldig nyttige applikasjoner for de som ønsker å lage alle slags fantastiske robot- eller automatisert tale i sitt eget hjem. Som en del av denne artikkelen vil programmeringen av AVR for barn, ulike aspekter og nyanser av denne prosessen bli undersøkt.

Hemmelig informasjon

Mikrokontrollere kan skjerpes gjennom. Det er stank i kjøleskap, vaskemaskiner, telefoner, produksjonsmaskiner, smartbokser og mange andre tekniske enheter. Deres utbredte bruk skyldes muligheten for å erstatte sammenleggbare og store analoge kretser av enheter. Programmeringen av AVR MK lar deg sikre autonom kontroll av elektroniske enheter. Disse mikrokontrollerne kan betraktes som de enkleste datamaskinene som kan samhandle med ekstern teknologi. Dermed er den i stand til å slå på/av transistorer, motta data fra sensorer og vise dem på skjermer. Mikrokontrollere kan også utføre forskjellig behandling av inndatainformasjon, som ligner på en personlig datamaskin. Når du først har lært å programmere en AVR fra bunnen av og blitt en profesjonell, vil du ha praktisk talt uendelige muligheter for å bruke forskjellige enheter med ekstra inngangs-/utgangsporter og endre koden deres.

Små ting om AVR

Artikkelen vil se på familien av mikrokontrollere produsert av Atmel. Stanken kan plage den ekle produktiviteten, noe som gjør at de kan vikoriseres i mange amatørenheter. Det er utbredt bekymring for industrien. Du kan lære i denne teknikken:

  1. Pobutovy. Vaskemaskiner, kjøleskap, mikrobølgeovner og mer.
  2. Mobil. Roboti, hent en lenke også.
  3. Kalkulerende. Kontrollsystemer for eksterne enheter, hovedkort.
  4. Rozvazalny. Pynt barnas leker.
  5. Transportere. Sikkerhetssystemer og kjøretøymotorkontroll.
  6. Promislove obladnannya. Verstat systemer.

Dette dekker selvfølgelig ikke alle områder. Det er mye forvirring der, hvor det er åpenbart at det ikke er et sett med mikrokretser å kontrollere, men én mikrokontroller. For å unngå lavt energiforbruk brukes C og Assembler til å skrive programmer, noen få endringer er gjort i familien av mikrokontrollere. Slike endringer er nødvendige gjennom svake beregningsevner, som vanligvis beregnes i titalls kilobyte. AVR-programmering uten modifikasjon er umulig.

Hvordan fjerne din første mikrokontroller?

AVR-programmering viser:

  1. Manifestasjonen av det nødvendige midten av utviklingen.
  2. Kraften til selve mikrokontrollerne.

Vi skal se på et annet punkt senere i rapporten. Det er tre muligheter for å anskaffe den nødvendige enheten:

  1. Kjøp selve mikrokontrolleren direkte.
  2. Få enheter fra designerens lager (for eksempel Arduino).
  3. Skaff deg en mikrokontroller selv.

Det er ikke noe spesielt med det første punktet, så la oss gå videre til det andre og tredje.

Få en enhet fra designerens lager

Baken skal bygges ved hjelp av Arduino. Dette er en hendig plattform for rask og enkel utvikling av ulike elektroniske enheter. Arduino-kortet inkluderer et annet sett med komponenter for roboten (det er forskjellige konfigurasjoner). Det er enkelt å gå inn i AVR-kontrolleren før den. Denne tilnærmingen lar deg enkelt designe enheten, krever ingen spesiell kunnskap eller ferdigheter, er veldig fleksibel når det gjelder tilkobling av tilleggskort, og du kan også finne mye informasjon om strømforsyning på Internett. Men det var ikke uten ulemper. Ved å kjøpe Arduino sparer folk seg muligheten til å dykke dypere inn i AVR-programmering og lære mer om mikrokontrolleren og spesifikasjonene til roboten. Det negative er også den åpenbart smale linjen med modeller, der du ofte må kjøpe betalinger for spesifikke oppgaver. Det særegne er at programmering på "" her sannsynligvis vil være veldig forskjellig fra standardskjemaet. Uavhengig av alle mangler, er Arduino egnet for nybegynnere. Ale slovozhivat ne varto.

Selvfoldende

Det skal bemerkes at AVR-mikrokontrollere er tilstrekkelig snille mot nybegynnere. Du kan kjøpe dem selv fra tilgjengelige, enkle og billige komponenter. Hvis vi snakker om fordelene, lar denne tilnærmingen deg bli mer kjent med enheten, uavhengig velge de nødvendige komponentene, forbedre det endelige resultatet fra mulighetene som henger, bruken av standardprogrammering og lave kostnader . På ulemper kan man merke seg kompleksiteten til selvfolding, hvis det fungerer først, og det er ingen nødvendig kunnskap og nybegynnere.

Hvordan pratsyuvati?

Så det er akseptabelt at strømforsyningen til mikrokontrolleren var begrenset. Fra nå av vil du være interessert i å gjøre tillegg eller kjøpe på egen hånd. Hva mer trengs for å mestre AVR-programvaren? For dette formålet trenger du midten av utviklingen (som basis og en grunnleggende notisblokk, men jeg anbefaler å registrere deg for Notepad++). Hvis du ønsker å bruke andre programmer for programmering av AVR, kan du bruke alle nødvendige alternativer. Også en nødvendig programmerer. Du kan hente den i din nærmeste butikk, søke på nettet eller hente den selv. Ikke skru det opp og gebyret belastes. Vaughn er ikke ob'yazkova, men її vikoristannya lar deg skåne nervene dine den timen. Den bader/skaper også av seg selv. І ostanє – tse dzherelo taverna. For AVR er det nødvendig å sikre en forsyningsspenning på 5V.

Hvordan kan jeg få det riktig?

Det er umulig å lage mesterverk fra bunnen av. Det som trengs her er kunnskap, bevis og praksis. Ale hvor skal du ta dem? En håndfull adelsmenn sover. Du kan selvstendig innhente nødvendig informasjon fra lysbarrieren. Du kan melde deg på programmeringskurs (distanse eller ansikt til ansikt) for å lære grunnleggende robotferdigheter. Hudpleie har sine fordeler. Dermed vil fjernprogrammeringskurs være billige og muligens gratis. Hvis dette ikke fungerer, vil etterforskeren med personlige undersøkelser bedre kunne finne ut årsaken til problemet. Vi ønsker heller ikke å bli kjent med litteraturen som er fritt tilgjengelig. Selvfølgelig vil du ikke kunne jobbe med noen bøker, men du kan fjerne grunnleggende kunnskap om enheten, programmering i "CI", "Assembly" og andre arbeidsøyeblikk.

Porti introduksjon/vivodu

Dette er et ekstremt viktig tema. Uten å forstå hvordan man håndterer I/O-porter, er det umulig å programmere AVR internt. Selv interaksjonen mellom mikrokontrolleren og eksterne enheter skjer gjennom deres formidling. Ved første øyekast kan en nybegynner bli overrasket over at porten kan føre til at mekanismen blir forvirret. For å overvinne slik fiendtlighet, bør vi ikke se på ordningen til roboten i detalj, men heller avvise skjulte manifestasjoner om den. La oss se på programimplementeringen. Som et eksempel vil jeg legge til AtMega8-mikrokontrolleren - en av de mest populære av hele AVR-familien. Inn-/utgangsporten har tre registre som representerer driften. Fysisk realiseres stanken som ben. Skinnet til dem tilsvarer sangbiten i registeret som den kontrollerer. Hudvevet kan brukes både til å legge inn og skrive ut informasjon. For eksempel kan du legge til funksjonen for å tenne lysdioden eller trykke på en knapp på den. Før vi snakker, er det tre registre, som nevnt, disse er: PORTx, PINx og DDRx. Hver av dem er åtte-bit (la oss ikke glemme at vi ser AtMega8). Så tar en bit seg av den syngende ømheten.

Drift av registre

Det viktigste med tanke på orientering er solid DDRx. Den er også åtte-bit. Verdiene for dette kan registreres som 0 eller 1. Hvordan endres kontrollerens arbeid når nuller og enere endres? Hvis sangerbiten er satt til 0, vil den tilsvarende foten byttes til inngangsmodus. Og fra den vil det være mulig å lese data som kommer fra eksterne enheter. Hvis du setter 1, kan mikrokontrolleren deaktiveres (for eksempel be transistoren om å sende spenning og tenne LED-en). For andre er PORTx viktig. Vіn er engasjert i ceruvianske bad. La oss ta en titt på baken. La oss si at vi har en kringkastingsport. Når vi setter en logisk i PORTx, sendes signalet fra mikrokontrolleren til den tilsvarende enheten til roboten. Tenn for eksempel lysdioden. Når null er satt, slukkes spenningen. Det er ikke nødvendig å jobbe med det samme DDRx-registeret først. Og til slutt, la oss snakke om PINx. Dette registeret indikerer visningen av kontrollerens fottilstand, hvis injeksjonstilstanden er justert. Vær oppmerksom på at PINx kanskje ikke fungerer i lesemodus. Det er ingen måte å skrive ned noe på. Hvis du vil lese Nizhkas gjengemølle, er det ikke noe problem.

Arbeid med analoger

AVR er ikke en enkelt mikrokontroller. Dette markedet er delt mellom flere store vinprodusenter, så vel som mellom mange kinesiske enheter de har, og selvgående. Det er mye sånn stank. For eksempel påvirkes ikke PIC/AVR-programmering. Og hvis én ting er forstått, så vil det være lett å forstå alt annet. Før du begynner, anbefaler vi fortsatt å bruke AVR på grunn av dens kompetente struktur, brukervennlighet og tilgjengeligheten av et stort antall relaterte materialer, der utviklingsprosessen kan fremskyndes betydelig.

Sikkerhetsutstyr

Hvis AVR-mikrokontrollerne er programmert i "CI" eller "Assembly", må du fortsette med ekstrem forsiktighet. Til høyre, ved å stille inn ønsket kombinasjon av registre og endre de interne innstillingene, kan du trygt blokkere mikrokontrolleren. Sikringer er spesielt verdifulle. Siden det ikke er noen betydning for riktigheten av ens handlinger, er det bedre å seire om dem. Det er det programmerere er bekymret for. Kjøper du fabrikkutstyr kan du flashe mikrokontrollere uten problemer. Hvis du bretter den med egne hender, kan det oppstå en dårlig situasjon hvis programmereren blokkerer enheten. Dette kan skje enten gjennom en feil i programkoden eller gjennom problemer i selve programvaren. Før jeg snakker, om et annet (denne gangen positivt) øyeblikk som jeg tidligere hadde tenkt på i forbifarten, men som ikke hadde blitt fullstendig avslørt. Nesten alle moderne mikrokontrollere har funksjonen til intern kretsprogrammering. Hva betyr dette? Det er akseptabelt at enheten har loddeskjøter på brettet. Og for å endre fastvaren trenger du ikke installere den med en gang, ellers kan den skade selve mikrokontrolleren. Det er nok å koble til de riktige tilkoblingene og omprogrammere dem for deres hjelp.

Yaku modell vibrati?

AtMega8 ble gjennomgått innenfor rammen av statistikken. Det er best å stole på en mikrokontroller som er gjennomsnittlig i sine egenskaper, som passer for de fleste virus. Hvis du vil lage i større skala, kan du ta dine egne monstre på Atmega128-plattformen. Ale stinker er uforsikret av mer enn 100 % av selgerne. Fordi det ikke er nok styrke til å begynne med, er det bedre å starte med små og enkle enheter. Dessuten stinker de og er mye billigere. Vent litt, den til høyre vil plutselig blokkere mikrokontrolleren for hundre karbovanter, og ellers - for hundre tusen. Det er best å bli mer kunnskapsrik og kjent med ulike aspekter ved driften, slik at du ikke bruker mye penger. Du kan starte med AtMega8 fra begynnelsen, og deretter fokusere på dine behov.

Visnovok

Temaet AVR-programmering i andre land ble også diskutert. Selvfølgelig er det fortsatt mye å lære om. For eksempel så vi på merkingen av mikrokontrollere. Det er mye jeg kan si om dette. Så mikrokontrollere opererer hovedsakelig på en 5V spenning. Det samme gjelder, for eksempel kan bokstavene L sies om de som vil installere nok 2,7 V for drift.Som du kan se, kan kunnskap om merking spille en svært viktig rolle i planen for korrekt og holdbar drift av enheter. Driftstiden til mikrokontrollere er et lignende tema. Huden er dekket med forsikring for den nye perioden. Så noen kan jobbe i tusen år. Andre kan ha et garantilager på 10 000!

Mikrokontrollere (heretter referert til som MK) har økt kraftig i hverdagen vår; på Internett kan du se til og med mange kretsdiagrammer, som Wikonian på MK. Hva du ikke kan få på MK: forskjellige indikatorer, voltmetre, husholdningsapparater (kontrollenheter, koblingsenheter, termometre ...), metalldetektorer, forskjellige leker, roboter, etc. Du kan overreagere enda lenger. Jeg designer en krets på en mikrokontroller, etter å ha lært for 5-6 år siden fra et radiomagasin, og nesten umiddelbart etter å ha brent ut siden og tenkte med meg selv "Jeg kan ikke få alt tilbake." Selvfølgelig, på den tiden ble MK ansett for å være en veldig kompleks og uforståelig enhet, jeg visste ikke hvordan jeg skulle jobbe, hvordan jeg skulle flashe dem og hvordan jeg skulle jobbe med dem hvis fastvaren var feil. Vel, nær skjebnen, samlet jeg først min første krets på en MK, kretsen til et digitalt voltmeter på 7 segmentindikatorer og en ATmega8 mikrokontroller. Det hendte at jeg kjøpte mikrokontrolleren fra ingensteds, mens han stod ved radiodelen, kjøpte fyren foran meg MK, og jeg bestemte meg også for å kjøpe den og prøve å få den nå. I artiklene mine vil jeg fortelle deg om AVR mikrokontrollere, jeg skal komme i gang med dem, la oss se på programmene for fastvare, forberede en enkel og pålitelig programmerer, se på fastvareprosessen og de viktigste problemene som kan oppstå, og ikke bare for nybegynnere.

Grunnleggende parametere for ulike mikrokontrollere i AVR-familien:

Mikrokontroller

Flashminne

RAM-minne

EEPROM-minne

Porti introduksjon/vivodu

U taverna

Ytterligere parametere for AVR mega MK:

Driftstemperatur: -55 ... +125 * C
Lagringstemperatur: -65 ... +150 * C
Spenning på RESET-pinnen til GND: maks 13V
Maksimal spenning: 6,0V
Maksimal inngang/utgangslinjestrøm: 40mA
Maksimal strømning langs livlinjen VCC og GND: 200mA

Plassering av ATmega 8X-modellene

Plassering av moduler for ATmega48x, 88x, 168x modeller

Pinneplassering for ATmega8515x-modeller

Pinneplassering for ATmega8535x-modeller

Pinneplassering for ATmega16, 32x-modeller

Pinneplassering for ATtiny2313-modeller

For eksempel er statistikken vedlagt arkiver med datablad på mikrokontrollerdekket.

Installering av FUSE slår MK AVR

Husk, sikringsprogrammering er 0, ikke-programmering er 1. Installer sikringene forsiktig før du setter inn sikringene, hvis du programmerer sikringen nøye, kan du blokkere mikrokontrolleren. Hvis du ikke har funnet ut hvilken sikring som må programmeres, er det best å blinke MK uten sikringer første gang.

De mest populære mikrokontrollerne blant radioamatører er ATmega8, etterfulgt av ATmega48, 16, 32, ATtiny2313 og andre. Mikrokontrollere selges i TQFP- og DIP-pakker; for nybegynnere anbefaler jeg å kjøpe fra DIP. Hvis du kjøper TQFP, vil det være mer problematisk å flashe dem, du må kjøpe eller lodde brettet fordi bena deres vokser nesten likt. For eksempel er mikrokontrollere i DIP-pakker installert på spesielle paneler, det er både enkelt og praktisk; du trenger ikke å bruke MK for å kortslutte og gjenopprette den, men du må bruke den til en annen design.

Mange moderne MK-er har muligheten for in-circuit programmering av ISP, da. Siden mikrokontrolleren din er loddet til brettet, trenger vi ikke å kjøpe den mot en avgift for å endre fastvaren.

For programmering av vikoryst er det 6 komponenter:
NULLSTILLE- Logg inn MK
VCC- Pluss mat, 3-5V, lagret i MK
GND– Et farvel, minus mat.
MOSI- MK-inngang (informasjonssignal fra MK)
MISO- MK-utgang (informasjonssignal fra MK)
SCK- MK-inngang (MK-klokkesignal)

Noen ganger brukes også XTAL 1- og XTAL2-pinnene, på dette tidspunktet brukes kvarts, siden MK vil bli drevet av en ekstern generator, ATmega 64 og 128 MOSI- og MISO-pinner vil ikke bli blokkert for ISP-programmering, i stedet Ja, MOSI er koblet til pinne PE0, og MISO til pinne PE1 . Når du kobler mikrokontrolleren til programmereren, må tilkoblingene være korte, og kabelen som går fra programmereren til LPT-porten er ikke for lang.

Merket til mikrokontrolleren kan ha uforståelige bokstaver med tall, for eksempel Atmega 8L 16PU, 8 16AU, 8A PU og andre. Bokstaven L betyr at MK opererer med lav spenning, den nederste MK uten bokstaven L er 2,7V. Tallene etter bindestreken eller mellomrommet 16PU eller 8AU indikerer den interne frekvensen til generatoren, som er i MK. Hvis fusjonen er installert på roboten foran en ekstern kvarts, må kvartsen settes til en frekvens som ikke overstiger maksimum for dataarket, som er 20 MHz for ATmega48/88/168, og 16 MHz for andre atmegaer. .

Jeg har sagt mer enn en gang at MK-utvikling krever at man starter med assembler. Et helt kurs på nettstedet er dedikert til dette (selv om det ikke er det nyeste, ellers ordner jeg det til et passende utseende). Så det er enkelt, resultatet vil ikke være den første dagen, men da vil du begynne å forstå hva som er i kontrolleren din. Du vet hvordan de fungerer, og ikke ved å kopiere andres publikasjoner og prøve å forstå hvorfor de sluttet å selge. I tillegg er det mye lettere å generere en beadlock-kode som kan brukes på det mest uventede øyeblikket.

Det er synd, alle vil gjerne resultatet. Derfor bestemte jeg meg for å plassere peti på den andre siden - for å lage et skudd av Si, og så vise undertøyet mitt. En god programmerer-embedder tar alltid forsiktig rumpa hans ved kjeksen, og lar henne ikke gå uten tillatelse. Så det blir C-kode først, deretter de som har laget kompilatoren og hvordan alt fungerer riktig :)

På den annen side har C det sterkeste ved å være bærbar for å kode. Det er greit å skrive alt riktig. Følgende algoritmer fungerer og er nyttige for implementering i ulike deler av prosjektet. Deretter, for å overføre algoritmen til en annen MC, vil det være nok å omskrive grensesnittballen, der alle operasjonene er skrevet ned før lasting, og hele arbeidskoden slettes som den er. Og viktigst av alt, lesbarhet. Det er lettere å forstå denne helgen ved første øyekast (jeg bryr meg ikke, for eksempel, jeg bryr meg ikke om hva jeg skal gjøre - jeg vil ha det, jeg vil ha det :)), men igjen, jeg må skrive alt riktig. Jeg vil også gi respekt for disse øyeblikkene.

Siden det siste sporet som venstre del av alle bakene skal plasseres på vil være min serviceavgift.

Første program i C for AVR

Velg kompilatoren og installer mellomvaren
For AVR er det ingen forskjell mellom forskjellige kompilatorer:
Vi er foran deg IAR AVR C- kan utvetydig gjenkjennes av den korteste kompilatoren for AVR, fordi Kontrolløren selv er nært knyttet til Atmel og IAR-agentene. Men du må betale for alt. Og denne kompilatoren er ikke bare dyr kommersiell programvare, men den har også et slikt gjennombrudd innen tilpasning at bare å ta kompilering krever mye penger. Jeg utviklet virkelig ikke et vennskap med ham, prosjektet råtnet i midten av ingensteds på koblingsstadiet (senere forståelse, som endte opp med å bli en skjev sprekk).

La oss gå til andre WinAVR GCC— en kraftig kompilator som optimerer. Helt åpen kildekode, tverrplattform, zagalom, gledelig liv. Den integreres også sømløst i AVR Studio, slik at du kan gjøre justeringer der, noe som er enda mer manuelt. Zagalom Jeg valgte yoga.

Også CodeVision AVR C- en veldig populær kompilator. Tilkoblingen har blitt populær på grunn av sin enkelhet. Et arbeidsprogram kan nå produseres for bare en brøkdel av kostnadene - masteren av startkoden, som allerede er i bruk, stempler standardiseringen av alle slags utstyr. For å være ærlig, ser jeg ut til å være mistenksom overfor noe nytt - det virker som jeg måtte demontere et program skrevet av denne kompilatoren, og det viste seg å være et rot i stedet for en kode. Mengden unødvendig kroppsarbeid og operasjoner som resulterte i et ganske lite kodevolum og en høyhastighetskode er ynkelig. Imidlertid kan det ha skjedd en endring i DNA ved å skrive den nye fastvaren. I tillegg vil du ha pennies. Ikke så rik som IAR, men fantastisk. Og i demomodus lar den deg ikke skrive mer enn 2kb kode.
Crack, selvfølgelig, men hvis du allerede stjeler, er det en million, sensi IAR :)

Mer Image Craft AVR Cі MicroC fra mikroelektronikk Verken den ene eller den andre hadde en sjanse til å utnytte, men aksen S.W.G. Jeg berømmer den allerede MicroPascal, sett, enda tydeligere midt i programmering og biblioteker. Jeg tror MicroC ikke blir verre, men det vil bli betalt.

Som jeg allerede sa, vibrerte jeg WinAVR Av tre grunner: det er gratis, det integreres i AVR Studio, og under er det skrevet bare en serie ferdig kode for alle typer liv.

Så last ned installasjonene dine av WinAVR fra AVR Studio. Deretter vil studioet installeres for første gang, deretter vil beistet laste ned WinAVR og gå til studioet i form av en plugin. Jeg anbefaler på det sterkeste å installere WinAVR med en kort bane, slik at du kan installere C:WinAVR på C:WinAVR-systemet og du vil ikke ha noen problemer med banene.

Oppretting av prosjektet
Vel, studioet er satt opp, det er skrudd ned, det er på tide å prøve å programmere det. La oss starte med noe enkelt, det enkleste. Start studioet, velg et nytt prosjekt der som AVR GCC-kompilatoren og skriv inn navnet på prosjektet.

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

Nå kan du ikke endre innstillingene for å vise ruter i studiobokmerkene dine. Hvem ser jeg etter adressen til:
Meny Verktøy - Alternativer - Generelt - Filfaner og velg "Kun filnavn" fra rullegardinlisten. Ellers vil det være umulig å fungere - det vil være en ny fil på fanen og det vil ikke være mer enn to faner på skjermen.

Justering av prosjektet
Generelt er det viktig å lage en make-fil der alle detaljene er beskrevet. Det er nok riktig. Bare husk, hva slags virus er på overflaten av IDE-integrasjoner? uVision ellers AVR Studio Denne tilnærmingen er dypt fremmed. Derfor jobber han for sitt eget studio.

Kryss av knappen med giret.


Dette handler om å justere prosjektet ditt, eller mer presist, justere den automatiske genereringen av en make-fil. På den første siden trenger du bare å skrive inn frekvensen på hvilken type enhet du bruker. Dette er på grunn av frekvensen til beats, så det er viktig at vår frekvens er 8000000 Hz.
Øk også respekten din med en rekke optimaliseringer. Det er på tide å stå der - Os ikke optimalisering for størrelse. For nå er du ferdig, så kan du prøve å leke med denne parameteren. -O0 er behovet for optimalisering i fremtiden.

I de kommende dagene vil det være en opprydding av adelsmenn. Først av alt, legg til katalogen for prosjektet ditt der - legg til tredjepartsbiblioteker der. Listen vil ha banen ".\"

Lag en generasjonsfil, du kan se den i standardmappen til prosjektet ditt, bare gå gjennom den og se hva som er der.


Så det var det for nå. Skriv OK og gå til avslutt.

Redegjørelse om problemet
Et blankt ark er så fristende å introdusere en eller annen utspekulert idé, ettersom et banalt øyeblikksøyeblikk ikke lenger setter seg inn. La oss ta den ved hornene og opprette forbindelser med datamaskinen - det er det jeg gir deg på forhånd.

Pratsyuvatime som dette:
Når en ener (kode 0x31) ankommer via COM-porten, slås dioden på, og når en null kommer (kode 0x30), slås den av. Dessuten ble alt fullført under avbrudd, og bakgrunnsoppgavene ville være et øyeblikk av en annen periode. Enkelt og fornuftig.

La oss velge ordningen
Vi må koble USB-USART-omformermodulen til USART-tilkoblingene til mikrokontrolleren. For å gjøre dette tar vi en jumper fra to ledninger og setter den på pinnene på kryss og tvers. Deretter kobles Rx-kontrolleren til Tx-omformeren, og Tx-omformeren kobles til Rx-kontrolleren.

Du kan se at resultataksen har følgende diagram:


Jeg ser ikke sammenhengen med avgjørelsen, maten, rabatten, det er mer standard

Skriv koden

Jeg vil umiddelbart sørge for at jeg ikke vil fordype meg i den spesifikke beskrivelsen av selve filmen. Til dette formålet er det en kolossal mengde materiale, som starter med klassikerne «Mova Programming C» fra K&R og slutter med ulike metoder.

Jeg fant en slik metode i oppbevaringen min, så jeg prøvde den selv. Alt der er kort, oversiktlig og til høyre. Jeg skriver det ut trinn for trinn og drar det inn på nettstedet mitt.

Riktignok er ikke alle kapitlene overført dit ennå, men jeg tror ikke det er nok.

Det er usannsynlig at jeg vil beskrive det mer kort, fra det første kurset, i stedet for en rapport som forklarer disse finessene, vil jeg bare gi direkte lenker på kanten av siden av denne håndboken.

Vi legger til biblioteker.
Vi forsynes med nødvendige biblioteker og overskrifter med oppgaver. Dette er et universelt språk, og jeg må forklare hva vi gjør med AVR, så skriv i utgangsraden:

1 #inkludere

#inkludere

Denne filen ligger i mappen WinAVR Den inneholder en beskrivelse av alle registre og porter til kontrolleren. Dessuten er alt det utspekulert, knyttet til en spesifikk kontroller, som overføres av kompilatoren via gjøre parameterfil MCU Og på denne substitusjonen kobles en overskriftsfil som beskriver adressene til alle porter og registre på selve kontrolleren til prosjektet ditt. WOW! Uten det er det også mulig, men du vil ikke kunne bruke de symbolske navnene på registrene på SREG- eller UDR-kommandoen og huske adressen til brukeren på kommandoen "0xC1", og dermed rote med hodet.

Selve laget #inkludere<имя файла> Lar deg legge til prosjektet ditt i stedet for en tekstfil, for eksempel en fil med en beskrivelse av en funksjon eller et sammendrag av annen kode. Og slik at direktivet kunne finne denne filen og indikere stiene til prosjektet vårt (WinAVR-katalogen er allerede registrert der som standard).

Hodefunksjon.
Programmet mitt handler om en funksjon. De kan settes inn og ropes ut etter hverandre i hvilken som helst rekkefølge og på forskjellige måter. Hudfunksjonen har tre skråparametre:

  • Betydningen av å snu, for eksempel, synd(x) roterer verdiene til sinus x. Som matematikk, kort sagt.
  • Parametere som overføres, dette nummeret.
  • Funksjonskropp.

Alle verdier som overføres og roteres kan være av hvilken som helst type, avhengig av dataene.

Ethvert C-program er skyldig i å misbruke funksjonen hoved- som inngangspunkt til hovedprogrammet, ellers er det ikke verdt det:). Fordi main er i andres pålogging med millioner av filer, kan du forstå at det er hoveddelen av programmet, og alt begynner med det. Akse i leveres:

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

int main(void) ( return 0; )

Det er det, det enkleste programmet er skrevet, det spiller ingen rolle, det er ingenting å bryte, vi har nettopp startet.

La oss ta en titt på hva vi har gjort.
int Dette er typen data som hovedfunksjonen roterer.

For det første ved mikrokontrolleren hoved- I prinsippet kan vi ikke snu noe, og ideen kan være det void main(void), men GCC kjører i utgangspunktet på en PC og der kan programmet endre operativsystemverdiene etter fullføring. Volum GCC på void main(void) bjeffer Advarsel.

Dette er ikke en nåde, pratsyuvatime, men jeg liker ikke advarsler.

tomrom Denne typen data som vi sender til funksjonen er i denne typen hoved- Vi kan heller ikke godta noe, så tomrom- Dummy. Pluggen sitter fast hvis det ikke er behov for å overføre eller rotere noe.

Aksen er den samme { } Krøllete armer er ikke en programblokk, i dette tilfellet funksjonens kropp hoved-, vil koden være plassert der.

komme tilbake- dette er verdien som roteres, da hovedfunksjonen kommer tilbake når den er fullført, så vi har en int, så roteres tallet. Jeg ønsker dette, men uten noen fornuft, fordi På mikrokontrolleren fra main får vi ingenting i det hele tatt. Jeg roterer nullen. Bo nefig. Og kompilatoren genererer ingen kode som er rimelig.
Hvis du vil vri, da hoved- Du kan logge ut til MK - for eksempel kan du falle inn i bootloader- og påloggingsdelen, men her vil du fortsatt trenge en lavnivåendring av fastvaren for å sende adresser til overgangen. Du vil selv lære og forstå hvordan du tjener det. Hva er i veien? Aksen er allerede annerledes ernæring, i 99,999% av tilfellene er det ikke nødvendig :)

Vi jobbet og gikk videre. La meg legge til at vi ikke trenger det spesielt, og uten behov for å innføre endringer er det ikke lett, men vi tar det for gitt. Hvis endringer legges til midt i hoveddelen av funksjonen, er de lokale og forekommer kun i denne funksjonen. Når du avslutter funksjonen, slettes endringene, og RAM-minnet tildeles nødvendige 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. Til høyre, i en dobbel data, settes den høyeste biten inn under tegnet, noe som betyr at tallet +127/-128 kan passe inn i en byte (char), hvis ikke tegnet settes inn vil det også passe inn fra kl. 0 til 255. Skiltet er ikke nødvendig. Hva så usignert.
Jeg- det er det samme. Ikke mer enn det.

Nå må du initialisere portene UART. Selvfølgelig kan du ta og inkludere biblioteket og klikke på UartInit (9600); Men så vet du ikke hva som egentlig skjedde.

Robimo liker 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 gjenværende rader med ekte kode her. Alt #definere Dette er makroforbehandleren. Mye det samme som i Assembly, men syntaksen er mye forskjellig.

Du kan gjøre rutineoperasjonene enklere ved å beregne de nødvendige koeffisientene. I den første raden sier vi, hva som skal erstattes XTAL du kan trygt erstatte 8000000, og L- Vkazivka type, sier lang - dette er klokkefrekvensen til prosessoren. Samme baudrate- Frekvens for dataoverføring via UART.

bauddivider Allerede mer komplekse, i stedet for den nye, vil beregningene bli presentert ved hjelp av formelen til de to første.
vel og L.O.і HI Hvilket resultat vil ta de laveste og høyeste bytene, fordi Du passer kanskje ikke inn i én byte. U HI Prøv å skrive ix (inndataparameter til makroen) hele tiden til høyre, som et resultat av at den viktigste byten går tapt. Og i L.O. Vi må fjerne bit for bit med tallet 00FF, og som et resultat vil vi miste den minst signifikante byten.

Altså alt som er knust #definere Du kan trygt utelate det, og finne de nødvendige tallene på kalkulatoren og umiddelbart legge dem inn i raden UBBRL = …. UBBRH = …..

Det er mulig, kanskje. Øl! Robiti Tshogo DET ER ABSOLUT IKKE MULIG!

Pratsyuvatim og så og så, men i deg i programmet vises såkalte magiske tall— betydningen av det tatt uklokt og uklokt, og hvis du i et par steiner setter i gang et slikt prosjekt, så vil du forstå hva betydningen vil være enda viktigere. Samtidig vil du endre hastigheten, eller hvis du endrer frekvensen på kvartsen, må du nullstille alt på nytt, og ved å endre et par tall på koden og alt selv. Forresten, hvis du ikke vil bli kjent som budgiver, så skriv koden på en slik måte at den er lett å lese, forståelig og enkel å endre.

Det hele er enkelt:
Alt dette "UBRRL og C" er UART-konfigurasjonsregisteret, overføring som vi vil bruke lyset til. Og vi ga dem umiddelbart de nødvendige verdiene, og justerte dem til den nødvendige likviditeten og den nødvendige modusen.

Registrer sinn 1< Dette betyr: ta 1 og sett ї på stedet RXEN ved byte. RXEN dette er den fjerde biten i registeret UCSRB, hva så 1< bekrefter det doble tallet 00010000, TXEN- dette er den tredje biten, og 1< gi 00001000. Alene «|» tse pobitov ABO, Otje 00010000 | 00001000 = 00011000. På samme måte settes andre nødvendige konfigurasjoner og legges til hovedrommet. Det resulterende nummeret registreres i UCSRB. Rapporten er oppført på datasiden på MK i USART-delen. Vi går heller ikke inn på tekniske detaljer.

Ferdig, tiden er inne for å undre seg over det som skjedde. Klikk på kompilering og start emulering (Ctrl+F7).

Nalagodzhennya
All fremdrift er fullført, studioet er endret, og en gul pil vises når du går inn i hovedfunksjonen. Dette er prosessoren for øyeblikket, og simuleringen er satt på pause.

Til høyre, faktisk helt fra starten, sto det på raden UBRRL = LO (bauddivider); Selv de som vi har i definisjon er ikke kode, men bare fremoverberegninger, aksen til simulatoren er triviell og sløv. Nå som du vet, er de første instruksjonene skrevet, og du vil klatre opp i treet. I/O-visning, i USART-delen og se på UBBRL-byten der, vil du legge merke til at det allerede er betydninger der! 0x33.

Bruk en krok til. Lurer på hvordan man endrer registeret i stedet. Så gå gjennom dem alle, med hensyn til de at alle utpekte biter er satt som jeg sa, og de settes samtidig for hver byte. Det er ingen retur til høyre - programmet er avsluttet.

Roztin
Slipp nå simuleringen til null. Trykk der Tilbakestill (Shift+F5). Åpne den demonterte oppføringen og du vil se hva som faktisk er i kontrolleren. Vis -> Demonter. Jeg gjør ikke YYAAAAAA! Montør! JAH!!! ET KRAV. Så, hvis noe er galt, uten å være dum med koden og uten å legge halt mat på forumene, og umiddelbart slikke på TV-en og undre deg over hvordan du holder kjeft. Det er ikke noe skummelt der.

Fra begynnelsen vil det være badillas 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 MP 00000000000000000000 0008: 940C0034 JMP 0x00000034 Hopp +0000000A: 940C0034 JMP 0x00000034 Hopp +0000000C: 940C0 0000000E: 9400000E: 9440C000001 : 940C0034 JMP 0x00000034 Hopp +00000012: 940C0034 JMP 0x00000000000 MP 0x000000034 Hopp +00000016: 940C00034 JMP 0000034 JMP 00000034 J000000034 JMP 000000000 00 34 JMP 0x00000034 Hopp +0000001A: 94000 1C : 940C0034 JMP 0x00000034 Hopp +0000001E: 940C0034 JMP 0x00000000:00000009: 000000009 JMP 0x00000 034 Hopp +00 0034 Hopp +00000024: 940C0034 JMP 0x00000034 Hopp +00000026: 940C0034 JMP 0x00000030 9 JMP 020000 9 JMP 020000

00000000: 940C002A JMP 0x0000002A Hopp +00000002: 940C0034 JMP 0x00000034 Hopp +00000004: 940C0034 JMP 0x000000 MP 0x00000 MP + 0x00000 MP 008: 940C0034 JMP 0x00000034 Hopp +0000000A: 940C0034 JMP 0x00000034 Hopp +0000000C: 94000 0E: 940C0034 JMP 000000 JMP 000000 940C003 4 JMP 0x00000034 Hopp +00000012: 940C0034 JMP 0x00000034 Hopp +00 0034 Hopp +00000016: 940C0034 JMP 0x00009 0x0000003 4 Hopp +0000001A: 940C0034 JMP00 940C0034 JMP 0x00000034 Hopp +0000001E: 940C0034 JMP 0x00000004 Hopp +200000: 940C0034 JMP 0x00000034 Hopp +00000000 34 Hopp +00000024: 940C0034 JMP 0x00000034 Hopp +00000026: 940C0034 JMP +00000 0004 4 JMP 0x0

Denne tabellen med vektorer skal avbrytes. Vi kommer tilbake til det før vi bare undrer oss og husker hva det er. Den første kolonnen er adressene til den midterste flushen, hvor kommandoen ligger, den andre kommandokoden, den tredje kommando-mnemonikken, selve monteringsinstruksjonen, den tredje operanden til kommandoen. Det er en automatisk kommentar.
Så hvis du er overrasket, gå videre her. Og JMP-kommandokoden er fire byte lang, som tilsvarer adressen til overgangen, skrevet bakover - den laveste byten bak den yngste adressen og kommandokoden for overgangen 940C

0000002B: BE1F OUT 0x3F,R1 Gå til I/O-posisjon

Å skrive en null på adressen 0x3F, hvis du ser i I/O-visningskolonnen, er det viktigere å adressere 0x3F enn adressen til SREG-registeret - kontrollerens ensignregister. Tobto. Vi tilbakestiller SREG for å kjøre programmet på nullsinnet.

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 er grunnen til at stabelen vises. Det er ikke mulig å gå direkte inn i I/O-registeret, kun gjennom mellomregisteret. Så først er LDI middels, og overfører deretter OUT til I/O. Jeg vil også snakke om stabelen mer detaljert. Bare vit at dette er et dynamisk minneområde som henger på enden av RAM-en og lagrer adresser og andre endringer. Aksen ble umiddelbart påpekt for oss at stjernene ville begynne å stable seg opp.

00000032: 940C0041 JMP 0x00000041 Hopp

Stribok er helt på slutten av programmet, og der har vi et gjerde for å avbryte og fokusere tett på oss 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 en rekke ikke-forberedte innstillinger, for eksempel å avslutte hovedfunksjonen. Med en slik sløyfe kan kontrolleren vises enten som en maskinvareenhet, eller helt sikkert som en vakthund. Vel, som jeg sa ovenfor, send dette stedet til en hex-editor og dra dit som er best for sjelen vår. Ta også hensyn til de at det er to typer overganger JMP og RJMP, den første er en direkte overgang til adressen. Den tar opp så mange byte som mulig, og du kan utføre et direkte hopp over hele minneområdet. En annen type overgang er RJMP - ekstern. Denne kommandoen tar opp to byte, men overgangen vil fungere i strømposisjonen (adressen) 1024 klokker fremover eller bakover. I disse parameterne er forskyvningen fra strømningspunktet indikert. Vikory brukes oftest, fordi tar opp dobbelt så lite blitsplass, og ytterligere overganger er sjelden nødvendig.

1 +00000034: 940C0000 JMP 0x00000000 Hopp

00000034: 940C0000 JMP 0x00000000 Hopp

Og dette er en stripe på koden. Å introdusere familien sin på nytt. Du kan sjekke at alle vektorer sendes her. På grunn av dette, hvis du umiddelbart tillater overhalingen (stinken av et standardgjerde) og overhalingen har passert i deg, og det ikke er noen kompilator, så vil programmet bli kastet på kolben hvis programmet forkastes.

Hovedfunksjon. Alt kan beskrives på lignende måte, men ikke beskrives. Forundre deg over at det allerede beregnede tallet er lagt inn i registeret. Kompilatorens forprosessor har ansvaret! Også de samme "magiske" tallene!

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

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

Og aksen her er en jamb:

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

Maten kommer, legger kompilatoren til denne typen mat? Men ingenting annet, som Return 0, vi utpekte funksjonen som int main(void)-aksen og mistet en hel masse bytes for ingenting :) Og hvis du oppretter void main(void) så vil du bare miste RET, ellers en advarsel vil vises Når det er sagt, roterer ikke vår hovedfunksjon noe. Zagalom, robi yak vil ha :)

Viktig? Glem det. Klikk på ikonet i demonteringsmodus og prosessoren vil konstruere følgende instruksjoner, som vil påvirke registrene. Hvordan gå gjennom kommandoer og løkkesykluser.

Fortsetter om et par dager.

Offtop:
Alexei78 Etter å ha laget en plugin for Firefox, som vil gjøre navigeringen på nettstedet mitt og forumet mitt enklere.
Diskutert og lastet ned,

Del med venner eller spar selv:

Vantaged...