Indholdsfortegnelse:

AVR Assembler Tutorial 6: 3 trin
AVR Assembler Tutorial 6: 3 trin

Video: AVR Assembler Tutorial 6: 3 trin

Video: AVR Assembler Tutorial 6: 3 trin
Video: AVR Assembly Tutorial: Part 3 (Inputs and Outputs) 2024, Juli
Anonim
Vejledning til AVR -samler 6
Vejledning til AVR -samler 6

Velkommen til selvstudium 6!

Dagens tutorial vil være kort, hvor vi vil udvikle en enkel metode til at kommunikere data mellem en atmega328p og en anden ved hjælp af to porte, der forbinder dem. Vi vil derefter tage terningevalsen fra selvstudium 4 og registeranalysatoren fra selvstudium 5, forbinde dem sammen og bruge vores metode til at kommunikere resultatet af terningekast fra valsen til analysatoren. Vi vil derefter udskrive rullen i binær ved hjælp af de lysdioder, vi konstruerede til analysatoren i selvstudie 5. Når vi har dette arbejde, vil vi være i stand til at konstruere det næste stykke af vores overordnede projekt i den næste vejledning.

I denne tutorial skal du bruge:

  1. Dit prototypebord
  2. Din terningrulle fra Tutorial 4
  3. Din registeranalysator fra selvstudium 5
  4. To forbindelsestråde
  5. En kopi af det komplette datablad (2014 -revision):

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

  6. En kopi af instruktionssætmanualen (2014 -revision):

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

Her er et link til den komplette samling af mine AVR-assembler-selvstudier:

Trin 1: Hvordan kan vi få to mikrokontrollere til at tale med hinanden?

Hvordan kan vi få to mikrokontrollere til at tale med hinanden?
Hvordan kan vi få to mikrokontrollere til at tale med hinanden?

Da vi begynder at udvide vores projekt, så vores eneste slutprodukt består af en samling mindre dele, har vi brug for flere nåle, end en enkelt Atmega328P kan levere. Derfor vil vi lave hvert stykke af det samlede projekt på en separat mikrokontroller og derefter få dem til at dele dataene imellem dem. Så det problem, vi skal løse, er, hvordan kan vi finde på en simpel metode til, at controllerne kan tale med hinanden og overføre data mellem dem? En ting ved disse controllere er, at de hver især udfører 16 millioner instruktioner pr. Dette er meget præcist timet, og så vi kan bruge denne timing til at overføre data. Hvis vi bruger forsinkelser på millisekunder til at udgøre dataene, behøver vi ikke rigtig at være så præcise, da CPU'en udfører 16.000 instruktioner på et enkelt millisekund. Med andre ord er et millisekund en evighed for CPU'en. Så lad os prøve det med terningkastene. Jeg vil overføre resultatet af en terningkast fra terningevalschippen til analysatorchippen. Antag, at du stod på den anden side af gaden, og jeg ville signalere til dig resultatet af mit terningkast. En ting, jeg kunne gøre, hvis vi begge havde et ur, er, at jeg kunne tænde en lommelygte, så når du er klar til at modtage mine data, tænder du din lommelygte, og vi starter begge vores ure. Så holder jeg min lommelygte tændt i det nøjagtige antal millisekunder, når terningerne ruller, og slukker den derefter. Så hvis jeg rullede en 12, ville jeg holde mit lys tændt i 12 millisekunder. Nu er problemet med ovenstående, at for dig og mig er der ingen måde, vi ville være i stand til at time tingene præcist nok til at skelne mellem 5 millisekunder og 12 millisekunder. Men hvad med dette: Antag, at vi besluttede, at jeg ville holde mit lys tændt i et år for hvert tal på terningerne? Så hvis jeg ruller en 12, ville jeg skinne lyset på dig i 12 år, og jeg tror, du vil være enig i, at der ikke er nogen mulighed for, at du vil begå en fejl ved at finde ud af nummeret rigtigt? Du kunne tage en pause og spille baseball, du kunne endda spille craps i Vegas i 6 måneder, så længe du på et tidspunkt i løbet af året kiggede på tværs af gaden for at se, om lyset var tændt, ville du ikke gå glip af en optælling. Det er præcis det, vi gør for mikrokontrollerne! Et enkelt millisekund for CPU'en er som et år. Så hvis jeg tænder for signalet i 12 millisekunder, er der næsten ingen chance for, at den anden mikrokontroller forvirrer det i 10 eller 11, uanset hvad der afbryder og hvad der ikke sker i mellemtiden. For mikrokontrollerne er et millisekund en evighed, så her er hvad vi vil gøre. Først vælger vi to porte på controlleren til at være vores kommunikationsporte. Jeg vil bruge PD6 til modtagelse af data (vi kan kalde det Rx, hvis vi vil), og jeg vil vælge PD7 til at overføre data (vi kunne kalde det Tx, hvis vi ville). Analysatorchippen vil med jævne mellemrum kontrollere, at den er Rx -pin, og hvis den ser et signal, falder den til en "kommunikationssubrutine" og sender derefter et retursignal til terningevalsen, der siger, at den er klar til at modtage. De vil begge starte timingen, og terningevalsen sender et signal (dvs. 5V) i et millisekund pr. Tal på terningerne. Så hvis rullen var dobbelt seksere eller en 12, ville terningevalsen sætte PD7 til 5V i 12 millisekunder og derefter sætte den tilbage til 0V. Analysatoren kontrollerer sin PD6 -pin hvert millisekund og tæller hver gang, og når den går tilbage til 0V, sender den det resulterende nummer til analysatorens display og viser en tolv i binær på LED'erne. Så det er planen. Lad os se, om vi kan implementere det.

Trin 2: Kommunikationssubrutiner

Den første ting, vi skal gøre, er at forbinde de to controllere. Så tag en ledning fra PD6 på den ene og tilslut den til PD7 på den anden, og omvendt. Initialiser dem derefter ved at indstille PD7 til OUTPUT på begge og PD6 til INPUT på begge. Slut endelig dem alle til 0V. Tilføj specifikt følgende til afsnittet Init eller Reset i koden på hver mikrokontroller:

sbi DDRD, 7; PD7 indstillet til output

cbi PortD, 7; PD7 oprindeligt 0V cbi DDRD, 6; PD6 indstillet til input cbi PortD, 6; PD6 oprindeligt 0V clr i alt; samlet på terninger i første omgang 0

Lad os nu konfigurere kommunikationssubrutinen på terningevalschippen. Definer først en ny variabel øverst kaldet "total", som vil gemme det samlede antal kastet på terningsparet og initialisere det til nul.

Skriv derefter en underprogram for at kommunikere med analysatoren:

kommunikere:

cbi PortD, 7 sbi PortD, 7; Send klar signal vente: sbic PinD, 6; læs PinD og spring over, hvis 0V rjmp venteforsinkelse 8; forsinkelse for at synkronisere (fandt dette eksperimentelt) send: dec total forsinkelse 2; forsinkelse for hvert die tæller cpi i alt, 0; 0 her betyder "totalt" antal forsinkelser er blevet sendt breq PC+2 rjmp send cbi PortD, 7; PD7 til 0V clr i alt; nulstil terninger i alt til 0 ret

I analysatoren tilføjer vi et opkald fra hovedrutinen til kommunikationssubrutinen:

clr analysator; forberede sig på nyt nummer

sbic PinD, 6; tjek PD6 for et 5V signal rcall kommunikere; hvis 5V går til at kommunikere mov analysator, i alt; output til analysator display rcall analysator

og skriv derefter kommunikationssubrutinen som følger:

kommunikere:

clr i alt; nulstil total til 0 forsinkelse 10; forsinkelse for at slippe af med bounces sbi PortD, 7; indstil PB7 til 5V for at signalere klar modtagelse: forsinkelse 2; vent på næste antal inkl. i alt; øg total sbic PinD, 6; hvis PD6 går tilbage til 0V, er vi færdige med at modtage; ellers loop op igen for flere data cbi PortD, 7; nulstil PD7, når du er færdig ret

Værsgo! Nu er hver mikrokontroller konfigureret til at kommunikere resultatet af terningkastet og derefter vise det på analysatoren.

Vi vil implementere en meget mere effektiv måde at kommunikere på senere, når vi skal overføre indholdet af et register mellem controllere i stedet for bare en terningkast. I så fald vil vi stadig kun bruge to ledninger, der forbinder dem, men vi vil bruge 1, 1 til at betyde "start transmission"; 0, 1 betyder "1"; 1, 0 betyder "0"; og endelig 0, 0 til at betyde "slut transmission".

Øvelse 1: Se om du kan implementere den bedre metode og bruge den til at overføre terningkastet som et 8-bit binært tal.

Jeg vedhæfter en video, der viser min i drift.

Trin 3: Konklusion

Konklusion
Konklusion

Jeg har vedhæftet den komplette kode til din reference. Det er ikke så rent og ryddeligt, som jeg gerne vil, men jeg vil rydde op, når vi udvider det i fremtidige selvstudier.

Fra nu af vil jeg bare vedhæfte filerne, der indeholder kode, frem for at skrive det hele herude. Vi skriver bare de afsnit, som vi er interesserede i at diskutere.

Dette var en kort vejledning, hvor vi fandt på en enkel metode til at fortælle vores analysemikrokontroller, hvad resultatet af vores terningkast fra vores terning-rulle mikrokontroller var, mens vi kun brugte to porte.

Øvelse 2: I stedet for at bruge et klarsignal til at vise, hvornår terningevalsen er klar til at sende og en anden, når analysatoren er klar til at modtage, skal du bruge en "ekstern afbrydelse" kaldet en "Pin Change Interrupt". Benene på atmega328p kan bruges på denne måde, hvorfor de har PCINT0 gennem PCINT23 ved siden af dem i pinout -diagrammet. Du kan implementere dette som et afbrydelse på en lignende måde, som vi gjorde med timeroverløbsafbrydelsen. I dette tilfælde vil interrupt "handler" være den underprogram, der kommunikerer med terningevalsen. På denne måde behøver du faktisk ikke at kalde kommunikationssubrutinen fra main: den vil gå der når som helst der kommer en afbrydelse fra en tilstandsændring på den pin.

Øvelse 3: En meget bedre måde at kommunikere og overføre data mellem en mikrokontroller til en samling af andre er ved hjælp af den indbyggede 2-leder serielle grænseflade på selve mikrokontrolleren. Prøv at læse afsnit 22 i databladet og se om du kan finde ud af at implementere det.

Vi vil bruge disse mere sofistikerede teknikker i fremtiden, når vi tilføjer yderligere controllere.

Det faktum, at alt, hvad vi gjorde med vores analysator, var at tage den samlede terningkast og derefter printe den ud i binær ved hjælp af lysdioder, er ikke det, der er vigtigt. Faktum er, at vores analysator nu "ved", hvad terningkastet er og kan bruge det i overensstemmelse hermed.

I den næste vejledning ændrer vi formålet med vores "analysator", introducerer et par flere kredsløbselementer og bruger terningkastet på en mere interessant måde.

Indtil næste gang…

Anbefalede: