Programmering av avr mikrokontrollere i C. Programmering av AVR-mikrokontrollere i C. Så hva er en mikrokontroller

Jeg bestemte meg for å skrive en kort introduksjonsartikkel for de som begynte å programmere mikrokontrollere for første gang og aldri var kjent med C-språket før. Vi vil ikke gå inn på detaljer, vi vil snakke om alt litt for å få en generell ide om å jobbe med CodeVisionAVR.

Mer detaljert informasjon kan sees på engelsk i CodeVision-brukermanualen, og jeg anbefaler også nettstedet http://somecode.ru med videoleksjoner om C for mikrokontrollere og boken "How to Program in C" av Deitel, dette er den eneste gode boken som jeg selv startet med.

La oss starte med det faktum at uansett hvilke handlinger vi gjør, til syvende og sist kommer alt ned til fastvaren til mikrokontrolleren. Selve fastvareprosessen skjer som følger: ved bruk av et bestemt program velges en fastvarefil, parametere velges, en knapp trykkes og fastvaren blinker direkte, som i hovedsak er en kopi. Akkurat som du kopierer musikk eller dokumenter fra en datamaskin til en flash-stasjon, er fysikken i prosessen den samme.

Selve fastvaren har en .hex-utvidelse og er et sett med instruksjoner, i form av enere og nuller, som er forståelig for mikrokontrolleren. Hvor kan jeg få fastvaren fra? Du kan laste den ned fra elektronikknettsteder, eller skrive den selv. Du kan skrive det i spesielle programmer som kalles et utviklingsmiljø. De mest kjente for meg er AVR Studio, IAR, CodeVision, WinAVR... Det er umulig å si hvilket av disse miljøene som er bedre eller dårligere, for hver sin egen. Vi kan si at disse programmene hovedsakelig skiller seg i bekvemmelighet, programmeringsspråk og pris. Innenfor dette nettstedet er det kun CodeVision som vurderes.

Vi har sortert ut miljøet, la oss nå se på prosessen med å skrive fastvare. I CodeVision må du først lage et prosjekt. Den kan opprettes ved hjelp av kodeveiviseren eller tom. I alle fall må du velge typen mikrokontroller som brukes og angi frekvensen. Når du bruker veiviseren, vil du bli bedt om å velge startinnstillinger og generere kildekode med innstillingene. Deretter vises et vindu der du kan redigere denne koden. Selv om du kan skrive kildekoden din i Notisblokk og deretter legge den til prosjektet i innstillingene.

En kildekodefil er et sett med kommandoer i et programmeringsspråk, CodeVisions oppgave er å oversette disse kommandoene til binær kode, din oppgave er å skrive denne kildekoden. CodeVision forstår C-språket, kildekodefiler har filtypen ".c". Men CodeVision har noen konstruksjoner som ikke brukes i C, og det er grunnen til at mange programmerere ikke liker det, og språket som brukes kalles C-lignende. Dette hindrer deg imidlertid ikke i å skrive seriøse prosjekter. Mange eksempler, en kodegenerator og et stort sett med biblioteker gir CodeVision en stor fordel. Det eneste negative er at det er betalt, selv om det er det gratis versjoner med kodebegrensning.

Kildekoden må inneholde en header med typen mikrokontroller som brukes og hovedfunksjonen. For eksempel brukes ATtiny13

#inkludere void main(void) ( );

#inkludere void main(void) ( );

Før hovedfunksjonen kan du koble til de nødvendige bibliotekene, deklarere globale variabler, konstanter og innstillinger. Et bibliotek er en separat fil, vanligvis med filtypen ".h", som allerede inneholder forhåndsskrevet kode. I noen prosjekter kan vi trenge denne koden, men i andre trenger vi den ikke. For eksempel, i ett prosjekt bruker vi LCD-skjermer, men i et annet gjør vi det ikke. Du kan koble til biblioteket for å arbeide med LCD-skjermen "alcd.h" slik:

#inkludere #inkludere void main(void) ( );

#inkludere #inkludere void main(void) ( );

Variabler er områder av minnet der visse verdier kan plasseres. Hvis du for eksempel legger til to tall, må du lagre resultatet et sted for å bruke det i fremtiden. Først må du deklarere variabelen, dvs. tildel minne for det, for eksempel:
int i=0;
de. vi erklærte variabelen i og plasserte verdien 0 i den, int er typen til variabelen, eller mer enkelt betyr det størrelsen på det tildelte minnet. Hver variabeltype kan bare lagre et bestemt verdiområde. For eksempel kan int skrives som tall fra -32768 til 32767. Hvis du trenger å bruke tall med en brøkdel, må variabelen deklareres som en flytende, for tegn, bruk tegntypen.

bit, _Bit 0 eller 1 char fra -128 til 127 usignert char fra 0 til 255 int fra -32768 til 32767 unsigned int fra 0 til 65535 long int fra -2147483648 til 2147483647 usignert fra 7 ± 40 9 til 9 175e - 38 til ±3.402e38

Inne i hovedfunksjonen kjører hovedprogrammet allerede. Etter å ha utført funksjonen vil programmet stoppe, så de lager en uendelig mens-løkke, som gjentar det samme programmet konstant.

void main(void) ( mens (1) ( ) ; );

void main(void) ( mens (1) ( ); );

Du kan skrive en kommentar i hvilken som helst del av kildekoden; det vil ikke påvirke driften av programmet på noen måte, men vil bidra til å lage notater om den skrevne koden. Du kan kommentere en linje med to skråstreker // hvoretter kompilatoren vil ignorere hele linjen eller flere linjer /**/, for eksempel:

/*Grunnleggende matematiske operasjoner:*/ int i= 0 ; //erklær variabelen i og tilordne den verdien 0//Tillegg: i = 2 + 2 ; //Subtraksjon: i = 2 - 2 ; //etter å ha utført dette uttrykket, vil variabelen i være lik 0//Multiplikasjon: i = 2 * 2 ; //etter å ha utført dette uttrykket, vil variabelen i være lik 4//divisjon: i = 2 / 2 ; //etter å ha utført dette uttrykket, vil variabelen i være lik 1

/*Grunnleggende matematiske operasjoner:*/ int i=0; //erklær variabel i og tilordne den verdien 0 //Addisjon: i = 2+2; //etter å ha utført dette uttrykket, vil variabelen i være lik 4 //Subtraksjon: i = 2-2; //etter å ha utført dette uttrykket, vil variabelen i være lik 0 //Multiplikasjon: i = 2*2; //etter å ha utført dette uttrykket, vil variabelen i være lik 4 //Division: i = 2/2; //etter å ha utført dette uttrykket, vil variabelen i være lik 1

Ofte må et program gå over fra ett stykke kode til et annet, avhengig av forhold; for dette er det betingede if()-operasjoner, for eksempel:

if(i>3) //hvis i er større enn 3, tilordne i verdien 0 ( i=0; ) /*hvis i er mindre enn 3, gå deretter til koden etter hoveddelen av betingelsen, dvs. etter parentes ()*/

Også hvis kan brukes sammen med annet - ellers

hvis jeg<3) //если i меньше 3, то присвоить i значение 0 { i=0; } else { i=5; //иначе, т.е. если i больше 3, присвоить значение 5 }

Det er også en sammenligningsoperator "==", som ikke må forveksles med "="-tilordning. Den omvendte operasjonen er ikke lik "!=", la oss si

if(i==3)//hvis i er 3, tilordne i verdien 0 ( i=0; ) if(i!=5) //hvis i ikke er 5, tilordne i verdien 0 ( i=0; )

La oss gå videre til mer komplekse ting - funksjoner. La oss si at du har en bestemt kodebit som gjentas flere ganger. Dessuten er denne koden ganske stor i størrelse. Det er upraktisk å skrive det hver gang. For eksempel, i et program som på en eller annen måte endrer variabel i, når du trykker på knapp 0 og 3 på port D, utføres den samme koden, som, avhengig av verdien til variabel i, slår på bena til port B.

void main(void) ( if (PIND.0== 0 ) //sjekk om knappen på PD0 er trykket(hvis (i== 0 ) //hvis i==0 aktiver PB0( PORTB.0= 1 ; ) if (i== 5 ) // hvis i==5 aktiver PB1( PORTB.1= 1 ; ) ) … if (PIND.3== 0 ) // gjør det samme når du sjekker PD3-knappen( if (i== 0 ) ( PORTB.0= 1 ; ) if (i== 5 ) ( PORTB.1= 1 ; ) ) )

void main(void) ( if(PIND.0==0) //sjekk om knappen på PD0 er trykket ( if(i==0) //if i==0 slå på PB0 ( PORTB.0=1; ) if( i==5) // if i==5 slå på PB1 ( PORTB.1=1; ) ) ... if(PIND.3==0) // gjør det samme når du sjekker PD3-knappen ( if(i==0 ) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) ) )

Generelt er koden ikke veldig stor, men den kan være mange ganger større, så det ville være mye mer praktisk å lage din egen funksjon.
For eksempel:

void i_check() ( if (i== 0 ) ( PORTB.0= 1 ; ) if (i== 5 ) ( PORTB.1= 1 ; ) )

void i_check() ( if(i==0) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) )

void betyr at funksjonen ikke returnerer noe, mer om dette under i_check() - dette er navnet på funksjonen vår, du kan kalle den hva du vil, jeg kalte den akkurat det - sjekk i. Nå kan vi skrive om koden vår:

void i_check() ( if(i==0) ( PORTB.0=1; ) if(i==5) ( PORTB.1=1; ) ) void main(void) ( if(PIND.0==0 ) //sjekk om knappen på PD0 er trykket ( i_check(); ) ... if(PIND.3==0) ( i_check(); ) )

Når koden når linjen i_check(); så vil den hoppe inn i funksjonen og kjøre koden inne. Enig, koden er mer kompakt og tydeligere, dvs. funksjoner hjelper til med å erstatte den samme koden, bare én linje. Vær oppmerksom på at funksjonen er deklarert utenfor hovedkoden, dvs. før hovedfunksjonen. Du kan si hvorfor trenger jeg dette, men mens du studerer leksjonene vil du ofte komme over funksjoner, for eksempel tømme LCD-skjermen lcd_clear() - funksjonen godtar ingen parametere og returnerer ikke noe, men den fjerner skjerm. Noen ganger brukes denne funksjonen nesten annenhver linje, så kodebesparelsene er åpenbare.

Det ser mye mer interessant ut å bruke en funksjon når den tar verdier, for eksempel er det en variabel c og det er en funksjonssum som tar to verdier av typen int. Når hovedprogrammet kjører denne funksjonen, vil argumentene allerede stå i parentes, så "a" blir lik to, og "b" blir lik 1. Funksjonen vil bli utført og "c" blir lik 3 .

int c= 0; void sum(int a, int b) ( c= a+ b; ) void main(void ) ( sum(2 , 1 ) ; )

int c=0; void sum(int a, int b) ( c=a+b; ) void main(void) ( sum(2,1); )

En av de vanligste lignende funksjonene er å flytte markøren på LCD-skjermen lcd_gotoxy(0,0); som forresten også tar argumenter - x- og y-koordinater.

Et annet alternativ for å bruke en funksjon, når den returnerer en verdi, nå vil den ikke lenger være ugyldig, la oss forbedre forrige eksempel på en funksjon for å legge til to tall:

int c= 0; int sum(int a, int b) ( return a+ b; ) void main(void) ( с= sum(2, 1) ; )

int c=0; int sum(int a, int b) ( return a+b; ) void main(void) ( с=sum(2,1); )

Resultatet blir det samme som forrige gang c=3, men merk at vi tildeler variabelen "c" verdien av en funksjon som ikke lenger er ugyldig, men returnerer summen av to tall av typen int. På denne måten er vi ikke bundet til en spesifikk variabel "c", som gir fleksibilitet i bruk av funksjoner. Et enkelt eksempel på en slik funksjon er å lese ADC-data, funksjonen returnerer den målte verdien result=read_adc();. La oss avslutte med funksjonene.

La oss nå gå videre til matriser. En matrise er relaterte variabler. For eksempel har du en sinustabell med flere punkter, du vil ikke lage variabler int sinus1=0; int sinus2=1; etc. En array brukes til dette. Du kan for eksempel lage en rekke med tre elementer som dette:
int sinus=(0,1,5);
Det totale antallet array-elementer er angitt i hakeparenteser. Du kan tilordne verdien av det tredje elementet til variabelen "c" slik:
с=sinus;
Vær oppmerksom på at nummereringen av array-elementer starter fra null, dvs. "c" vil bli lik fem. Denne matrisen har ikke et sinuselement!!!
Du kan tilordne en verdi til et individuelt element slik:
sinus=10;

Du har kanskje allerede lagt merke til at CodeVision ikke har strengvariabler. De. du kan ikke lage en variabel streng hello="hei"; For å gjøre dette, må du lage en rekke individuelle karakterer.

lcd_putchar(hei); lcd_putchar(hei); lcd_putchar(hei);

etc.
Det viser seg ganske tungvint, det er her sykluser kommer til unnsetning.
For eksempel mens loop

while(PINB.0!=0) ( )

Inntil knappen trykkes, gjør ingenting - kjør en tom sløyfe.

Et annet alternativ er for loop

int i; for (i= 0 ; i< 6 ; i++ ) { lcd_putchar(hello[ i] ) ; }

int i; for(i=0;i<6;i++) { lcd_putchar(hello[i]); }

Betydningen er nøyaktig den samme som mens, bare startbetingelsen i=0 og betingelsen som utføres hver syklus i++ legges til. Koden inne i loopen er så forenklet som mulig.

Etter at du har skrevet programmet ditt, kompileres kildekoden, og hvis det ikke er noen feil, vil du motta den ettertraktede firmwaren i prosjektmappen. Nå kan du flashe mikrokontrolleren og nyte driften av enheten.

Du bør ikke umiddelbart prøve å bruke looper, arrays og funksjoner i fastvaren din. Din hovedoppgave er å få fastvaren til å fungere, så gjør det ettersom det er lettere for deg og ikke ta hensyn til størrelsen på koden. Tiden kommer når du ikke bare vil skrive arbeidskode, men skrive den vakkert og kompakt. Da vil det være mulig å fordype seg i C-språkets villmark. For de som vil mestre alt anbefaler jeg nok en gang boken “Hvordan programmere i C”, det er mange eksempler og oppgaver. Installer Visual Studio, lag en win32-konsollapplikasjon og øv deg der.

Leksjon 0.

Så i dag åpner vi en serie leksjoner om programmering av mikrokontrollere fra AVR-familien.

I dag vil følgende spørsmål bli diskutert:

  1. Hva er en mikrokontroller?
  2. Hvor brukes mikrokontrollere?

Introduksjon.

Mikrokontrollere er overalt. I telefoner, vaskemaskiner, «smarte hjem», verktøymaskiner på fabrikker og også i utallige andre tekniske enheter. Deres utbredte bruk gjør det mulig å erstatte komplekse analoge kretser med mer komprimerte digitale.

Så hva er en mikrokontroller?

Mikrokontroller (Mikrokontrollenhet, MCU) - en mikrokrets designet for å kontrollere elektroniske enheter. Du kan forestille deg den som en enkel datamaskin som er i stand til å samhandle med eksterne enheter. For eksempel åpne og lukke transistorer, motta data fra temperatursensorer, vise data på LCD-skjermer, etc. I tillegg kan mikrokontrolleren utføre forskjellig behandling av inndata, akkurat som din personlige datamaskin.

Det vil si at mikrokontrollere gir oss nesten ubegrensede muligheter for å kontrollere alle enheter, takket være tilstedeværelsen av I/0-porter (inn-/utgangsporter), samt muligheten til å programmere dem.

Hvor brukes mikrokontrollere?

  1. Husholdningsapparater (vaskemaskiner, mikrobølgeovner, etc.).
  2. Mobilteknologi (Roboter, robotsystemer, kommunikasjonsutstyr, etc.).
  3. Industrielt utstyr (maskinkontrollsystemer).
  4. Datateknologi (hovedkort, kontrollsystemer for eksterne enheter).
  5. Underholdningsutstyr (barneleker, dekorasjoner).
  6. Transport (kontrollsystemer for bilmotorer, sikkerhetssystemer)

Dette er ikke en fullstendig liste over applikasjoner for mikrokontrollere. Ofte er det svært lønnsomt å erstatte et sett med kontrollbrikker med én mikrokontroller, på grunn av forenklet produksjon og redusert strømforbruk.

Komme i gang med AVR

AVR- en familie av mikrokontrollere fra Atmel. De har tilstrekkelig ytelse for de fleste amatørenheter. De er også mye brukt i industrien.

Det skjematiske diagrammet for LPT-portprogrammereren er vist i figuren. Som bussjåfør, bruk mikrokretsen 74AC 244 eller 74HC244 (K1564AP5), 74LS244 (K555AP5) eller 74ALS244 (K1533AP5).

LED VD1 indikerer opptaksmodusen til mikrokontrolleren,

LED VD2 - lesing,

LED VD3 - tilstedeværelse av strømforsyning til kretsen.

Kretsen tar den spenningen som kreves for strømforsyning fra ISP-kontakten, dvs. fra den programmerbare enheten. Denne kretsen er en redesignet STK200/300 programmeringskrets (tillagt lysdioder for enkel betjening), så den er kompatibel med alle PC-programmeringsprogrammer som fungerer med STK200/300-kretsen. For å jobbe med denne programmereren, bruk programmet CVAVR

Programmereren kan lages på et trykt kretskort og plasseres i LPT-kontakthuset, som vist i figurene:




For å jobbe med programmereren er det praktisk å bruke en LPT-portforlengelse, som er enkel å lage selv (for eksempel fra en Centronix-kabel til en skriver), det viktigste er ikke å spare lederne for bakken (18- 25 koblingsben) eller kjøp. Kabelen mellom programmereren og den programmerbare brikken bør ikke overstige 20-30 cm.

Bitvise operasjoner er basert på de logiske operasjonene vi dekket tidligere. De spiller en nøkkelrolle i programmering av AVR og andre typer mikrokontrollere. Nesten ingen programmer kan klare seg uten bruk av bitvise operasjoner. Før dette unngikk vi dem bevisst for å lette prosessen med å lære MK-programmering.

I alle tidligere artikler programmerte vi kun I/O-porter og brukte ikke ekstra innebygde komponenter, for eksempel tidtakere, analog-til-digital-omformere, avbrudd og andre interne enheter som MK mister all kraften uten.

Før du går videre til å mestre de innebygde enhetene til MK, må du lære hvordan du kontrollerer eller sjekker individuelle biter av registrene til AVR MK. Tidligere utførte vi en sjekk eller satte sifrene i hele registeret på en gang. La oss finne ut hva forskjellen er og gå videre.

Bitvise operasjoner

Oftest, når vi programmerte AVR-mikrokontrollere, brukte vi det, siden det er mer visuelt sammenlignet med og er godt forstått for nybegynnere MK-programmerere. For eksempel trenger vi å sette bare den tredje biten av port D. For å gjøre dette, som vi allerede vet, kan vi bruke følgende binære kode:

PORTD = 0b00001000;

Men med denne kommandoen setter vi det tredje sifferet til ett, og vi tilbakestiller alle de andre (0, 1, 2, 4, 5, 6 og 7.) til null. La oss nå forestille oss en situasjon der 6. og 7. bit brukes som ADC-innganger og på dette tidspunktet mottas et signal fra en enhet på de tilsvarende MK-pinnene, og vi bruker kommandoen ovenfor for å tilbakestille disse signalene. Som et resultat ser ikke mikrokontrolleren dem og tror at signalene ikke kom. Derfor, i stedet for en slik kommando, bør vi bruke en annen som vil sette bare den tredje biten til en, uten å påvirke de gjenværende bitene. For å gjøre dette brukes vanligvis følgende bitvise operasjon:

PORTD |= (1<<3);

Vi vil diskutere syntaksen i detalj nedenfor. Og nå et annet eksempel. La oss si at vi må sjekke tilstanden til det tredje sifferet i PIND-registeret, og dermed sjekke statusen til knappen. Hvis denne biten tilbakestilles til null, vet vi at knappen trykkes inn og deretter utføres kommandokoden, som tilsvarer tilstanden til knappen som trykkes. Tidligere ville vi ha brukt følgende notasjon:

if (PIND == 0b00000000)

(en hvilken som helst kode)

Men med dens hjelp sjekker vi ikke bare den tredje biten, men alle bitene i PIND-registeret på en gang. Derfor, selv om knappen trykkes inn og ønsket bit tilbakestilles, men på dette tidspunktet mottas et signal på en annen pinne til port D, vil den tilsvarende verdien bli satt til én, og betingelsen i parentes vil være falsk. Som et resultat vil ikke koden inne i de krøllete klammeparentesene utføres selv når knappen trykkes. Derfor, for å kontrollere tilstanden til en individuell 3. bit av PIND-registeret, bør en bitvis operasjon brukes:

if (~PIND & (1<<3))

(en hvilken som helst kode)

For å jobbe med individuelle biter av mikrokontrolleren, har C-programmeringsspråket verktøy som kan brukes til å endre eller kontrollere tilstanden til en eller flere individuelle biter på en gang.

Setter en enkelt bit

For å sette en enkelt bit, for eksempel port D, brukes en bitvis ELLER-operasjon. Dette er hva vi brukte i begynnelsen av artikkelen.

PORTD = 0b00011100; // Opprinnelig verdi

PORTD = PORTD | (1<<0); применяем побитовую ИЛИ

PORTD |= (1<<0); // сокращенная форма записи

PORTD == 0b00011101; // resultat

Denne kommandoen setter nullbiten og lar resten være uendret.

La oss for eksempel installere en annen sjette bit av port D.

PORTD = 0b00011100; // innledende porttilstand

PORTD |= (1<<6); //

PORTD == 0b01011100; // resultat

Å skrive én til flere separate biter samtidig, for eksempel null, sjette og syvende porter B Følgende notasjon gjelder.

PORTB = 0b00011100; // Opprinnelig verdi

PORTB |= (1<<0) | (1<<6) | (1<<7); //

PORTB == 0b1011101; // resultat

Tilbakestille (nullstille) individuelle biter

For å tilbakestille en enkelt bit, brukes tre tidligere diskuterte kommandoer samtidig: .

La oss tilbakestille den tredje biten av PORTC-registeret og la resten være uendret.

PORTC = 0b00011100;

PORTC &= ~(1<<3);

PORTC == 0b00010100;

La oss utføre lignende handlinger for 2. og 4. siffer:

PORTC = 0b00111110;

PORTC &= ~((1<<2) | (1<<4));

PORTC == 0b00101010;

Bitbytte

I tillegg til innstilling og tilbakestilling, brukes også en nyttig kommando som bytter en enkelt bit til motsatt tilstand: en til null og omvendt. Denne logiske operasjonen er mye brukt for å lage forskjellige lyseffekter, for eksempel en nyttårskrans. La oss se på eksemplet med PORTA

PORTA = 0b00011111;

PORTA ^= (1<<2);

PORTA == 0b00011011;

La oss endre tilstanden til null, andre og sjette bit:

PORTA = 0b00011111;

PORTA ^= (1<<0) | (1<<2) | (1<<6);

PORTA == 0b01011010;

Kontrollerer tilstanden til en individuell bit. La meg minne om at kontroll (i motsetning til å skrive) en I/O-port utføres ved å lese data fra PIN-registeret.

Oftest utføres testing av en av to loop-setninger: if og while. Vi er allerede kjent med disse operatørene tidligere.

Kontrollerer biten for tilstedeværelsen av en logisk null (tilbakestilling) med hvis

if (0==(PIND & (1<<3)))

Hvis den tredje biten av port D slettes, kjøres Code1. Ellers kjøres Code2.

Lignende handlinger utføres med denne formen for opptak:

if (~PIND & (1<<3))

Kontrollerer biten for tilstedeværelsen av en logisk enhet (innstilling) med hvis

if (0 != (PIND & (1<<3)))

hvis (PIND & (1<<3))

De to ovennevnte løkkene fungerer på samme måte, men kan på grunn av fleksibiliteten til programmeringsspråket C ha en annen form for notasjon. Operatoren != betyr ikke lik. Hvis den tredje biten av PD I/O-porten er satt (en), blir Code1 utført; hvis ikke, blir Code2 utført.

Venter på at litt skal tilbakestilles samtidig som

mens (PIND & (1<<5))

Kode1 vil bli utført så lenge den 5. biten i PIND-registeret er satt. Når du tilbakestiller den, vil Code2 begynne å kjøre.

Venter på at litt skal settes samtidig som

Her lar C-syntaksen deg skrive kode på to av de vanligste måtene. I praksis brukes begge typer opptak.

Mikrokontrollere (heretter referert til som MK) har kommet godt inn i livene våre; på Internett kan du finne mange interessante kretser som kjøres på MK. Hva du ikke kan montere på en MK: forskjellige indikatorer, voltmetre, husholdningsapparater (beskyttelsesenheter, koblingsenheter, termometre ...), metalldetektorer, forskjellige leker, roboter, etc. Listen kan ta veldig lang tid. Jeg så den første kretsen på en mikrokontroller for 5-6 år siden i et radiomagasin, og snudde nesten umiddelbart siden og tenkte med meg selv: "Jeg vil fortsatt ikke være i stand til å montere den." Faktisk, på den tiden var MK-er en veldig kompleks og misforstått enhet for meg; jeg hadde ingen anelse om hvordan de fungerte, hvordan de skulle flashe dem og hva jeg skulle gjøre med dem i tilfelle feil fastvare. Men for omtrent et år siden satte jeg først sammen min første krets på en MK; det var en digital voltmeterkrets basert på 7 segmentindikatorer og en ATmega8 mikrokontroller. Det skjedde slik at jeg kjøpte en mikrokontroller ved et uhell, da jeg sto i radiokomponentavdelingen, kjøpte fyren foran meg en MK, og jeg bestemte meg også for å kjøpe den og prøve å sette sammen noe. I artiklene mine vil jeg fortelle deg om AVR mikrokontrollere, jeg skal lære deg hvordan du jobber med dem, vi skal se på programmer for fastvare, vi skal lage en enkel og pålitelig programmerer, vi skal se på fastvareprosessen og, viktigst av alt, problemene som kan oppstå ikke kun for nybegynnere.

Grunnleggende parametere for noen mikrokontrollere i AVR-familien:

Mikrokontroller

Flashminne

RAM-minne

EEPROM-minne

I/O-porter

U kraft

Ytterligere parametere for AVR mega MK:

Driftstemperatur: -55…+125*С
Lagringstemperatur: -65…+150*С
Spenning ved RESET-pinnen i forhold til GND: maks 13V
Maksimal forsyningsspenning: 6,0V
Maksimal I/O-linjestrøm: 40mA
Maksimal strømforsyningsstrøm VCC og GND: 200mA

ATmega 8X modell pinouts

Pinouts for ATmega48x, 88x, 168x modeller

Pinnelayout for ATmega8515x-modeller

Pinnelayout for ATmega8535x-modeller

Pinnelayout for ATmega16, 32x-modeller

Pinnelayout for ATtiny2313-modeller

Et arkiv med datablad for enkelte mikrokontrollere er vedlagt på slutten av artikkelen.

MK AVR installasjon FUSE bits

Husk at en programmert sikring er 0, en uprogrammert er 1. Du bør være forsiktig når du setter inn sikringer, en feilprogrammert sikring kan blokkere mikrokontrolleren. Hvis du ikke er sikker på hvilken sikring du må programmere, er det bedre å blinke MK uten sikringer for 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 i DIP. Hvis du kjøper TQFP, vil det være mer problematisk å flashe dem; du må kjøpe eller lodde brettet fordi bena deres er plassert veldig nær hverandre. Jeg anbefaler deg å installere mikrokontrollere i DIP-pakker på spesielle stikkontakter, det er praktisk og praktisk, du trenger ikke å løsne MK hvis du vil gjenopprette den, eller bruke den til et annet design.

Nesten alle moderne MK-er har muligheten til å in-circuit ISP-programmering, dvs. Hvis mikrokontrolleren din er loddet til brettet, trenger vi ikke å avlodde den fra brettet for å endre fastvaren.

6 pinner brukes til programmering:
NULLSTILLE- Logg inn MK
VCC- Pluss strømforsyning, 3-5V, avhenger av MK
GND- Felles ledning, minus strøm.
MOSI- MK-inngang (informasjonssignal i MK)
MISO- MK-utgang (informasjonssignal fra MK)
SCK- MK-inngang (klokkesignal i MK)

Noen ganger bruker de også pinnene XTAL 1 og XTAL2; kvarts er festet til disse pinnene hvis MK drives av en ekstern oscillator; i ATmega 64 og 128 brukes ikke MOSI- og MISO-pinnene til ISP-programmering; i stedet er MOSI-pinnene koblet til pinne PE0, og MISO til pinne PE1. Når du kobler mikrokontrolleren til programmereren, bør tilkoblingsledningene være så korte som mulig, og kabelen som går fra programmereren til LPT-porten bør heller ikke være for lang.

Merkingen på mikrokontrolleren kan inneholde merkelige bokstaver med tall, for eksempel Atmega 8L 16PU, 8 16AU, 8A PU osv. Bokstaven L betyr at MK opererer med lavere spenning enn MK uten bokstaven L, vanligvis 2,7V. Tallene etter bindestreken eller mellomrommet 16PU eller 8AU indikerer den interne frekvensen til generatoren som er i MK. Hvis sikringene er satt til å fungere fra en ekstern kvarts, bør kvartsen settes til en frekvens som ikke overstiger maksimum i henhold til databladet, dette er 20 MHz for ATmega48/88/168, og 16 MHz for andre atmegaer.


Topp