Indholdsfortegnelse:

Attiny85 Samtidig programmering eller græskar med flerfarvede øjne: 7 trin
Attiny85 Samtidig programmering eller græskar med flerfarvede øjne: 7 trin

Video: Attiny85 Samtidig programmering eller græskar med flerfarvede øjne: 7 trin

Video: Attiny85 Samtidig programmering eller græskar med flerfarvede øjne: 7 trin
Video: ПЕРВЫЕ ПОСЛЕВОЕННЫЕ ГОДЫ. ВОСТОЧНАЯ ПРУССИЯ. КАЛИНИНГРАД. ИСТОРИИ ПРОФЕССОРА. КОП ПО ВОЙНЕ 2024, November
Anonim

Af jumbleviewJumbleview.infoFølg mere af forfatteren:

Skriget
Skriget
Skriget
Skriget
Udskiftning af NiCd -batteri med ekstern strømforsyning
Udskiftning af NiCd -batteri med ekstern strømforsyning
Udskiftning af NiCd -batteri med ekstern strømforsyning
Udskiftning af NiCd -batteri med ekstern strømforsyning
Digitalt kamerahåndtag
Digitalt kamerahåndtag
Digitalt kamerahåndtag
Digitalt kamerahåndtag

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

Circut
Circut

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

Tidsplan
Tidsplan

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

Programmering. Makroer og definitioner
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

Programmering. Hovedsløjfe
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

Programmering. Hjælpefunktioner
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

Programmering. Protothread rutiner
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

Interne
Interne

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: