Grundlæggende om mikrocontroller undersøgt

Grundlæggende om mikrocontroller undersøgt

Én ting er fantastisk ved mikrocontroller-IC'er, disse er tilgængelige næsten i alle dele af kloden og elektroniske detailhandlere.



Introduktion

Grundlæggende anvendes mikrocontroller-enheder populært i applikationer, der involverer vurderinger af det omgivende miljø og i lignende elektronik.

Du kan finde disse enheder bruges til at vise en bestemt parameter i motorstyringsapplikationer, LED-belysning, sensorer af forskellige typer, såsom vippesensor, accelerometer, hastighedsmåler, dataloggere, temperaturregulatorer, tastaturer osv.





Den primære forståelse vedrørende mikrokontrollere kunne opnås ved at henvise til AVR Amega32 mikrokontroller, som er så avanceret, at det undertiden kaldes en computer i en chip.

Denne enhed er tildelt til at udføre en række kommandoer for at danne et program.



Sproget i det program, som du ville se her, er C ++. Du får lære dette sprog i større dybde i kurset her.

Når det kommer til MCU'er, får du mulighed for at have mulighed for at kontrollere og konfigurere alle dens pinouts.

Hvis du bliver lidt træt af dette, skal du bare slappe af, for det er slet ikke noget komplekst, du bliver lettet gennem alle aspekterne støt, men bestemt, når vi går videre.

I en MCU-chip kan alle stifter undtagen Vdd og Vss, som er chipstifterne, tildeles med eksklusive betegnelser.

Pinout detaljer

Hvis du kigger på chippen fra toppen, vil du finde et lille trekantet hak, der angiver startpunktet fra hvor pinouts begynder, det tæller, det er chipens # 1 pin lige under dette hak.

Fra denne pin vil du finde 20 ben op til bunden på den side (venstre) og yderligere 20 ben på den anden side (højre), fortsætte fra bund til top på højre side.

De første 8 ben, der starter fra hakket, er PBO-7, som danner IC-indeksstifterne, da alt program her begynder med indekset nul.

Ovenstående række pinouts betegnes PORT B, mens der er andre identiske sæt porte tildelt A til D.

Disse porte kunne tildeles til at acceptere og genkende en tilført data kaldet INPUT og også til at transmittere data i en bestemt specificeret form kaldet OUTPUT.

To af benene, der kommer i den generelle kategori, er (+) / (-) benene, der også kaldes Vdd og GND.

En pin fra PORT D (PDO-6) kan ses placeret på venstre side af chippen i det nederste område.

PD7, som er pin nr. 7 i PORT D, kan spores stående alene og begynder den højre serie af pinouts.

Når vi fortsætter fra højre side af chippen, hvor PORT D slutter, begynder PORT C sin optælling opad i rækkefølgen.

Disse bidrager til de mange interessante ben på MCU lige fra analoge til digitale.

Disse ben er udstyret til at blive sensorindgange til at detektere de mange parametre gennem eksternt konfigurerede analoge kredsløbstrin.

Ovenstående stifter udgør PORT A.

Den analoge til digitale konvertering på tværs af ovenstående stifter kunne forstås ved hjælp af et eksempel, hvor et analogt temperaturniveau, der detekteres ved anvendelse af en almindelig sensor, såsom en termister, påføres en af ​​PORT A-stifter, som let accepteres og konverteres af MCU til at producere en digital aflæsning fra nul til 255 grader F (et 8-bit tal, der kunne opgraderes til opnåelse af en 10-bit output).

En anden funktion, som derudover kunne ses i MCU'er, er det tilgængelige programmeringsrum eller hukommelsen, der bestemmer pladsen til de variabler og det program, der er specificeret til mikrocontrolleren.

Desuden har MCU'erne et indbygget ur tildelt til at tælle de relevante parametre.

Urfunktionerne gør det muligt for MCU'en at anvende sig til mange forskellige tælleprocesser, som kunne være hurtige inden for området af mikrosekunder afhængigt af specifikationen for den bestemte enhed, og som også kunne være langsommere i ethvert ønsket omfang.

Nu har du muligvis forstået mikrokontroller-konceptet til en vis grad og med hensyn til dets porte og stifter.

Sådan oprettes et SPI-stik fra programmøren til mikrocontrolleren

Nu er det tid til at gå lidt dybere ind i emnet og undersøge programmeringsverdenen.

Når det er sagt, inden vi hengiver os til en programindlæsningsprocedure i chippen, er vi nødt til at finde en korrekt måde at integrere SPI (Serial Peripheral Interface) -stikket med MCU'en på.

Men selv efter dette kan vi ikke bare skubbe SPI ind i MCU pinouts, kan vi? Vi kan heller ikke lade de udvidede ledninger fra SPI komme direkte i brødbrættet. Dette kan også medføre forkerte ledningsindstillinger, der er forbundet med de forkerte ben, der giver dårlige forbindelser.

Derfor gør vi procedurerne over en lille veroboard, hvor vi får de nødvendige forbindende metalstifter, også kaldet “header” loddet, for at gøre tingene helt upåklagelige. Disse header-ben kan nu bruges til at forbinde med SPI-stikket. Forbindelserne fra dette header kan afsluttes til en anden parallel header-ben, der kan bruges til breadboard-forbindelserne.

Således danner ovenstående samling nu en tæt og pålidelig mellemforbindelsesplatform for SPI til MCU.

Uptil nu ser alt godt ud perfekt, så lad os fortsætte med at tjene med hensyn til den programmør, der kræves mellem din pc og MCU.

Der kan være et væld af virksomheder, der fremstiller og sælger disse programmeringsenheder, så at købe disse burde ikke være et problem for dig, såsom Adafruit Industries, USBtinyISP eller Sparkfun osv.

Et par af disse kunne se helt anderledes ud end de konventionelle typer, men har stort set alt identisk og følger standardprogrammeringsreglerne og kan bruges som grænseflade mellem din pc og AVR-mikrocontrolleren.

Men sørg for, at man tænker, hvis du bruger en anden MCU og ikke en AVR Atmega32, skal du muligvis tjekke for en tilsvarende kompatibel programmerer til den pågældende MCU-chip.

Det kan bemærkes, at en hel del af disse programmører anvender identiske drivere, noget der skal tages hånd om, og vi lærer mere om det i vores efterfølgende kapitler.

Det er virkelig grundlæggende at forbinde din pc med mikrocontrollerchippen, og du ville være glad for at vide, hvor enkel proceduren er nødvendig for dette. Så lad os trykke på knappen med det sammeJ

Det er ikke svært at lave det ovennævnte forklarede SPI-interfacekort, det handler om at få dit loddejern til at arbejde igennem alle forbindelser på tværs af de viste to headerrækker med ben på et lille generelt bord.

Ovenstående figur viser de forbindelsesoplysninger, som du bliver nødt til at følge, mens du forbinder ledningerne mellem overskrifterne.

For at gøre tingene endnu enklere, lad os gennemgå følgende forbindelsesoplysninger for det samme ved at henvise til billedet ovenfor:

SPI pin startende fra øverste venstre side går til 'Master IN, Slave OUT' (MISO)

SPI-pin fra midten til venstre forbinder med urstiftet (SCK)

SPI-pin nederst til venstre slutter sig til nulstillingen. (Vi lærer udførligt om denne pin i følgende tutorials)

SPI, der er relevant for nederste højre tilslutning med GND-stiften på MCU'en, refererer GND til stiften, der danner nulforsyningslinjen eller den negative (relative) skinne af forsyningen.

SPI, der afsluttes fra midterste højre header, forbinder med 'Master Out, Slave IN' (MOSI) -stiften på MCU'en.

SPI, der kommer ud af øverste højre header, er forbundet med (+) af MCU'en, hvilket helt klart er Vdd eller MCU's positive forsyningsstift.

Det er det.

Forbind de to stik som forklaret, og dit SPI-interfacekort er klar til de nødvendige handlinger.

For yderligere hjælp kan du konsultere figuren, der er vist ovenfor, dit sidste interface bord skal se sådan ud, efter at alle ledningsforbindelser er udført korrekt ved hjælp af ovenstående diskussion.

Jeg håber, du måske allerede har konstrueret SPI-grænsefladen som forklaret i den foregående vejledning, og nu er det tid til at sikre, at vores computer accepterer den programmør, som vi skal integrere mellem pc'en og MCU.

Oprettelse af en simpel programmeringskode til en MCU

Vi tager en USBTinyISP-enhed tilgængelig fra Sparkfun til at forbinde computeren med mikrocontrolleren.

Vi ved, at ethvert computeroperativsystem som Windows kræver drivere, uden hvilke det ville være nytteløst at indlæse noget i computeren, og derfor har vores programmør brug for drivere for at indlæse på din computer.

Lad os kigge ind i de procedurer, der kræves for at installere driverne i din computer OS, her tager vi eksemplet på Windows 7 OS med enten 32-bit eller 64-bit specifikationer.

Åbn sparkfun.com, og klik på “pocket AVR programmerer side”. Linket kan let visualiseres på siden.

Find derefter ”Windows-driver” under dokumenter, og klik blot på den.

Dette giver dig pocketprog-driver.zip-filen på din computer.

Gå til din computer, find downloadplaceringen, og pak bare den downloadede fil ud i en mappe.

Hvis din computer er et 64-bit OS, skal du følge et par flere trin som angivet under, med et 32-bit OS, kan du starte installationen direkte fra den udpakkede fil.

For en 64-bit følg disse, for 32-bit skal du bare ignorere:

Google “libusb sourceforge” og klik på denne links nyeste version.

Du vil støde på et par ekstra filer, men du ville være interesseret i at finde bib-filen, det vil sige: libusb-win32-bin - #. #. #. #. Zip

Gå nu og find denne downloadplacering på din computer, pak den ud og gem den i en af ​​mapperne.

Gå ind i bin-mappen i denne mappe og fortsæt til amd64-mappen.

Du vil se et par mapper her som: ghcalled libusb0.dll og libusb0.sys.

Du vil gerne omdøbe disse som: libusb0_x64.dll og libusb0_x64.sys.

Nu bliver du nødt til at kopiere de ovennævnte filer til pocketprog-driver-mappen, blot overskrive filerne på den eksisterende version.

For at installere ovenstående drivere vil følgende metode, der snarere er en ikke-konventionel i sin type, interessere dig:

Det er en 'tilføj ældre hardware' -tilstand.

Klik på 'Start-menu'

Fortsæt derefter ved at højreklikke på 'computer'

Klik på 'Administrer', og til sidst klik på 'Enhedsadministrator'

Vælg derefter 'Tilføj ældre hardware' inde i menuen.

Fortsæt med at trykke på 'næste', indtil guiden bliver indsat

Følg instruktionerne, klik på 'Installer den hardware, som du skal vælge fra en avanceret liste', dette vil bede ikonet til radioknappen ind i det bestemte valg. Det er faktisk en windows-kontrolknap, der nu ser ud som en lille cirkel med en rundblå arkivering indeni.

Klik nu blot på 'Næste'

Dette viser dig menuen 'Vis alle enheder', som du skal klikke på.

Herefter skal du klikke på ikonet 'Har disk'.

Ved hjælp af ikonet 'Gennemse', gå videre til placeringen af ​​pocketprog-driver-mappen. Hvis valget blev udført korrekt af dig, ville du visualisere pocketprog.inf-filen placeret i den pågældende mappe.

Dobbeltklik på denne fil, og du vil helt sikkert være vidne til, at driveren bliver installeret på din pc.

Over og ud !! Lad os fortsætte med vores næste vejledning på næste side.

Nu har du muligvis installeret den nødvendige software og bygget SPI-grænsefladen.

Sådan overføres et program til en mikrocontrollerchip

Det næste trin kræver nogle få komponenter såsom et brødbræt, en LED og en beregnet modstand til den tilsigtede anvendelse.

I dette afsnit lærer vi programmørens testmetode og bekræfter installationen af ​​de relevante drivere og softwaren.

For at kontrollere, om driverne og softwaren var installeret korrekt, implementerer vi et simpelt program kendt som avrdude.

AVRdude er et program, der er tilknyttet den nyeste WinAVR-installation, uden hvilken den faktiske overførsel af filen til MCU ikke kan være mulig.

Dette program er et .hex-filformat, som i det væsentlige bliver forståeligt for MCU for de krævede henrettelser.

Hvis verifikationen ikke lykkes, er programmøren ude af stand til at overføre filen.

Lad os hurtigt se, hvordan vi kan implementere testproceduren ved hjælp af følgende instruktioner:

Åbn DOS (Diskoperativsystem) -prompten ved at klikke på 'startmenu' og skrive cmd.exe i det givne søgefelt.

Nu kan udførelsen af ​​AVRdude ske ved blot at skrive avrdude –c usbtiny –p m32 over DOS-prompten. Så snart dette er implementeret, anerkender DOS straks, om forbindelsen var en succes.

I ovenstående kommando er “-c” et underretningsflag, der inkluderer “usbtiny” -programmerspecifikation, mens “-p” -taggen identificerer mikrokontroller-enheden (“m32, der angiver Atmega32).

Hvis du har brugt en anden MCU, skal du medtage de relevante præfikser til implementeringen.

Når ovenstående procedure er afsluttet, kan du skrive 'exit' over DOS-prompten, og det vil flytte dig ud af vinduet.

Hvis du seriøst spekulerer på de faktiske programmeringsdetaljer, skal vi først lodde og konstruere det eksterne analoge LED-kredsløb, som programmet kunne implementeres over, for medmindre der er et system til at anerkende svaret fra MCU, programmeringen og kørsel af mikrokontrolleren ville være ret meningsløs.

At lave LED-kortet er meget simpelt, det handler om lodning af de to ledninger på LED'en over et stykke veroboard og tilslut modstanden med en af ​​LED'ens ledninger. Denne LEDs rolle er kun at begrænse strømmen til LED'en, så den ikke brænder af på grund af den overskydende spændingsannoncestrøm fra MCU-udgangen.

Modstandens værdi kan beregnes ved hjælp af følgende enkle formel:

R = (Ub - LEDfwd) / I

Hvor Ub er forsyningsspændingen, er LEDfwd den optimale driftsspænding for den anvendte LED, og ​​jeg er dens optimale forstærkere.

Antag at vi bruger en RØD LED, der har en LED fremadspænding = 2,5V og strøm I = 20mA, ovenstående ligning kan løses som følger:

Da spændingen fra MCU ville være 5V, kan den udtrykkes som:

R = (5 - 2,5) /. 02 = 125 ohm, ¼ watt, hvor den nærmeste værdi er 120 ohm.

Nu har vi LED, en 120 ohm modstand og en veroboard, skal du blot forbinde ovenstående komponenter som angivet i diagrammet med mikrocontrolleren.

Når dette er gjort, kan MCU'en programmeres til det tilsigtede svar på ovenstående LED-opsætning.

Dernæst programmering af MCU.

For at tillade mikrokontrolleren at udføre nogle meningsfulde implementeringer er det bydende nødvendigt at skrive passende instruktioner i MCU'en.

Sådan installeres et programmeringsmiljø og undersøgelse af WinAVR

Til dette kunne vi sandsynligvis bruge vores helt egen 'teksteditor' på vores pc, selvom vi af os ville sætte pris på brugen af ​​et mere professionelt 'programmeringsmiljø' i stedet for en almindelig teksteditor, simpelt fordi denne tilgang giver dig mulighed for at nyde noget indbyggede interessante funktioner i denne 'programmeringsmiljø' -pakke.

Det understøtter oprettelse og redigering af programmer gennem forskellige sprog og kompilerer dem også til en leverbar tilstand, der er let forståelig og accepteret af en mikrocontrollerchip.

I sidste ende ville dette blive understøttet af WinAVR og overført til den pågældende MCU-chip.

WinAVR kan også være udstyret til at udføre mange andre operationer såsom fejlfinding af programmerne og advare os om mulig syntaks og kompilering af fejl og fejl. Vi diskuterer disse i vores senere tutorials.

Du ville have, at installationsforløbet for WinAVR var ekstremt hurtigt og snappy. Lad os dykke ned i detaljerne med følgende punkter:

Du skal downloade de nyeste versioner fra mappen WinAVR source forge files. Du vil støde på nogle nyttige oplysninger relateret til denne download fra dens officielle hjemmeside.

Du vil blive bedt om på tværs af en sikkerhedsforespørgsel, så du kan svare, hvis du vil have downloadet til at finde sted, dette er spurgt om den fil, der skal downloades, er en eksekverbar fil.

Download filen og start udførelsesprocessen ved at klikke på den. Lad installationen begynde.

Processen vil guide dig med nogle besvarelige spørgsmål, så du muligvis kan strømline installationen efter din komfort. Du vil ignorere mange af disse til deres standardformularer. Det er alt sammen op til dig at vælge dem, som du synes er bedst egnet til handlingerne.

Indtil nu ville du finde alt ret normalt og let at gå og finde et par muligheder I startmenuen kastes mod dig. Ingen bekymringer, kun nogle af disse bruger faktisk kun en af ​​temene med navnet 'programmers notepad'.

Når der er klikket på dette ikon, ville det starte brugergrænsefladen, så du muligvis kan anvende skrivningen af ​​programmerne (såsom oprettelse og redigering). Du vil også være vidne til programmet bestående af menukommandoer, der hjælper dig med at kompilere koderne og integrere dem i mikrokontrolleren.

Det grundlæggende job med ovennævnte programmør notesblok er at omdanne en menneskelig læsbar kode, som du ville skrive, til en række instruktioner, der kun er forståelige for MCU.

Den næste vejledning vil dække testningen af ​​ovennævnte programmør, så vi kan være sikre med hensyn til dens kompatibilitet med Windows, og om den perfekt “ryster hånden” med din mikrocontroller IC.

Sådan programmeres en MCU til tænding af en LED

Når dette er bekræftet, fortsætter vi med at oprette en lille 'gør ingenting' -kode, bare for at sikre, at proceduren for kodeoverførsel ikke støder på fejl.

Selvfølgelig er vi nu klar til at implementere vores første program inde i MCU, men før det ville det være interessant at opsummere hurtigt, hvad vi gjorde i løbet af vores tidligere tutorials:

Vi anskaffede AVR Atmel mikrokontroller i henhold til vores krævede specifikation her, vi har brugt ATMega32 til illustrationer. Derefter lærte vi om grundlæggende mikrocontroller og programmeringsenheden, der er ansvarlig for at overføre et program til MCU-chippen.

Længere frem byggede vi SP-interface-stikket, hvilket er vigtigt, så din computer kan forbindes med mikrocontrolleren til programmeringshandlingerne.

Efter dette bekræftede vi, om driverne var installeret korrekt i computeren til et 32-bit såvel som et 64-men operativsystem.

Dernæst installerede vi programmeringsmiljøet kaldet Win AVR til at lette overførsel af kodeadgang til kodning til mikrokontrolleren efterfulgt af implementeringen af ​​avrdude til verificering af programmøren med din pc og mikrocontrolleren sammenkoblet.

Endelig i det foregående kapitel var vi færdige med at opbygge LED / modstandskredsløbet og forbinde det med de relevante MCU-udgange.

Det er meget arbejde, ikke desto mindre er det tid til at gå med det samme ind i nogle rigtige programmerings ting!

Til at begynde med vil vi opdele mikrokontrolleren i tre kategorier, hvilket forenkler vores forståelse meget:

Kontrol, detektion og kommunikation

Det ville være interessant at vide, at ovenstående funktioner kunne programmeres på mange forskellige måder.

I vores første program forsøgte vi at beordre mikrocontrolleren til at 'styre' en ekstern parameter, ja du har ret, det ville være den LED, vi for nylig byggede.

For at være præcis, vil vi bede MCU'en om at tænde den tilsluttede LED, ja jeg ved, dette ser ret primitivt ud, men startfasen skal altid være let.

At gå videre med det nuværende job og få MCU til at styre LED'en er faktisk ret simpelt:

Til dette instruerer vi pin # 0 på PORT B ​​om at producere den nødvendige 5V til LED.

Husk fra den foregående tutorial, vi forbandt anoden på LED'en til ovennævnte pin på MCU.

Der er to vigtige ting, der skal adresseres til denne pin på MCU: 1) output og 2) 5 volt

Vi lærer en måde, hvorpå vi kan instruere den bestemte pin om at blive output af MCU.

Når den er indstillet til at være output af chippen, kan vi instruere den om at være enten 'høj' (5V) eller 'lav' (0V) som ønsket for en applikation.

Da ethvert logisk kredsløb, såsom en MCU, kan benene være visne en udgang eller en indgang og kunne konfigureres til at producere enten en logisk høj eller logisk lav, behøver stifterne kun at blive tildelt enten til at være en logisk høj eller en logisk lav , der er ikke nogen mellemliggende eller udefinerede stater bortset fra disse par stater for mikrokontrollere eller for nogen digital IC for den sags skyld. Det samme gælder også for hver eneste pin i MCU'en.

Med hensyn til input- og output-pin-tildelingen ville indgangene være positioneret til at acceptere signaler fra eksterne analoge trin, mens outputene ville være ansvarlige for at fortolke disse i de specificerede logiske tilstande eller en frekvens.

Selvom ovenstående opgaver kunne udføres på mange forskellige måder, ville vi diskutere en af ​​dem for enkelheds skyld. Det skal dog bemærkes, at selvom den, der præsenteres lige nu, ser let og interessant ud, er den ikke så levedygtig og ikke en anbefalet type til alle MCU-applikationer, af samme grund vil du blive introduceret til mere populære programmeringsmetoder senere på kurset . Disse programmer tillader kun, at de ønskede ben tildeles i henhold til specifikationerne uden at påvirke de andre tilstødende, som muligvis allerede er tildelt til at udføre nogle andre funktioner.

Men lige nu vil vi ikke bekymre os om de andre ben så meget og bruger kun de relevante pins af interesse og undgår komplikationer til en vis grad.

For at tildele en pin som output er vi nødt til at anvende Data Direction Register (DDR). Hvis du spekulerer på, hvad register her betyder, er det simpelthen et mellemrum i MCU'en, der gør det muligt for mikrocontrolleren at reagere på en bestemt måde.

Ved hjælp af DDR kan vi indstille stiften til enten at sende data, der ligner en 'output' eller acceptere data, der er i form af et 'input'.

Men du kan være forvirret med hensyn til ordet, hvad betyder det? En data tilføjer en tredje dimension til stifterne, som kan tildeles kontinuerligt ved logisk nul (0V) eller logisk høj (5V), men hvad med de signaler, der kan variere hurtigt, såsom en frekvens af pulser. En frekvens vil være ledsaget af høje og lave logikker (5V og 0V), der oscillerer med nogle specificerede intervaller eller perioder, så den bliver tidsorienteret og kan justeres med hensyn til tid, det er derfor, vi identificerer som 'data', hvilket betyder en parameter, der indikerer en funktion i forhold til en anden funktion (logiske tilstande og tid).

En metode til at tildele pin0 som output er ved at skrive følgende kode:

DDRB = 0b00000001

I ovenstående program betegner DDRB Data Direction Register for PORT B ​​0b instruerer compileren om følgende binære udtryk for et tal, mens “1” i slutningen af ​​udtrykket angiver placeringen af ​​pin0, det vil sige dets placering i form af den første pin i PORT B.

Hvis du husker, lærte vi, at PORT B ​​knytter 8 ben til den (fra 0 til pin7), og hvis du bemærker, at ovenstående kode også har 8 cifre i sig, hvilket betyder, at hvert ciffer betyder disse 8 ben i PORT B.

Nu er den næste procedure at tildele 5V til denne pin (pin0). Igen er funktionsprincippet identisk med DDR som ovenfor udtrykt gennem følgende binære kode:

PORTB = 0b00000001

Som det kan ses, er den eneste forskel mellem ovenstående kode og den tidligere, at vi i denne kode har brugt PORT-registeret. Dette register håndterer specifikt pin-tildelingerne for den bestemte port, for hvilken den er placeret indeni MCU. Således giver det os mulighed for at tildele de rigtige datalogikker (0 eller 1) til disse pinouts.

Nu kan vi være interesserede i at diskutere nogle om de omtrentlige detaljer i vores program. Da vi ved, kræver alle programmer et bestemt rum for at igangsætte udførelsen, kan dette sammenlignes med en kok, der kender alle ingredienserne vedrørende en bestemt opskrift, men ikke bliver instrueret, hvorfra man skal begynde.

Den 'vigtigste' funktion her er det sted, hvor hvert af C / C ++ - programmerne starter udførelsen. Derfor kan hovedet oprettes som:

int main (ugyldigt)
{
}

For at programmet kan fortolke DDR- og PORT-registeroplysningerne og deres funktion inde i MCU-chippen, skal der dog medtages en yderligere erklæring, der kan bestå af alle data vedrørende AVR MCU. Måske vil vi tilføje denne inkludering i alle vores programmer.

#omfatte
int main (ugyldigt)
{
}

Så snart kompileringen starter, fokuserer forprocessorsektionen i compileren på AVR-biblioteket for at identificere “io.h” -filen. Udvidelsen '.h' angiver her, at den er en headerfil, og at denne kode inde i filen ville blive introduceret i starten (hovedet) af den kildefil, der oprettes, deraf navnet 'header'.

Her kan vi introducere DDR- og PORT-udsagnene i vores kode, fordi tilføjelsen af ​​io.h-headerfilen ville have rettet kompilatoren om dem.

#omfatte

int main (ugyldigt)

{

DDRB = 0b00000001 // Data Direction Register indstilling pin0 til output og de resterende pins som input

PORTB = 0b00000001 // Indstil pin0 til 5 volt

}

Ovenstående fastsætter orienteringen af ​​pin0 som output med en styrke på 5V. Der er dog stadig et problem, der ikke er bestemt for denne pin, det vil sige, at denne pin endnu ikke skal instrueres om at blive tændt på ubestemt tid, så længe MCU'en er tændt. Denne uendelige feedback-loop vil sikre, at denne pin fra MCU ikke slukker, men fortsætter med 5V output på ubestemt tid.

Selv om der er mange forskellige metoder til at anvende en loop-instruktion til en pin, ville vi prøve at anvende 'while' -sløjfen her. Som navnet antyder, fortæller 'while' -sløjfen mikrokontrolleren, at 'mens' strømmen er tilgængelig, skal du forblive aktiveret med den tildelte 5V til den tildelte pinout.

#omfatte

int main (ugyldigt)

{

DDRB = 0b00000001 // Data Direction Register indstilling pin0 til output og de resterende pins som input

PORTB = 0b00000001 // Indstil pin0 til 5 volt

mens (1)

{

// Kode ville være herinde, hvis det var nødvendigt at udføre igen og igen og igen ... uendeligt

}

}

Du vil måske bemærke, at her har vi brugt '1' i form af et argument for 'while' -sløjfen, da alt undtagen '0' kunne betragtes som en logisk 'sand'.

Det indebærer, at 'while' -overvejelsen aldrig ville være ansvarlig for andet end en logisk 'sand', hvilket betyder, at den bestemte stift ville låse fast med den specificerede tilstand på ubestemt tid.

Lysdioden kan være vidne til at være TÆNDT over den tildelte pin permanent, så længe MCU modtog strøm over sin Vdd og Vss.

Det er det, nu har vi det resultat, som vi ønskede at få og endelig kan se det ske efter så meget hårdt arbejde, men ikke desto mindre er det så tilfredsstillende at se det søde resultat af vores hårde arbejde.

Inden for de næste selvstudier lærer vi, hvordan man tilføjer en 'tids' -dimension til ovenstående LED, det er sådan, hvordan man får den til at blinke med en bestemt specificeret hastighed.

Faktisk blinker LED'en faktisk i ovenstående implementering, men sløjfehastigheden er så hurtig, at den næsten er som en permanent tænding over LED-belysningen.

Vi ser, hvordan denne sløjfe kan tilføjes med en forsinkelse som ønsket for at få LED til at blinke med den forsinkede hastighed.

Sådan får du en LED til at blinke ved hjælp af AVR-mikrocontroller

I den sidste diskussion lærte vi, hvordan man laver en LED-tænding TIL via en mikrocontroller, det var fremragende, var det ikke? Måske er det ikke så meget!

Her vil vi lære at krydre ovenstående LED-belysning ved at tilskrive en tovejsfunktionalitet, det vil sige vi prøver at få den til at blinke eller blinke med en bestemt frekvens eller hastighed. Vi ser også, hvordan denne sats kunne øges eller sænkes efter ønske af brugeren.

Lad os se nærmere på dette:

#omfatte

#omfatte

int main (ugyldigt)

{

DDRB | = 1<< PINB0

mens (1)

{

PORTB ^ = 1<< PINB0

_forsink_ms (100)

}

}

Hvis du føler dig forvirret af de mærkelige symboler (&, ^, | osv.), Der bruges i ovenstående udtryk (& er ikke der, men kan bruges i andre lignende koder), her er de relaterede oplysninger, du ville være interesseret i at vide om disse :

Det inkluderer mange standard logiske algoritmer såsom AND, OR, NOT og XOR, som typisk bruges med ovenstående kode.

Denne logiske funktionalitet sammenligner specifikt de to bits “1” og “0” i henhold til deres tildelte sandhedstabeller.

Vi får en idé ved at analysere følgende bitarrangement:

01001011 &
10001101
lige med
00001001

I ovenstående kode henviser & til AND som brugt i C programmering.

Når man læser rækkerne lodret, antyder det, at 0 og 1 er lig med 0, 1 og 0 også er lig med 0, 0 og 0 er lig med 0, 1 og 1 er lig med 1. At læse det er så simpelt som det. Disse er ifølge sandhedstabellen for en AND-operatør.

Hvis vi vurderer følgende tabel, angiver den symbolet “|” angiver brugen af ​​'ELLER' -funktionalitet, '|' kunne findes lige til venstre for 'backspace' på computerens tastatur:

01001011 |
10001101
lige med
11001111

Identisk indikerer denne sandhedstabel for en ELLER-logisk funktionalitet, at bit 0 eller 1 er lig med 1, 1 eller 0 også er lig med 1, 0 eller 0 er lig med 0, mens 1 eller 1 er lig med 1.

Den følgende bitkombination er for XOR-logikoperatør betegnet med ^ og kan undersøges ligesom vi gjorde med AND- ELLER sandhedstabellerne:

01001011 ^
10001101
lige med
11000110

Lad os nu fortsætte med det første program og lære, hvad følgende linje i det betyder:

#omfatte

Gennem vores tidligere tutorials ved vi, hvordan udtrykket fungerer, så vi gentager det ikke, men det ser ud til at være et nyt 'inkludere' udtrykt af #include, som skal undersøges.

I dette 'inkluder' giver forsinkelsen os nogle enkle metoder til implementering.

Som navnet antyder, giver forsinkelsen os mulighed for at fremkalde en forsinkelse i det bestemte program.

Det næste udtryk int main (ugyldigt) kunne udelades fra den igangværende diskussion, da vi allerede har dækket dette i vores tidligere indlæg.

Dernæst kommer den ændrede DDRB.

Det følgende viser den tidligere form, som ikke er en bedre måde at tildele stifterne, da alle stifter fra 0 til 7 blev skiftet til at danne input. Men forestil dig, hvad der ville være situationen, hvis vi ønskede at oprette et længerevarende program, der krævede disse ben for anden funktionalitet? F.eks. Kunne pin2 være nødvendig for at anvende en fjernskift af et apparat. I så fald vil vi ikke sætte pris på at tildele det samme som et input bare gennem prøving og fejl. Det kan betyde forkert reaktion fra fjernsenderen til apparatets modtager.

DDRB = 0b00000001

Vi vil hellere kun påvirke en bit, hat pin0 bit, og kigge på “ELLER” -funktionaliteten, dette kan udføres gennem en binær maskering.

DDRB = DDRB | 0b00000001

Her er det tilsløret med en 'ELLER' -maske: 0b00000001, selvom det ganske vist ser ud til at være et autentisk binært tal, hvis den tidligere DDRB for eksempel: 0b01001010, så at anvende en ELLER til dette gennem maskering kunne give: 0b01001010 | 0b00000001 = 0b01001011.

Den resulterende forskel, som man kunne se, er kun med pin0, hvis bits er ændret!

Komprimering af ovenstående udsagn endnu mere via C ++ giver:

DDRB | = 0b00000001

Men vi finder ud af, at der er endnu mere i det givne program. Selvom det kan se ret legitimt og indlysende ud, bør vi drage fordel af nogle af udsagnene fra io.h-headerfilen, især når den grundlæggende er oprettet for vores bekvemmelighed?

Så hvis “DDRB | = 1<< PINBO, why it’s like that?

1<< PINBO is implemented for applying the masking effect. The “1” indicates what may be introduced inside the mask, while the < < is simply the left shift functionality. It executes exactly as it’s named, and PINBO is the number of locations that the “1” would sequence across the left hand side. To be precise PINBO may be equivalent of a 0.

Så vi begynder med en 0b00000000 og sætter en '1' for at producere 0b0000001, og derefter overfører vi den til venstre 0-positioner, hvilket giver en nøjagtig identisk 0b00000001 som ovenfor.

Hvis vi formoder, at det var PINB4, kunne udsagnet nu udtrykkes som 1<< PINB4. I this case the “1” would be pushed to the left 4 locations producing: 0b00010000.

Pas på, at vi anvender et nulindeks, hvilket betyder at der er fire nuller efter '1'.

Fortsætter nu til 'while' -sløjfen, som vi tidligere havde noteret over den 'uendelige sløjfe'. Men måske vil vi nu have mikrocontrolleren til at implementere nogle af de ønskede henrettelser. Dette er muligvis kun muligt inden for den givne sløjfe. Det er sløjfen, hvor den bestemte sekvens gentages igen og igen.

Hvis udførelsen ville blive placeret før sløjfen, ville den have implementeret kun en gang.

For at få LED'en til at blinke på ubestemt tid er det imidlertid nødvendigt at tænde / slukke for PINB0 inden for sløjfen. Her finder vi også de forsinkelser, der introduceres, uden hvilke LED-lampen ville være umulig. Men dette ville tvinge LED'en til at blinke i en meget hurtig hastighed, der er vanskelig at genkende med det blotte øje, det ville være nødvendigt at bremse lidt for at blive identificerbart med vores øjne.

Vi er opmærksomme på opsætningsproceduren for en bestemt bit i det binære tal, men er ikke sikker på metoden til at anvende en bestemt bit '0', hvis det endnu er '1'.

Det følgende program kunne ses ved at gøre dette, men vi finder også ud af, at det muligvis ikke kan ses i programmet.

De to første udsagn ændrer bit til “1” (5V, LED-lys), hvorefter en pause indføres i 100 ms.

Det næste par linjer forvandler PINB0-biten til '0' (nul spænding, LED slukket), men undskyld, at AND-sammenligningen ikke vil kunne udføre en '0' fra biten, men hvis vi IKKE bruger '~' for den binære maske kunne det skifte alle 0'er til 1'er og omvendt.

Dette gør det muligt for os kun at påvirke PINB0-biten og vende den til “0”. Parenteserne blev inkluderet for at indeholde maskeringskørslen, så NOT-operationen kunne anvendes på hele maskerne og ikke blot over '1' før venstre skift '<<”.

PORTB | = 1<< PINB0
_forsink_ms (100)
PORTB & = ~ (1<< PINB0)
_forsink_ms (100)

For at skabe forsinkelser TIL FRA eller perioder med lige varighed kan vi forkorte de foregående fire linjer til to og anvende XOR-funktionalitet i vores fordel. Det skal bemærkes, at en XOR-udførelse er tildelt en pin til en 1, hvis den er 0 og omvendt. Denne udførelse ville kun påvirke PINB0. Som ofte gange kommandoen anvendes, ville den simpelthen gøre biten til det modsatte af den eksisterende logik.

PORTB ^ = 1<< PINB0
_forsink_ms (100)

FÆRDIG! Din LED blinkede nu i henhold til den indstillede hastighed ... Enkel, var det ikke?




Forrige: Multiple Appliances Remote Control Circuit Næste: AC-fase, neutral, jordfejlindikator