Taula de continguts:

Programació simultània d'Attiny85 o carbassa amb ulls multicolors: 7 passos
Programació simultània d'Attiny85 o carbassa amb ulls multicolors: 7 passos

Vídeo: Programació simultània d'Attiny85 o carbassa amb ulls multicolors: 7 passos

Vídeo: Programació simultània d'Attiny85 o carbassa amb ulls multicolors: 7 passos
Vídeo: Modulo BOOTLOADER para MICRONTROLADORES de ARDUINO (Mega, Uno, Nano, Attiny ), Circuito gratis! DIY 2024, Desembre
Anonim

Per jumbleviewJumbleview.info Segueix més de l'autor:

El Crit
El Crit
El Crit
El Crit
Substitució de la bateria NiCd per una font d'alimentació externa
Substitució de la bateria NiCd per una font d'alimentació externa
Substitució de la bateria NiCd per una font d'alimentació externa
Substitució de la bateria NiCd per una font d'alimentació externa
Mànec de càmera digital
Mànec de càmera digital
Mànec de càmera digital
Mànec de càmera digital

Quant a: Treballo com a enginyer de programari en una de les empreses de Bay Area (Califòrnia). Sempre que tinc temps m’agrada programar microcontroladors, construir joguines mecàniques i fer alguns projectes de millora de la llar. Més informació sobre jumbleview »

Aquest projecte mostra com controlar dos LED d’ànode comú de tres colors de 10 mm (ulls multicolors de Pumpkin Halloween Glitter) amb xip Attiny85. L’objectiu del projecte és introduir el lector en l’art de la programació simultània i en l’ús de la biblioteca de fils de prototipus Adam Dunkels. Aquest projecte suposa que el lector coneix els controladors AVR de 8 bits, pot escriure algun programa C i té certa experiència amb Atmel studio.

Codi del projecte publicat a GitHub:

Subministraments

Abans de programar encara cal construir el circuit. Aquí hi ha components:

  • Controlador Attiny85 (qualsevol proveïdor electrònic).
  • Dos LED de 10 mm de tres colors amb ànode comú. LEDs Adafruit
  • Resistències de 100 Ohm, 120 Ohm, 150 Ohm 0,125 o 0,250 Wt (qualsevol proveïdor electrònic).
  • Capçalera de sis pins per a la interfície ISP AVR. Es pot fer amb aquesta capçalera d'Adafruit
  • Alguna taula de pa o tauler de plantilla imprès. He utilitzat aquest
  • Interfície AVR ISP MKII i Atmel Studio 6.1 (la versió posterior també hauria de funcionar).

Pas 1: Circut

Circut
Circut

El disseny utilitza cinc pins de xip:

  • Dos pins utilitzats per controlar els ànodes: cada ànode LED connectat al pin dedicat.
  • Tres pins connectats (mitjançant resistències) als càtodes LED (el càtode del mateix color de cada led connectat al mateix pin)

Es preguntaria: per què no s'utilitzen els sis pins d'entrada / sortida del xip perquè els ànodes LED es connectin directament a +5 v i cada càtode tingui el seu pin dedicat? Això farà que la programació sigui senzilla. Per desgràcia, hi ha el problema: el pin PB5 (RESET) és un pin feble capaç de proporcionar només ~ 2 mA del corrent, mentre que cal tenir ~ 20 mA.

Per descomptat, es pot construir un amplificador de transistors per a aquest pin feble, però jo sempre que sigui possible prefereixo resoldre el problema mitjançant el codi.

Pas 2: Diagrama de temps

Diagrama de temps
Diagrama de temps

El diagrama de temps ens ajuda a entendre què hem de programar.

A les dues files superiors del diagrama es mostra el canvi de voltatge dels ànodes LED. La tensió dels pins connectats a ànodes LED oscil·la amb una freqüència de ~ 250 Hz. Aquesta oscil·lació de tensió per al LED esquerre és un contrari a l'oscil·lació del LED dret. Quan el voltatge de l'ànode és elevat, el LED corresponent pot ser brillant. Quan està baix, el LED corresponent és fosc. Això significa que cada LED pot ser brillant durant un interval de 2 mil·lisegons i que estigui fosc durant 2 mil·lisegons més. Com que l’ull humà té certa inèrcia, l’observador no nota els parpelleigs de 250 Hz. Les tres files inferiors del diagrama mostren el canvi de tensió dels pins connectats als càtodes dels LEDs. Vegem la primera columna del diagrama. Mostra el cas quan el LED esquerre és de color vermell i el LED dret de color verd. Aquí els càtodes VERMELL es mantenen baixos mentre l’ànode esquerre és alt, el càtode VERD es manté baix mentre l’ànode dret és alt i el càtode BLAU es manté baix tot el temps. Altres columnes del diagrama mostren combinacions de tensió de càtode i ànode per a diversos colors.

Com podem veure, hi ha interdependència en l'estat dels pins. Sense algun marc no seria fàcil de resoldre. I aquí és on és útil la biblioteca de fil de prototips.

Pas 3: Programació. Macros i definicions

Programació. Macros i definicions
Programació. Macros i definicions

Un exemple en els passos de programació representa una versió lleugerament simplificada. El programa s’escurça i es substitueix alguna definició simbòlica per constants explícites.

Comencem des del principi. El programa inclou fitxers que vénen amb Atmel Studio i la capçalera de la biblioteca de protothread. A continuació, hi ha dues macros per manipular els nivells dels pins i algunes definicions per donar noms lògics als pinyals. De moment res especial.

Pas 4: Programació. Bucle principal

Programació. Bucle principal
Programació. Bucle principal

A continuació, vegem el final per veure què conté el procediment principal.

La funció principal després de fer una inicialització es manté al bucle per sempre. En aquest bucle fa els passos següents:

  • Invoca la rutina de fil de prototips per al LED esquerre. Canvia la tensió d'alguns pins.
  • Feu un retard de dos mil·lisegons. No hi ha canvis en la tensió dels pins.
  • Invoca fil de prototips per al LED adequat. Canvia una mica de tensió dels pins.
  • Feu un retard de 2 MS. No hi ha canvis en la tensió dels pins.

Pas 5: programació. Funcions auxiliars

Programació. Funcions auxiliars
Programació. Funcions auxiliars

Abans de començar a discutir els fils de prototips, hem de mirar algunes funcions d’ajuda. Primer hi ha funcions per definir un color concret. Són directes. Hi ha tantes funcions com el nombre de colors compatibles (set) i una funció més per ajustar el LED fosc (NoColor).

I hi ha una funció més que serà invocada directament per la rutina de protothread. El seu nom és DoAndCountdown ().

Tècnicament l'ús d'aquesta funció no és obligatori, però em va semblar convenient. Té tres arguments:

  • Punter per ajustar la funció de color del LED (com RedColor o GreenColor o etc.)
  • Valor inicial del comptador invers: nombre de vegades que s’ha d’invocar aquesta funció en una etapa de fil de prototip particular.
  • Punter al comptador invers. Se suposa que quan hi ha un canvi de color, el comptador invers és 0, de manera que al principi el codi d'iteració s'assignarà a aquest valor inicial del comptador. Després de cada comptador d'iteracions es decrementa.

La funció DoAndCountdown () retorna el valor del comptador invers.

Pas 6: Programació. Rutines Protothread

Programació. Rutines Protothread
Programació. Rutines Protothread

I aquí teniu el nucli del marc: rutina de protothread. Per simplificar, l'exemple es limita només a tres passos: per canviar el color a VERMELL, VERD i BLAU.

La funció s'invoca amb dos arguments:

  • Punter a l'estructura del fil de prototips. Aquesta estructura va ser inicialitzada per main abans de començar el bucle principal.
  • Punter al comptador invers. Es va establir a 0 per main abans de començar el bucle principal.

La funció estableix tensions perquè el LED esquerre estigui actiu i, a continuació, comenci el segment de fil de prototips. Aquest segment es troba entre les macros PT_BEGIN i PT_END. A dins hi ha algun codi que en el nostre cas només repeteix macros PT_WAIT_UNTIL. Aquesta macro funciona a continuació:

  • Invocació de la funció DoAndCountdown. Això defineix el voltatge dels càtodes LED per emetre un color concret.
  • Resultat retornat en comparació amb 0. Si la condició és "falsa", la funció de fil de protecció torna immediatament i dóna control al bucle principal.
  • Quan es procedeix a protothread la propera vegada, torna a executar codi abans de PT_BEGIN i després salta directament dins de les macros PT_WAIT_UNTIL de les quals va tornar l'última vegada.
  • Aquestes accions es repeteixen fins que el resultat de DoAndCountdown és 0. En aquest cas, no hi ha retorn, el programa es manté en el fil de prototips i executa la següent línia del codi. En el nostre cas, és PT_WAIT_UNTIL següent, però en general pot ser gairebé qualsevol codi C.
  • A l'execució inicial del segon comptador invers PT_WAIT_UNTIL és 0, de manera que el procediment DoAndCountdown () el defineix al valor inicial. Les segones macros es tornaran a executar 250 vegades fins que el comptador invers no arribi a 0.
  • L'estat de l'estructura pt es restableix quan el control arriba a les macros PT_END. Quan s'invoqui la funció de fil de prototips la propera vegada que comenci el segment de fil de filotel, executeu la línia del codi just després de PT_BEGIN.

Hi ha una rutina de fil de prototips similar per al LED adequat. En el nostre exemple, només aplica un ordre de colors diferent, però si ho podem fer de manera totalment diferent: no hi ha un acoblament estret entre la rutina de LED esquerra i dreta.

Pas 7: Internes

Internes
Internes

Tot el programa és inferior a 200 línies de codi (amb comentaris i línies buides) i ocupa menys del 20% de la memòria de codi Attiny85. Si cal, aquí és possible utilitzar diverses rutines de fil de prototips més i assignar-los una lògica molt més complicada.

La biblioteca Protothreads és la forma més senzilla de programació simultània per ordinador. La programació simultània és un enfocament que permet dividir el programa en parts lògiques: de vegades es diuen coroutines, de vegades fil, de vegades tasques. El principi és que cada tasca pot compartir la mateixa potència del processador mantenint el codi més o menys lineal i independent de la resta de parts. Les tasques des del punt de vista lògic es poden executar simultàniament.

Per als sistemes avançats de control d'aquestes tasques realitzades pel nucli del sistema operatiu o pel temps d'execució del llenguatge incrustat a l'executable pel compilador. Però, en cas de protothreads, el programador ho controla manualment mitjançant l'ús de la biblioteca de macros de protothreads a les rutines de tasques i invocant aquestes rutines (normalment fora del bucle principal).

Probablement voleu saber com funciona el fil de prototips? On s’amaga la màgia? Els filaments de protecció es basen en una característica especial del llenguatge C: el fet que la declaració de majúscules i minúscules C es pugui incloure en un bloc de si o en algun altre (com mentre o per a). Detalls que podeu trobar al lloc d’Adam Dunkels

Els components electrònics interns d’aquest projecte són molt senzills. La foto superior us dóna una pista. Estic segur que ho podeu fer millor.

Recomanat: