Innholdsfortegnelse:

AVR Assembler Opplæring 6: 3 trinn
AVR Assembler Opplæring 6: 3 trinn

Video: AVR Assembler Opplæring 6: 3 trinn

Video: AVR Assembler Opplæring 6: 3 trinn
Video: LDmicro 13: HC-05 Управление через приложение Bluetooth для телефона (программирование ПЛК микроконтроллера с помощью LDmicro) 2024, Juli
Anonim
Veiledning for AVR -montør 6
Veiledning for AVR -montør 6

Velkommen til opplæring 6!

Dagens opplæring vil være kort, hvor vi skal utvikle en enkel metode for å kommunisere data mellom en atmega328p og en annen ved å bruke to porter som forbinder dem. Vi tar deretter terningvalsen fra opplæring 4 og registeranalysatoren fra opplæring 5, kobler dem sammen og bruker vår metode for å kommunisere resultatet av terningkast fra valsen til analysatoren. Vi vil deretter skrive ut rullen i binær bruk av lysdiodene som vi konstruerte for analysatoren i opplæring 5. Når vi har arbeidet, vil vi kunne konstruere det neste stykket i vårt overordnede prosjekt i neste opplæring.

I denne opplæringen trenger du:

  1. Prototypebrettet ditt
  2. Terningrullen din fra opplæring 4
  3. Din registeranalysator fra opplæring 5
  4. To tilkoblingsledninger
  5. En kopi av det komplette databladet (revisjon 2014):

    www.atmel.com/images/Atmel-8271-8-bit-AVR-M…

  6. En kopi av bruksanvisningen (2014 -revisjon):

    www.atmel.com/images/atmel-0856-avr-instruc…

Her er en lenke til den komplette samlingen av mine AVR assembler-opplæringsprogrammer:

Trinn 1: Hvordan kan vi få to mikrokontrollere til å snakke med hverandre?

Hvordan kan vi få to mikrokontrollere til å snakke med hverandre?
Hvordan kan vi få to mikrokontrollere til å snakke med hverandre?

Siden vi begynner å utvide prosjektet vårt, slik at vårt eneste sluttprodukt består av en samling mindre deler, kommer vi til å trenge flere pins enn en enkelt Atmega328P kan tilby. Derfor skal vi gjøre hvert stykke av det overordnede prosjektet på en separat mikrokontroller og deretter la dem dele dataene mellom dem. Så problemet vi må løse er hvordan kan vi finne på en enkel metode for kontrollerne å snakke med hverandre og overføre data mellom dem? Vel, en ting med disse kontrollerne er at de hver utfører 16 millioner instruksjoner per sekund. Dette er veldig nøyaktig tidsbestemt, og så vi kan bruke denne timingen til å overføre data. Hvis vi bruker forsinkelser på millisekunder for å utgjøre dataene, trenger vi egentlig ikke å være så presise siden CPU -en utfører 16 000 instruksjoner på et enkelt millisekund. Med andre ord er et millisekund en evighet for CPU -en. Så la oss prøve det med terningkastene. Jeg ønsker å overføre resultatet av en terningkast fra terningevalsbrikken til analysatorbrikken. Anta at du sto rett over gaten, og jeg ville signalisere deg resultatet av min terningkast. En ting jeg kunne gjøre, hvis vi begge hadde en klokke, er at jeg kunne slå på en lommelykt, så når du er klar til å motta dataene mine, slår du på lommelykten og vi starter begge klokkene våre. Så holder jeg lommelykten på for det eksakte antallet millisekunder mens terningene ruller og slår den deretter av. Så hvis jeg rullet en 12, ville jeg holde lyset mitt på i 12 millisekunder. Nå er problemet med det ovennevnte at det for deg og meg ikke er noen måte at vi kunne sette ting nøyaktig nok til å skille mellom 5 millisekunder og 12 millisekunder. Men hva med dette: Anta at vi bestemte at jeg skulle holde lyset mitt på i ett år for hvert tall på terningen? Så hvis jeg ruller en 12, ville jeg skinne lyset på deg i 12 år, og jeg tror du vil være enig i at det ikke er noen mulighet for at du vil gjøre en feil ved å finne ut tallet riktig? Du kan ta en pause og spille baseball, du kan til og med spille craps i Vegas i 6 måneder, så lenge du på et tidspunkt i løpet av året kikket over gaten for å se om lyset var på, du ikke ville gå glipp av en telling. Vel, det er akkurat det vi gjør for mikrokontrollerne! Et enkelt millisekund for CPU er som et år. Så hvis jeg slår på signalet i 12 millisekunder er det nesten ingen sjanse for at den andre mikrokontrolleren vil forvirre den i 10 eller 11 uansett hva som avbryter og hva som ikke skjer i mellomtiden. For mikrokontrollerne er et millisekund en evighet. Så her er hva vi skal gjøre. Først velger vi to porter på kontrolleren til å være kommunikasjonsporter. Jeg vil bruke PD6 for å motta data (vi kan kalle det Rx hvis vi vil), og jeg vil velge PD7 for overføring av data (vi kan kalle det Tx hvis vi vil). Analysatorbrikken vil med jevne mellomrom sjekke at den er Rx -pin, og hvis den ser et signal, vil den falle til en "kommunikasjonssubrutine" og deretter sende et retursignal til terningrullen og si at den er klar til å motta. De vil begge starte timingen og terningvalsen sender et signal (dvs. 5V) for et millisekund per tall på terningen. Så hvis rullen var dobbel seksere eller en 12, så ville terningrullen sette PD7 til 5V i 12 millisekunder og deretter sette den tilbake til 0V. Analysatoren vil kontrollere PD6 -pinnen hvert millisekund, telle hver gang, og når den går tilbake til 0V, sender den det resulterende tallet til analysatorens display, og viser en tolv i binær på lysdiodene. Så det er planen. La oss se om vi kan implementere det.

Trinn 2: Kommunikasjonssubrutiner

Det første vi må gjøre er å koble de to kontrollerne. Så ta en ledning fra PD6 på den ene og koble den til PD7 på den andre, og omvendt. Initialiser dem deretter ved å sette PD7 til OUTPUT på begge og PD6 til INPUT på begge. Til slutt satte vi alle til 0V. Spesielt, legg til følgende i Init eller Reset -delen av koden på hver mikrokontroller:

sbi DDRD, 7; PD7 satt til utgang

cbi PortD, 7; PD7 opprinnelig 0V cbi DDRD, 6; PD6 satt til input cbi PortD, 6; PD6 opprinnelig totalt 0V clr; totalt på terninger i utgangspunktet 0

La oss nå sette opp kommunikasjonssubrutinen på terning-rull-brikken. Definer først en ny variabel øverst som kalles "total" som lagrer det totale antallet kastet på terningsparet og initialiserer det til null.

Skriv deretter en subrutine for å kommunisere med analysatoren:

kommunisere:

cbi PortD, 7 sbi PortD, 7; Send klart signal vente: sbic PinD, 6; les PinD og hopp over hvis 0V rjmp ventetid 8; forsinkelse for å synkronisere (fant dette eksperimentelt) send: des total forsinkelse 2; forsinkelse for hver die count cpi totalt, 0; 0 her betyr "totalt" antall forsinkelser har blitt sendt breq PC+2 rjmp send cbi PortD, 7; PD7 til 0V clr totalt; tilbakestill terningen totalt til 0 ret

I analysatoren legger vi til en rcall fra hovedrutinen til kommunikasjonssubrutinen:

clr analysator; forberede seg på nytt nummer

sbic PinD, 6; sjekk PD6 for et 5V signal rcall kommunisere; hvis 5V går for å kommunisere mov analysator, totalt; utgang til analysator display rcall analysator

og skriv deretter kommunikasjonssubutinen som følger:

kommunisere:

clr totalt; nullstill totalt til 0 forsinkelse 10; forsinkelse for å bli kvitt bounces sbi PortD, 7; sett PB7 til 5V for å signalisere klar mottak: forsinkelse 2; vent på neste antall inkl totalt; øke totalt sbic PinD, 6; hvis PD6 går tilbake til 0V er vi ferdige med mottak av rjmp; ellers loop tilbake for flere data cbi PortD, 7; tilbakestill PD7 når du er ferdig ret

Der går du! Nå er hver mikrokontroller konfigurert for å kommunisere resultatet av terningkastet og deretter vise det på analysatoren.

Vi vil implementere en mye mer effektiv måte å kommunisere på senere når vi trenger å overføre innholdet i et register mellom kontrollerne i stedet for bare en terningkast. I så fall vil vi fortsatt bare bruke to ledninger som forbinder dem, men vi vil bruke 1, 1 for å bety "begynn overføring"; 0, 1 betyr "1"; 1, 0 betyr "0"; og til slutt 0, 0 for å bety "sluttoverføring".

Oppgave 1: Se om du kan implementere den bedre metoden og bruke den til å overføre terningkastet som et 8-biters binært tall.

Jeg legger ved en video som viser min i drift.

Trinn 3: Konklusjon

Konklusjon
Konklusjon

Jeg har vedlagt hele koden for din referanse. Det er ikke så rent og ryddig som jeg ønsker, men jeg vil rydde opp når vi utvider det i fremtidige opplæringsprogrammer.

Fra nå av vil jeg bare legge ved filene som inneholder kode i stedet for å skrive det hele her ute. Vi vil bare skrive ut delene som vi er interessert i å diskutere.

Dette var en kort opplæring der vi fant en enkel metode for å fortelle analysatorens mikrokontroller hva resultatet av terningkastet vårt fra terningrullemikrokontrolleren var mens vi bare brukte to porter.

Øvelse 2: I stedet for å bruke et klarsignal for å vise når terningvalsen er klar til å sende og en annen når analysatoren er klar til å motta, bruker du et "eksternt avbrudd" kalt "Pin Change Interrupt". Pinnene på atmega328p kan brukes på denne måten, og derfor har de PCINT0 gjennom PCINT23 ved siden av dem i pinout -diagrammet. Du kan implementere dette som et avbrudd på en lignende måte som vi gjorde med avbruddet for tidsoverløp. I dette tilfellet vil interrupt "handler" være subrutinen som kommuniserer med terningvalsen. På denne måten trenger du ikke å ringe kommunikasjonssubrutinen fra hovedlinjen: den vil gå dit når det er et avbrudd som kommer fra en endring av staten på den pinnen.

Øvelse 3: En mye bedre måte å kommunisere og overføre data mellom en mikrokontroller til en samling av andre er å bruke det innebygde 2-leder serielle grensesnittet på selve mikrokontrolleren. Prøv å lese avsnitt 22 i databladet og se om du kan finne ut hvordan du implementerer det.

Vi vil bruke disse mer sofistikerte teknikkene i fremtiden når vi legger til flere kontrollere.

Det faktum at alt vi gjorde med analysatoren vår er å ta totalen av terningkastet og deretter skrive det ut binært med lysdioder er ikke det som er viktig. Faktum er at nå analysatoren vår "vet" hva terningkastet er og kan bruke det deretter.

I den neste opplæringen vil vi endre formålet med vår "analysator", introdusere noen flere kretselementer og bruke terningkastet på en mer interessant måte.

Til neste gang…

Anbefalt: