Taula de continguts:

Tutorial AVR Assembler 6: 3 passos
Tutorial AVR Assembler 6: 3 passos

Vídeo: Tutorial AVR Assembler 6: 3 passos

Vídeo: Tutorial AVR Assembler 6: 3 passos
Vídeo: AVR Ассемблер. Урок 10. SPI. AVR Assembler. Lesson 10. SPI. 2024, Desembre
Anonim
Tutorial AVR Assembler 6
Tutorial AVR Assembler 6

Benvingut al tutorial 6!

El tutorial d'avui serà breu, on desenvoluparem un mètode senzill per comunicar dades entre un atmega328p i un altre mitjançant dos ports que els connectin. A continuació, agafarem el rodet de dau del tutorial 4 i el registre analitzador del tutorial 5, els connectarem junts i utilitzarem el nostre mètode per comunicar el resultat dels llançaments de daus del rodet a l’analitzador. A continuació, imprimirem el rotllo en binari utilitzant els LED que hem construït per a l’analitzador al Tutorial 5. Un cop hàgim treballat, podrem construir la següent peça del nostre projecte global al següent tutorial.

En aquest tutorial necessitareu:

  1. La vostra placa de prototipatge
  2. El vostre rodet de daus del tutorial 4
  3. El vostre registre analitzador del tutorial 5
  4. Dos cables de connexió
  5. Una còpia del full de dades complet (revisió del 2014):

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

  6. Una còpia del manual d’instruccions (revisió del 2014):

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

Aquí hi ha un enllaç a la col·lecció completa dels meus tutorials del muntador AVR:

Pas 1: Com podem aconseguir que dos microcontroladors parlin entre ells?

Com podem aconseguir que dos microcontroladors parlin entre ells?
Com podem aconseguir que dos microcontroladors parlin entre ells?

Com que estem començant a ampliar el nostre projecte de manera que el nostre producte final únic estigui format per una col·lecció de peces més petites, necessitarem més pins dels que pot proporcionar un sol Atmega328P. Per tant, farem cada peça del projecte global en un microcontrolador separat i després farem que comparteixin les dades entre ells. Per tant, el problema que hem de resoldre és com podem trobar un mètode senzill perquè els controladors puguin parlar entre ells i transferir dades entre ells? Bé, una cosa d’aquests controladors és que cadascun executa 16 milions d’instruccions per segon. Aquest és un temps molt precís i, per tant, podem utilitzar aquest temps per transferir dades. Si utilitzem retards de mil·lisegons per constituir les dades, no hem de ser tan precisos, ja que la CPU està executant 16.000 instruccions en un sol mil·lisegon. En altres paraules, un mil·lisegon és una eternitat per a la CPU. Proveu-ho doncs amb els llançaments de daus. Vull transmetre el resultat d'un llançament de daus des del xip del rodet de daus fins al xip de l'analitzador. Suposem que estàveu al carrer i que volia indicar-vos el resultat de la tirada d’un par de daus. Una cosa que podria fer, si tots dos tinguéssim un rellotge, és que podria encendre una llanterna, i quan estigueu a punt per rebre les meves dades, enceneu la llanterna i tots dos engeguem els nostres rellotges. A continuació, mantinc la llanterna encesa durant el nombre exacte de mil·lisegons a mesura que llancen els daus i després l’apago. Per tant, si llancés un 12, mantindria la llum encesa durant 12 mil·lisegons. Ara, el problema de l’anterior és que, per a vosaltres i per a mi, no hi ha manera que siguem capaços de cronometrar les coses prou amb precisió per distingir entre 5 mil·lisegons i 12. mil·lisegons. Però, què passa amb això: suposem que decidim que mantindria la llum encesa durant un any per cada número dels daus? Llavors, si llanço un 12, brillaria durant 12 anys i crec que estareu d'acord que no hi ha cap possibilitat que cometeu un error en esbrinar el número, oi? Podríeu fer un descans i anar a jugar a beisbol, fins i tot podríeu anar a jugar a craps a Las Vegas durant 6 mesos, sempre que en algun moment de l’any fes una ullada al carrer per veure si la llum estava encesa, no faltaria el recompte. Doncs això és exactament el que estem fent per als microcontroladors. Un sol mil·lisegon per a la CPU és com un any. Per tant, si encenc el senyal durant 12 mil·lisegons, gairebé no hi ha cap possibilitat que l’altre microcontrolador el confongui durant 10 o 11, independentment de les interrupcions i del que no passi mentrestant. Per als microcontroladors, un mil·lisegon és una eternitat, així que això és el que farem. Primer triarem dos ports del controlador per ser els nostres ports de comunicació. Faré servir PD6 per rebre dades (podríem anomenar-lo Rx si ens agrada) i triaré PD7 per transmetre dades (podríem anomenar-lo Tx si ens agradaria). El xip analitzador comprovarà periòdicament el seu pin Rx i, si veu un senyal, caurà a una "subrutina de comunicació" i, a continuació, transmetrà un senyal de retorn al rodet de daus dient que està llest per rebre. Tots dos començaran a cronometrar i el rodet de daus transmetrà un senyal (és a dir, 5V) durant un mil·lisegon per número del dau. Per tant, si el llançament era doble de sis, o un 12, el rodet de daus establiria el seu PD7 a 5V durant 12 mil·lisegons i el tornaria a posar a 0V. L'analitzador comprovarà el seu pin PD6 cada mil·lisegon, comptant cada vegada, i quan es torni a 0V, envia el número resultant a la pantalla de l'analitzador, mostrant un número de dotze en binari als LED. Així que aquest és el pla. A veure si ho podem implementar.

Pas 2: subrutines de comunicacions

El primer que hem de fer és connectar els dos controladors. Per tant, agafeu un cable de PD6 en un i connecteu-lo a l’altre, i viceversa. A continuació, inicialitzeu-los configurant PD7 a OUTPUT a tots dos i PD6 a INPUT a tots dos. Finalment, poseu-los tots a 0V. Concretament, afegiu el següent a la secció Init o Reset del codi de cada microcontrolador:

sbi DDRD, 7; PD7 configurat com a sortida

cbi PortD, 7; PD7 inicialment 0V cbi DDRD, 6; PD6 configurat com a entrada cbi PortD, 6; PD6 inicialment 0V clr total; total de daus inicialment 0

Ara configurem la subrutina de comunicacions al xip de rodets de daus. Primer, definiu una nova variable a la part superior anomenada "total" que emmagatzemarà el nombre total llançat al parell de daus i l'inicialitzarà a zero.

A continuació, escriviu una subrutina per comunicar-vos amb l'analitzador:

comunicar-se:

cbi PortD, 7 sbi PortD, 7; Envia el senyal d'espera a punt: sbic PinD, 6; llegeix PinD i salta si 0V rjmp espera retard 8; endarreriment per sincronitzar (trobat experimentalment) enviar: dec retard total 2; endarreriment per cada compte comptador total de CPI, 0; 0 aquí significa que s'ha enviat un nombre total de retards breq PC + 2 rjmp send cbi PortD, 7; PD7 a 0V clr total; restableix el total de daus a 0 ret

A l’analitzador afegim un rcall des de la rutina principal a la subrutina de comunicacions:

analitzador de clr; prepara't per al nou número

sbic PinD, 6; comproveu PD6 per si hi ha una senyal de 5 V comuniqui; si 5V es van a comunicar mov analitzador, total; sortida a analitzador de pantalla analitzador de crida

i, a continuació, escriviu la subrutina de comunicació de la manera següent:

comunicar-se:

clr total; restabliment total a 0 retard 10; retard per desfer-se dels rebots sbi PortD, 7; Estableix PB7 a 5V per a la recepció del senyal: retard 2; espereu el següent número inc total; increment total sbic PinD, 6; si PD6 torna a 0V hem acabat de rebre rjmp; en cas contrari, feu una còpia de seguretat per obtenir més dades cbi PortD, 7; restablir PD7 quan hagi acabat ret

Aquí està! Ara cada microcontrolador està configurat per comunicar el resultat del llançament de daus i després mostrar-lo a l’analitzador.

Implementarem una manera molt més eficient de comunicar-nos més endavant quan necessitem transferir el contingut d’un registre entre controladors en lloc de només tirar un dau. En aquest cas, encara utilitzarem només dos cables que els connectin, però utilitzarem 1, 1 per significar "començar la transmissió"; 0, 1 significa "1"; 1, 0 significa "0"; i finalment 0, 0 significa "transmissió final".

Exercici 1: vegeu si podeu implementar el millor mètode i utilitzar-lo per transferir el llançament de daus com a número binari de 8 bits.

Us adjuntaré un vídeo que mostra el meu en funcionament.

Pas 3: Conclusió

Conclusió
Conclusió

He adjuntat el codi complet per a la vostra referència. No és tan net i ordenat com voldria, però ho netejaré a mesura que ampliem en futurs tutorials.

A partir d’ara només adjuntaré els fitxers que contenen codi en lloc d’escriure-ho tot aquí. Simplement escriurem les seccions que ens interessa parlar.

Aquest va ser un breu tutorial on es va proposar un mètode senzill per dir al nostre microcontrolador analitzador quin va ser el resultat del nostre llançament de daus des del nostre microcontrolador de rodets de daus tot utilitzant només dos ports.

Exercici 2: en lloc d'utilitzar un senyal llest per mostrar quan el rodet de daus està preparat per transmetre i un altre quan l'analitzador està preparat per rebre, utilitzeu una "interrupció externa" anomenada "interrupció de canvi de pin". Els pins de l'atmega328p es poden utilitzar d'aquesta manera, motiu pel qual tenen PCINT0 i PCINT23 al costat al diagrama de pinout. Podeu implementar-ho com a interrupció d'una manera similar a la que vam fer amb la interrupció de desbordament del temporitzador. En aquest cas, el "manipulador" d'interrupcions serà la subrutina que comunica amb el rodet de daus. D'aquesta manera no cal trucar realment a la subrutina de comunicacions des de main: hi anirà cada vegada que hi hagi una interrupció provinent d'un canvi d'estat en aquest pin.

Exercici 3: una manera molt millor de comunicar i transferir dades entre un microcontrolador a una col·lecció d’altres és mitjançant la interfície sèrie de 2 fils integrada al propi microcontrolador. Intenteu llegir la secció 22 del full de dades i veure si podeu esbrinar com implementar-lo.

Utilitzarem aquestes tècniques més sofisticades en el futur quan afegim més controladors.

El fet que tot el que hem fet amb el nostre analitzador sigui agafar el total del llançament de daus i imprimir-lo en binari mitjançant LED no és el que és important. El fet és que ara el nostre analitzador "sap" què és el tir de daus i el pot utilitzar en conseqüència.

Al següent tutorial canviarem l'objectiu del nostre "analitzador", introduirem alguns elements de circuit més i utilitzarem el llançament de daus d'una manera més interessant.

Fins la pròxima vegada…

Recomanat: