Taula de continguts:

Interruptors de lectura amb ATtiny2313: 9 passos
Interruptors de lectura amb ATtiny2313: 9 passos

Vídeo: Interruptors de lectura amb ATtiny2313: 9 passos

Vídeo: Interruptors de lectura amb ATtiny2313: 9 passos
Vídeo: ПОЛТЕРГЕЙСТ 5 УРОВНЯ СНОВА НЕ ДАЕТ ПОКОЯ, ЖУТКАЯ АКТИВНОСТЬ / LEVEL 5 POLTERGEIST, CREEPY ACTIVITY 2024, De novembre
Anonim
Interruptors de lectura amb ATtiny2313
Interruptors de lectura amb ATtiny2313

Hi ha hagut diverses instruccions relacionades amb les sortides de l'ATtiny2313 i dispositius AVR similars. Per exemple, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- Motor-amb-un-microprocessador-AVR /. Treballant a la darrera de The Real Elliot, que mostrava com controlar els motors pas a pas, vaig trobar que seria molt útil poder executar seccions de codi alternatives al mateix programa, de manera que no vaig haver de reprogramar ATtiny2313 cadascuna. un cop volia provar una lleugera variació de codi (com ara mig pas o executar el pas a la inversa). Tot i que és fàcil escriure codi mitjançant una instrucció switch / case per permetre la selecció de variacions alternatives, cal una forma de seleccionar el cas. Això vol dir que s’ha de llegir algun tipus de dispositiu d’entrada per controlar el cas. Afortunadament, l'ATtiny2313 té molts pins d'E / S i està ben dissenyat per llegir les entrades dels commutadors. Aquest instructiu mostrarà com llegir les entrades i prendre decisions en funció del seu estat. Com que això només seria un instructiu força avorrit, explicaré una manera senzilla d’utilitzar la capacitat de temporitzador / comptador de l’ATtiny2313 per conduir un altaveu petit com a sonor. També hi haurà una petita digressió sobre tècniques de depuració senzilles.

Pas 1: el dispositiu d'entrada

El dispositiu d’entrada
El dispositiu d’entrada
El dispositiu d’entrada
El dispositiu d’entrada

Aquest instructable es basa en l’excel·lent treball de The Real Elliot i utilitza el sistema de desenvolupament ATtiny2313 Ghetto que descriu. El full de dades ATtiny2313 d’Atmel és la referència definitiva per a totes les funcions, però no és necessàriament fàcil de llegir. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (l'enllaç té tots els fulls de dades AVR, localitzeu el 2313). La figura mostra un conjunt senzill de commutadors d'entrada. Això és simplement un paquet de quatre interruptors d’encès / apagat; també conegut com a interruptors monopolar (SP). Normalment, una connexió o pol de cada commutador està lligada a terra mentre que l'altra connexió s'eleva a través d'una resistència limitant el corrent (10K més o menys). Una entrada de microcontrolador està connectada al pol amb la resistència. Si l'interruptor està obert, el microcontrolador llegirà l'entrada com a HI. Si l'interruptor està tancat, el microcontrolador llegirà l'entrada LO. Consulteu l’esquema per obtenir més detalls. L’ATtiny2313 simplifica les coses proporcionant resistències de tracció programables als pins d’E / S quan es configuren com a entrades. Això significa que els commutadors poden tenir simplement un pol lligat a terra (LO) i l'altre pol connectat a una entrada de processador. El primer exemple mostra només dos commutadors. Els commutadors es llegeixen i es configuren amb el codi següent. Configureu els commutadors com a entrades: (no cal cap codi; aquest és el valor per defecte). Activeu les resistències de tracció: PORTB = _BV (PB0) | _BV (PB1); Llegiu les entrades: but1 = ~ PINB & 0x03; Tingueu en compte l’ús de la inversió i l’emmascarament per obtenir un valor correcte.

Pas 2: llums intermitents per a un senyal

Utilitzarem aquests dos commutadors per parpellejar un LED un nombre programable de vegades. Els LED que farem servir seran els llums intermitents que The Real Elliot va fer famós. Els commutadors 1 i 2 es tractaran com a dos dígits binaris, de manera que la combinació pot representar els números 0, 1, 2 i 3. El nostre programa llegirà els dos commutadors i parpellejarà el LED el nombre de vegades adequat, però només si el commutador la configuració ha canviat. Els commutadors es rebutgen durant 500 mil·lisegons (no optimitzats). L'algorisme de rebounce és bastant senzill. Es llegeixen els commutadors i s’anota la lectura. Si és diferent del valor oldBut (l'últim valor guardat), el programa es retarda 500 mil·lisegons i es tornen a llegir els commutadors. Si el valor és el mateix que s'ha llegit anteriorment, el valor de oldBut s'actualitzarà i el LED parpellejarà el nombre de vegades que implica el valor binari dels dos commutadors. Tingueu en compte la inversió del valor ja que un commutador que està "activat" llegeix LO. Els commutadors s’escanejaran contínuament per obtenir més canvis. Consulteu les instruccions anteriors de The Real Elliot per obtenir més informació sobre els parpelleigs. Feu un cop d'ull a aquest https://www.ganssle.com/debouncing.pdf per obtenir més informació sobre els commutadors de retirada. Aquí teniu el codi ATtiny2313 per a aquest exemple. En funcionament, aquest programa parpellejarà el LED del PB4 (pin físic 8) dues vegades per mostrar que s’inicialitza. A continuació, llegirà els commutadors un i dos i parpellejarà d'una a tres vegades en funció de la configuració del commutador sempre que es canviïn. Quan els commutadors no canvien, el LED parpellejarà lentament. Per executar aquest codi, creeu un directori nou (anomeneu-lo "Bàsic" si voleu) i descarregueu-hi el fitxer de codi C següent i feu un fitxer. Canvieu el nom de Makefile1.txt per només Makefile. Amb WinAVR, compileu el programa i carregueu-lo al vostre ATtiny2313.

Pas 3: una menor digressió en la depuració

Si sou com jo (i tots els altres programadors del món), probablement hagueu experimentat moments en què el codi "lliure d'errors" que heu escrit i compilat acuradament no fa el que espereu que faci. Potser simplement no fa res! Quin és el problema, doncs? Com ho descobriràs? Afortunadament, hi ha diversos enfocaments per fer funcionar les coses. (Obteniu aquest llibre per obtenir un tractament excel·lent del tema de la depuració. Http://www.debuggingrules.com/) M'agradaria oferir-vos uns quants suggeriments senzills sobre el tema de la depuració d'aplicacions de microcontroladors. el que saps. Si heu aconseguit que un parpelleig funcioni una vegada, torneu a utilitzar-lo per veure on sou al vostre programa. M'agrada que el LED parpellegi dues vegades per indicar l'inici del programa. Podeu introduir el codi per fer-ho inicialment al començament del programa. Un cop hàgiu sabut que no passa res amb el vostre maquinari, creeu una funció per parpellejar. Aquí teniu la funció que faig servir./*------------------------------------------ ------------------------------ ** blinkEm: la funció per parpellejar LED mitjançant PD4 ** El PD4 s'ha de configurar com a sortida. ** ------------------------------------------------ --------------------- * / void blinkEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _delay_ms (1000); PORTD = ~ _BV (PD4); _delay_ms (1000); comptar--; }} Ara és possible utilitzar aquesta funció en diversos punts del vostre codi com a senyal que el codi s'ha executat fins ara. Saber que el codi s’executa significa que podeu examinar detingudament cada secció que s’ha executat, però que no ha fet el que esperàveu, per trobar errors. Canviar una cosa a la vegada és una tècnica clau per depurar també (es descriu a la referència anterior). Aquest mètode clàssic funciona juntament amb "dividir i conquerir": fer passos al bebè per afegir funcionalitats de forma incremental. Pot semblar un enfocament lent, però no és tan lent com intentar depurar una gran secció de codi que no funciona alhora.

Pas 4: més depuració

Hi ha moltes vegades que volem comprovar una secció de codi saltant la majoria de les línies de la mateixa, i després activant-les d’una en una mentre verificem que cadascuna funciona. Normalment, ho fem "comentant" les línies que volem ometre. Una extensió d’aquesta tècnica consisteix a tallar i enganxar un bloc de codi, comentar l’original (perquè no el perdem) i eliminar la còpia. C té quatre maneres senzilles de comentar línies. Si col·loqueu "//" davant d'una línia es comenta aquesta línia. Si tanqueu una o més línies a "/ *" i "* /" es comentarà tota una secció. Perquè aquest mètode funcioni eficaçment, no hi ha d’haver cap altre "* /" al bloc de codi (que no sigui el final). Per tant, una disciplina eficaç és utilitzar // per a comentaris dins de blocs de codi i reservar la construcció / * * / per a blocs de comentaris i per comentar seccions de codi. Col·loqueu "#if 0" al començament d'un bloc per fer comentaris i acabar la secció amb "#endif". És possible un control més selectiu mitjançant "#ifdef (identificador)" al començament d'un bloc i "#endif" al final. Si voleu compilar el bloc, utilitzeu "#define (identificador)" anterior al programa. Tingueu en compte que les cometes són només per posar èmfasi i no s’han d’incloure. La combinació d’aquestes tècniques hauria de proporcionar un enfocament útil per depurar els vostres programes ATtiny2313. Podeu trobar aquestes eines útils a mesura que avancem en aquesta instrucció.

Pas 5: fer servir el temporitzador / comptador 0 per emetre sons

Utilitzant el temporitzador / comptador 0 per emetre sons
Utilitzant el temporitzador / comptador 0 per emetre sons

L'ATtiny2313 té dos recursos de temporitzador / comptador de gran abast: un de 8 bits i un de 16 bits. Es poden configurar com a generadors de freqüència, controladors de modulació d'amplada d'impuls variable i registres de comparació de sortida. La funcionalitat completa d’aquestes es descriu a 49 pàgines del full de dades. Tanmateix, utilitzarem un cas senzill. Només s’utilitzarà el temporitzador / comptador 0 (el de 8 bits) i s’utilitzarà simplement com a generador de freqüència. La freqüència s’enviarà a un petit altaveu per produir un so. El temporitzador / comptador 0 es descriu completament a les pàgines 66 a 83 del full de dades ATtiny2313. Una lectura detallada d’aquest material proporcionarà una comprensió completa de Time / Counter 0. Afortunadament, només cal un mode bastant senzill, Clear Timer on Compare (CTC), per generar el to sonor que desitgem.

Per al mode que farem servir, el funcionament del temporitzador / comptador és senzill. Quan se selecciona un senyal de rellotge, el comptador comença a zero i augmenta cada pols del rellotge. Quan el valor del comptador arriba al valor del registre de comparació de sortida (TOP), el comptador es restableix a zero i es torna a iniciar el recompte. El bit de sortida associat amb el temporitzador / comptador es commuta per produir una sortida d'ona quadrada. Això condueix directament un transductor d’àudio per fer sonar un so. Un petit transductor d’àudio TDK produeix el so. Una unitat adequada és Digikey 445-2530-ND, TDK SD1209T3-A1 (en vaig fer servir una versió anterior). Aquesta és una versió de 3 volts; la versió de 5 volts també funcionarà, espero. Ho faig directament des del port de sortida de l’Attiny2313 i sembla que funciona bé. Sparkfun té un dispositiu similar.

Pas 6: Configuració del temporitzador / comptador 0

El mode CTC es pot utilitzar per alternar la sortida OC0A al pin 2, port B (pin físic 14). Per habilitar la sortida en aquest pin, cal configurar DDRB adequadament. El codi C per a això és com configurar una sortida per a un parpelleig. DDRB = _BV (PB2); // El port B2 és una sortida. El següent pas és proporcionar un senyal de rellotge i carregar el registre de comparació de sortida per produir una forma d'ona com a freqüència. L'equació de la freqüència resultant es dóna al full de dades (pàgina 72). Els termes de l’equació es descriuran a continuació. Aquí teniu l’equació: fOC0A = fclk_I / O / 2 * N * (1 + OCR0A) On fOC0A: = freqüència de sortida fclk_I / O: = freqüència de la font del rellotge N: = factor de preescala del rellotge OCR0A: = valor al registre de comparació de sortida per al temporitzador / Comptador 0A. Freqüència de la font del rellotge, fclk_I / O Aquesta és la freqüència del rellotge del sistema. El valor per defecte és 1 MHz. Els bits CS00, CS01 i CS02 de TCCR0B controlen aquesta selecció. Com que aquests bits també seleccionen el valor de N, es descriu a continuació. Valor de preescalador, NN és el valor utilitzat per dividir o preescalar el rellotge del sistema. Els bits CS00, CS01 i CS02 de TCCR0B controlen aquesta selecció. La taula 41 de la pàgina 81 del full de dades ATtiny2313 descriu les combinacions. Com que es desitja una freqüència propera a 1 kHz, es configuraran els bits CS00 i CS01 de TCCR0B. Tingueu en compte que establir els tres bits a 0, de manera que no seleccioneu cap font de rellotge, atura efectivament la sortida. Aquest és el mètode que s’utilitzarà per iniciar i aturar el so. TOP Valor, OCR0A Aquest valor és el valor TOP del comptador que es carrega al registre de comparació de sortida per al temporitzador / comptador 0A. Quan s’assoleix aquest valor, el comptador es restablirà a zero i el recompte començarà de nou fins que s’assoleixi TOP i el cicle es repeteixi. TOP es modifica fàcilment, de manera que la freqüència del pitit és fàcil de canviar. Com que es desitja una freqüència propera a 1 kHz, TOP es defineix a 7. (Tingueu en compte que el prescaler s'hauria pogut establir a 8 i TOP a 63. El mateix resultat és la vostra elecció.) Freqüència de sortida, fOC0A Utilitzant l'equació per calcular els resultats de la freqüència de sortida a: fOC0A = 1, 000, 000/2 * 64 * (1 + 7) fOC0A = 977Hz Tanca prou! Aquí teniu el codi per carregar el registre de comparació de sortida i el registre de control del comptador del temporitzador 0B. Consulteu el codi del programa real per entendre com s’utilitzen. OCR0A = 7; // Valor del temps TCCR0B = _BV (CS01) | _BV (CS00); // Selecciona rellotge intern & prescale = 8 TCCR0B = 0; // cap font de rellotge apaga el to Configuració del mode de temps / comptador Com a darrer detall, especificarem el mode de temporitzador / comptador que desitgem establint els bits adequats al registre de control de temporitzador / comptador 0A. El mode CTC es selecciona configurant el bit WGM01 tal com es descriu a la Taula 40, pàgina 79 del full de dades. Com que volem que la sortida commuti cada cicle, el bit COM0A0 també s'ha de configurar tal com es descriu a la Taula 34 a la pàgina 77. Aquí teniu el codi: TCCR0A = _BV (COM0A0) | _BV (WGM01); // Mode de commutació CTC

Pas 7: utilitzar quatre commutadors

A mesura que implementem el bip, ampliem el nostre maquinari i programari per gestionar quatre commutadors. Com que la sortida del comptador de temporitzador 0A és al port B, pin 2, no podem connectar més commutadors de manera seqüencial al port B. Una solució fàcil seria utilitzar el port D, però mantenim aquest port disponible per a altres funcions (potser un motor pas a pas). Així que anem a connectar els commutadors addicionals a PB3 i PB4. La lectura dels commutadors no canvia gaire. El valor de la màscara es canvia a 0x1B (00011011 binari) per emmascarar el bit 2 juntament amb el 5, 6 i 7. Es fa servir un truc més per crear un número binari de 4 bits. Desplaceu els bits 3 i 4 a la dreta un bit i combineu-los amb els bits 0 i 1 en un número binari de 4 bits. Aquesta és la sintaxi C estàndard per canviar i combinar bits, però pot ser que el principiant no conegui bé. but1a = (but1 i 0x03) | ((but1 i 0x18) >> 1); // però 1 té lectura de commutador En funcionament, el programa parpellejarà dos cops i emetrà dos sons per indicar la inicialització. Sempre que es canvien els commutadors, s'escoltarà el número que representen. Quan els commutadors no canvien, el LED parpellejarà. Per executar aquest codi, creeu un directori nou (anomeneu-lo Beep si voleu) i descarregueu-hi el següent fitxer de codi C. Canvieu el nom de Makefile2.txt per només Makefile. Amb WinAVR, compileu el programa i carregueu-lo al vostre Attiny2313.

Pas 8: Utilitzeu el constructor Switch / case

L'últim pas és "només programari": tal com es va prometre, implementarem la construcció del commutador / cas. Tot i que aquest exemple només mostra dues accions alternatives, hauria de quedar molt clar com utilitzar aquesta construcció per seleccionar una de les seccions de codi alternatives. En funcionament, aquest programa controla els commutadors i, si hi ha un canvi, emetrà un número sonor adequat si és senar; parpellejarà si el número és parell. No fa res tret que canviï un commutador.

Per executar aquest codi, creeu un directori nou (anomeneu-lo Canvia si voleu) i descarregueu-hi el següent fitxer de codi C i makefile. Canvieu el nom de Makefile3.txt per només Makefile. Amb WinAVR, compileu el programa i carregueu-lo al vostre Attiny2313.

Pas 9: Conclusió

Conclusió
Conclusió

Així que ja està! Ara ja sabeu com utilitzar els commutadors per controlar l'execució del vostre programa llegint-los i seleccionant una acció basada en la configuració del commutador. També sabeu com crear un to de so i també heu après alguna estratègia de depuració.

Si voleu comprovar la vostra comprensió, proveu de modificar l'últim programa per emetre un so amb un to alt si és parell, emetre un toc baix si és imparell i parpellejar el LED contínuament si no hi ha cap canvi als commutadors. torneu a la secció de depuració per obtenir ajuda.

Recomanat: