Indholdsfortegnelse:
- Forbrugsvarer
- Trin 1: Skær
- Trin 2: Timing Diagram
- Trin 3: Programmering. Makroer og definitioner
- Trin 4: Programmering. Hovedsløjfe
- Trin 5: Programmering. Hjælpefunktioner
- Trin 6: Programmering. Protothread rutiner
- Trin 7: Intern
Video: Attiny85 Samtidig programmering eller græskar med flerfarvede øjne: 7 trin
2024 Forfatter: John Day | [email protected]. Sidst ændret: 2024-01-30 08:25
Af jumbleviewJumbleview.infoFølg mere af forfatteren:
Om: Jeg arbejder som softwareingeniør i en af Bay Area (Californien) virksomheder. Når jeg har tid, kan jeg lide at programmere mikrokontroller, bygge mekanisk legetøj og lave nogle forbedringsprojekter. Mere om jumbleview »
Dette projekt viser, hvordan man styrer to 10 mm trefarvede almindelige anode-lysdioder (flerfarvede øjne af Pumpkin Halloween Glitter) med Attiny85-chip. Målet med projektet er at introducere læseren til kunsten med samtidig programmering og i brugen af Adam Dunkels prototråde bibliotek. Dette projekt forudsætter, at læseren kender til AVR 8-bit controllere, kan skrive noget C-program og har en vis erfaring med Atmel studio.
Projektkode offentliggjort på GitHub:
Forbrugsvarer
Inden programmering skal man stadig bygge kredsløbet. Her er komponenter:
- Attiny85 controller (enhver elektronisk leverandør).
- To trefarvede 10 mm lysdioder med fælles anode. Adafruit LED'er
- Modstande 100 Ohm, 120 Ohm, 150 Ohm 0.125 eller 0.250 Wt (enhver elektronisk leverandør).
- Six Pin header til AVR ISP interface. Kan laves ud af denne Adafruit header
- Noget brødbræt eller trykt skabelonbræt. Jeg brugte denne
- AVR ISP MKII interface og Atmel Studio 6.1 (Senere version skulle også fungere).
Trin 1: Skær
Designet bruger fem chip pins:
- To ben bruges til at styre anoder: hver LED -anode fastgjort til den dedikerede pin.
- Tre stifter fastgjort (gennem modstande) til lysdiodernes katoder (den samme farvekatode for hver led fastgjort til den samme pin)
Man ville spørge: hvorfor ikke bruge alle seks ind/ud -ben på chippen, så LED -anoder tilsluttes direkte til +5 v, og hver katode har sin dedikerede pin? Det vil gøre programmeringen ligetil. Ak, der er problemet: pin PB5 (RESET) er en svag pin, der kan levere ~ 2 mA af strømmen, mens der er behov for at have ~ 20 mA.
Selvfølgelig kan man bygge en transistorforstærker til denne svage stift, men jeg foretrækker selv, når det er muligt, at løse problemet gennem koden.
Trin 2: Timing Diagram
Tidsdiagram hjælper os med at forstå, hvad vi skal programmere.
De to øverste rækker på diagrammet viser spændingsændring på LED -anoder. Spænding på stifter forbundet til LED -anoder svinger med frekvens ~ 250 Hz. Denne spændingsoscillation for venstre LED er en modsætning til oscillation af højre LED. Når spændingen på anoden er høj, kan den tilsvarende LED lyse. Når den er lav, er den tilsvarende LED mørk. Det betyder, at hver LED kan være lys i løbet af 2 millisekunder interval og er mørk i yderligere 2 millisekunder. Fordi det menneskelige øje har en vis inerti, er 250 Hz blink ikke bemærkelsesværdigt for observatøren. Nederste tre rækker på diagrammet viser ændring af spænding på stifter, der er forbundet til LED -katoder. Lad os se på den første diagramkolonne. Det viser sagen, når venstre LED er i rød farve og højre LED i grøn farve. Her forbliver RØDE katoder lave, mens venstre anode er høj, GRØN katode forbliver lav, mens højre anode er høj, og BLÅ katode forbliver lav hele tiden. Andre kolonner på diagrammet viser kombinationer af katode og anodespænding for forskellige farver.
Som vi kan se, er der indbyrdes afhængighed af stifternes tilstand. Uden nogle rammer ville det ikke være let at løse. Og det er her, protothread -bibliotek er praktisk.
Trin 3: Programmering. Makroer og definitioner
Eksempel i programmeringstrin repræsenterer en lidt forenklet version. Programmet forkortes, og en eller anden symbolsk definition erstattes med eksplicitte konstanter.
Lad os starte forfra. Programmet indeholder filer, der kommer med Atmel Studio samt prototread bibliotekets overskrift. Dernæst er der to makroer til at manipulere pins -niveauer og nogle definitioner for at give logiske navne til pin -signaler. Indtil videre ikke noget særligt.
Trin 4: Programmering. Hovedsløjfe
Lad os derefter se på slutningen for at se, hvad hovedproceduren indeholder.
Funktionen vigtigste efter at have foretaget nogle initialisering forbliver i evigt loop. I den løkke foretager det de næste trin:
- Påkalder prototråd rutine til venstre LED. Det ændrer nogle pins spænding.
- Gør to millisekunder forsinket. Der er ingen ændring i pin spænding.
- Påkalder prototråd til den rigtige LED. Det ændrer noget pin spænding.
- Lav 2 MS forsinkelse. Der er ingen ændring i pin spænding.
Trin 5: Programmering. Hjælpefunktioner
Inden vi begynder at diskutere prototråde, skal vi se på nogle hjælperfunktioner. Først er der funktioner til at indstille en bestemt farve. De er ligetil. Der er lige så mange sådanne funktioner som antallet af understøttede farver (syv) og en funktion mere til at indstille LED mørk (NoColor).
Og der er endnu en funktion, som direkte vil blive påberåbt af prototråd rutine. Dens navn er DoAndCountdown ().
Teknisk set er brug af en sådan funktion ikke obligatorisk, men jeg fandt det praktisk. Det har tre argumenter:
- Markør til funktionsindstilling LED -farve (som RedColor eller GreenColor eller etc.)
- Startværdi af omvendt tæller: antallet af, hvor mange gange denne funktion skal påberåbes på et bestemt prototread -trin.
- Markør til omvendt tæller. Det antages, at når der er ændring i farven, er omvendt tæller 0, så i første omgang vil iterationskoden tildele denne tæller startværdi. Efter hver iterationstæller er dekrementeret.
Funktion DoAndCountdown () returnerer værdien af revers tæller.
Trin 6: Programmering. Protothread rutiner
Og her er ramme kerne: protothread rutine. For enkelthedens skyld er eksemplet kun begrænset til tre trin: for farveændring til RØD, til GRØN og til BLÅ.
Funktionen påberåbes med to argumenter:
- Markør til prototrådsstruktur. Denne struktur blev initialiseret af main, inden hovedsløjfen startede.
- Markør til omvendt tæller. Det blev indstillet til 0 af main, inden hovedsløjfen startede.
Funktionsindstil spændinger for at gøre venstre LED aktiv og starter derefter prototrådssegmentet. Dette segment er mellem makroer PT_BEGIN og PT_END. Inde er der en kode, som i vores tilfælde kun gentager makroer PT_WAIT_UNTIL. Denne makro udfører næste:
- Tilkaldelse af funktion DoAndCountdown. Det sætter spænding på LED -katoder til at udsende særlig farve.
- Returneret resultat sammenlignet med 0. Hvis tilstanden er 'falsk' prototrådsfunktion vender straks tilbage og giver kontrol til hovedsløjfen.
- Når prototråden påberåbes næste gang, udfører den igen kode før PT_BEGIN, og hopper derefter direkte inde i PT_WAIT_UNTIL -makroerne, hvorfra den vendte tilbage sidste gang.
- Sådanne handlinger gentages indtil resultatet af DoAndCountdown er 0. I så fald er der ingen retur, forbliver programmet i prototråden og udfører næste linje i koden. I vores tilfælde er det næste PT_WAIT_UNTIL, men generelt kan det være næsten enhver C -kode.
- Ved første udførelse af den anden PT_WAIT_UNTIL reverse tæller er 0, så procedure DoAndCountdown () indstiller den til den oprindelige værdi. Anden makro igen vil blive udført 250 gange, indtil revers tæller når 0.
- Tilstanden for struct pt nulstilles, så snart kontrollen når PT_END -makroer. Når protothread -funktion påkaldes næste gang prototreadsegment starter, udfør linje af koden lige efter PT_BEGIN.
Der er lignende prototråd rutine for den rigtige LED. I vores eksempel håndhæver den bare forskellige farverækkefølge, men hvis vi kan gøre det helt anderledes: der er ingen tæt kobling mellem venstre og højre LED -rutine.
Trin 7: Intern
Hele programmet er mindre end 200 linjer kode (med kommentarer og tomme linjer) og tager mindre end 20% af Attiny85 kodehukommelse. Hvis det er nødvendigt, er det muligt at bruge flere flere prototreadrutiner her og tildele dem meget mere kompliceret logik.
Protothreads bibliotek er den enkleste form for samtidig programmering af computere. Samtidig programmering er en tilgang, der gør det muligt at opdele programmet i logiske dele: nogle gange kaldes de coroutines, nogle gange tråd, nogle gange opgaver. Princippet er, at hver sådan opgave kan dele den samme processorkraft og samtidig beholde koden mere eller mindre lineær og uafhængig af andre dele. Opgaver ud fra et logisk synspunkt kan udføres samtidigt.
For avancerede systemkontroller af sådanne opgaver udført enten af operativsystemets kerne eller af sprogkørselstid, der er integreret i eksekverbar af compiler. Men i tilfælde af prototråde styrer applikationsprogrammereren det manuelt ved at bruge prototråde -makrobiblioteket i opgaverutiner og påberåber sådanne rutiner (normalt uden for hovedsløjfen).
Du vil sikkert gerne vide, hvordan protothread rent faktisk fungerer? Hvor gemmer sig magien? Protothreads er afhængige af en særlig C -sprogfunktion: det faktum, at C -switch -sagserklæring kan være integreret i hvis eller en anden blok (f.eks. Mens eller for). Detaljer kan du finde på Adam Dunkels websted
Elektronikinterne i dette projekt er meget enkle. Billedet ovenfor giver dig et fingerpeg. Jeg er sikker på, at du kan gøre det bedre.
Anbefalede:
Et IoT Halloween græskar - Kontrol -LED'er med en Arduino MKR1000 og Blynk App ???: 4 trin (med billeder)
Et IoT Halloween græskar | Kontrol -LED'er Med en Arduino MKR1000 og Blynk App ???: Hej alle sammen, For et par uger siden var det Halloween og efter traditionen skåret jeg et dejligt græskar til min altan. Men da jeg havde mit græskar udendørs, indså jeg, at det var ret irriterende at skulle ud hver aften for at tænde lyset. Og jeg
Halloween græskar med et bevægeligt animatronisk øje - Dette græskar kan rulle sit øje !: 10 trin (med billeder)
Halloween græskar med et bevægeligt animatronisk øje | Dette græskar kan rulle sit øje !: I denne instruktør lærer du, hvordan du laver et Halloween -græskar, der skræmmer alle, når øjet bevæger sig. Juster ultralydssensorens triggerafstand til den rigtige værdi (trin 9), og dit græskar vil forstene alle, der tør tage cand
Musikreaktive flerfarvede LED -lys - Arduino lyddetekteringssensor - RGB LED Strip: 4 trin
Musikreaktive flerfarvede LED -lys | Arduino lyddetekteringssensor | RGB LED Strip: Projekt med musikreaktive flerfarvede LED-lys. I dette projekt blev der brugt en simpel 5050 RGB LED -strip (ikke den adresserbare LED WS2812), Arduino lyddetekteringssensor og 12V adapter
Serielt LED -lys ved hjælp af flerfarvede LED'er: 3 trin (med billeder)
Serielt LED -lys ved hjælp af flerfarvede LED'er: Et serielt LED -lys er ikke så dyrt, men hvis du er DIY -elsker (en hobbyist) som mig, kan du lave dine egne serielle LED'er, og det er billigere end det lys, der er tilgængeligt på markedet. Så, i dag kan jeg Jeg skal lave mit eget serielle LED -lys, der kører på 5 vol
Tilpassede glødende flerfarvede Mickey -ører: 9 trin (med billeder)
Custom Glowing Multicolored Mickey Ears: Jeg ville dele et lille projekt, jeg arbejdede på for min kones og min sidste Disneyland -tur! Hun har disse smukke tilpassede Minnie Mouse ører lavet af blomster og guldtråd, så jeg tænkte, hvorfor skulle jeg ikke lave mine egne Mickey Mouse ører lidt mere magisk