Innholdsfortegnelse:

Attiny85 Samtidig programmering eller gresskar med flerfargede øyne: 7 trinn
Attiny85 Samtidig programmering eller gresskar med flerfargede øyne: 7 trinn

Video: Attiny85 Samtidig programmering eller gresskar med flerfargede øyne: 7 trinn

Video: Attiny85 Samtidig programmering eller gresskar med flerfargede øyne: 7 trinn
Video: ПЕРВЫЕ ПОСЛЕВОЕННЫЕ ГОДЫ. ВОСТОЧНАЯ ПРУССИЯ. КАЛИНИНГРАД. ИСТОРИИ ПРОФЕССОРА. КОП ПО ВОЙНЕ 2024, Juli
Anonim

Av jumbleviewJumbleview.infoFølg Mer av forfatteren:

Skriket
Skriket
Skriket
Skriket
Utskifting av NiCd -batteri med ekstern strømforsyning
Utskifting av NiCd -batteri med ekstern strømforsyning
Utskifting av NiCd -batteri med ekstern strømforsyning
Utskifting av NiCd -batteri med ekstern strømforsyning
Digitalt kamerahåndtak
Digitalt kamerahåndtak
Digitalt kamerahåndtak
Digitalt kamerahåndtak

Om: Jeg jobber som programvareingeniør i et av Bay Area (California) selskaper. Når jeg har tid, liker jeg å programmere mikrokontrollere, bygge mekaniske leker og lage noen forbedringsprosjekter. Mer om jumbleview »

Dette prosjektet viser hvordan du kan kontrollere to 10 mm trefargede vanlige anode-lysdioder (flerfargede øyne til Pumpkin Halloween Glitter) med Attiny85-brikke. Målet med prosjektet er å introdusere leseren til kunsten med samtidig programmering og bruk av Adam Dunkels prototråder -bibliotek. Dette prosjektet forutsetter at leseren vet om AVR 8-biters kontrollere, kan skrive et C-program og har litt erfaring med Atmel studio.

Prosjektkode publisert på GitHub:

Rekvisita

Før du programmerer må du fortsatt bygge kretsen. Her er komponenter:

  • Attiny85 -kontroller (hvilken som helst elektronisk leverandør).
  • To trefargede 10 mm lysdioder med felles anode. Adafruit LED
  • Motstander 100 Ohm, 120 Ohm, 150 Ohm 0.125 eller 0.250 Wt (hvilken som helst elektronisk leverandør).
  • Six Pin header for AVR ISP interface. Kan lages av denne Adafruit -overskriften
  • Noe brødbrett eller trykt malbrett. Jeg brukte denne
  • AVR ISP MKII -grensesnitt og Atmel Studio 6.1 (Senere versjon skal også fungere).

Trinn 1: Skjær

Circut
Circut

Designet bruker fem chip -pins:

  • To pinner som brukes til å kontrollere anoder: hver LED -anode festet til den dedikerte pinnen.
  • Tre pinner festet (gjennom motstander) til LED -katoder (samme fargekatode for hver LED festet til samme pinne)

En vil spørre: hvorfor ikke bruke alle seks inn/ut -pinnene på brikken, slik at LED -anoder kobles direkte til +5 v, og hver katode vil ha sin dedikerte pinne? Det vil gjøre programmeringen grei. Akk, det er problemet: pin PB5 (RESET) er en svak pinne som kan levere ~ 2 mA av strømmen, mens det er behov for å ha ~ 20 mA.

Selvfølgelig kan man bygge transistorforsterker for denne svake pinnen, men jeg foretrekker selv når det er mulig å løse problemet gjennom koden.

Trinn 2: Timing Diagram

Tidsplan
Tidsplan

Tidsdiagram hjelper oss å forstå hva vi trenger å programmere.

De to øverste radene på diagrammet viser spenningsendring på LED -anoder. Spenning på pinner koblet til LED -anoder svinger med frekvens ~ 250 Hz. Denne spenningssvingningen for venstre LED er en motsetning til svingningen av høyre LED. Når spenningen på anoden er høy, kan tilsvarende LED være lys. Når den er lav, er tilsvarende LED mørk. Det betyr at hver LED kan være lys i løpet av 2 millisekunder og er mørkt i ytterligere 2 millisekunder. Fordi menneskelig øye har en viss treghet, er 250 Hz blinking ikke merkbar av observatøren. Nederste tre rader på diagrammet viser endring av spenning på pinner koblet til LED -katoder. La oss se på den første diagramkolonnen. Det viser saken når venstre LED er i rød farge og høyre LED i grønn farge. Her holder RØDE katoder seg lave mens venstre anode er høy, GRØN katode holder seg lav mens høyre anode er høy, og BLÅ katode holder seg lav hele tiden. Andre kolonner på diagrammet viser kombinasjoner av katode og anodespenning for forskjellige farger.

Som vi kan se er det gjensidig avhengighet av pins -tilstand. Uten noen rammeverk ville det ikke være lett å løse. Og det er der protothread -biblioteket kommer godt med.

Trinn 3: Programmering. Makroer og definisjoner

Programmering. Makroer og definisjoner
Programmering. Makroer og definisjoner

Eksempel i programmeringstrinn representerer litt forenklet versjon. Programmet blir forkortet, og noen symbolsk definisjon erstattet med eksplisitte konstanter.

La oss starte fra begynnelsen. Programmet inkluderer filer som kommer med Atmel Studio, samt prototrådbibliotekets overskrift. Deretter er det to makroer for å manipulere pins -nivåer og noen definisjoner for å gi logiske navn til pin -signaler. Så langt ikke noe spesielt.

Trinn 4: Programmering. Hovedløyfe

Programmering. Hovedløyfe
Programmering. Hovedløyfe

La oss deretter se på slutten for å se hva hovedprosedyren inneholder.

Funksjon hoved etter å ha gjort noen initialisering forblir i evig sløyfe. I den løkken gjør den neste trinn:

  • Påkaller protothread -rutine for venstre LED. Det endrer noen pins spenning.
  • Forsink to millisekunder. Det er ingen endring i pin -spenning.
  • Påkaller prototråd for riktig LED. Det endrer litt pin -spenning.
  • Gjør 2 MS forsinkelse. Det er ingen endring i pin -spenning.

Trinn 5: Programmering. Hjelpefunksjoner

Programmering. Hjelpefunksjoner
Programmering. Hjelpefunksjoner

Før vi begynner å diskutere prototråder, må vi se på noen hjelperfunksjoner. Først er det funksjoner for å angi en bestemt farge. De er enkle. Det er så mange slike funksjoner som antall støttede farger (syv) og en ekstra funksjon for å sette LED mørk (NoColor).

Og det er en annen funksjon som vil bli påkalt direkte av prototrådrutinen. Navnet er DoAndCountdown ().

Teknisk sett er bruk av en slik funksjon ikke obligatorisk, men jeg synes det var praktisk. Den har tre argumenter:

  • Peker til funksjonsinnstilling LED -farge (som RedColor eller GreenColor eller etc.)
  • Startverdi for omvendt teller: antall ganger hvor mange ganger denne funksjonen må påkalles på et bestemt prototrinnstadium.
  • Peker til revers teller. Det antas at når det er endring i fargen, er revers -telleren 0, så først vil iterasjonskoden tilordne den opprinnelige verdien til telleren. Etter hver iterasjonsteller reduseres.

Funksjon DoAndCountdown () returnerer verdien av revers teller.

Trinn 6: Programmering. Protothread rutiner

Programmering. Protothread rutiner
Programmering. Protothread rutiner

Og her er rammekjernen: protothread -rutine. For enkelhets skyld er eksemplet bare begrenset til tre trinn: for fargeendring til RØD, til GRØNN og til BLÅ.

Funksjon påkalles med to argumenter:

  • Peker til prototrådsstruktur. Denne strukturen ble initialisert av main før hovedsløyfen startet.
  • Peker til revers teller. Den ble satt til 0 av main før hovedsløyfen startet.

Funksjonssett spenninger for å gjøre venstre LED aktiv og starter deretter prototrådssegmentet. Dette segmentet er mellom makroer PT_BEGIN og PT_END. Inne er det en kode som i vårt tilfelle bare gjentar makroer PT_WAIT_UNTIL. Denne makroen utfører neste:

  • Påkallelse av funksjon DoAndCountdown. Det setter spenning på LED -katoder for å avgi en bestemt farge.
  • Returnerte resultat sammenlignet med 0. Hvis tilstanden er "falsk", går prototrådfunksjonen umiddelbart tilbake og gir kontroll til hovedsløyfen.
  • Når prototråden blir påkalt neste gang, kjører den igjen kode før PT_BEGIN, og hopper deretter direkte inne i PT_WAIT_UNTIL makroene som den returnerte forrige gang.
  • Slike handlinger gjentas til resultatet av DoAndCountdown er 0. I så fall er det ingen retur, programmet forblir i prototråden og kjører neste linje i koden. I vårt tilfelle er det neste PT_WAIT_UNTIL, men generelt sett kan det være nesten hvilken som helst C -kode.
  • Ved første utførelse av den andre PT_WAIT_UNTIL revers -telleren er 0, så prosedyre DoAndCountdown () setter den til den opprinnelige verdien. Andre makroer igjen vil bli utført 250 ganger til revers -telleren når 0.
  • Tilstanden for struct pt nullstilles så snart kontrollen når PT_END -makroer. Når protothread -funksjonen påkalles neste gang, starter prototreadsegmentet, utfør linje med koden rett etter PT_BEGIN.

Det er lignende prototråd rutine for riktig LED. I vårt eksempel håndhever den bare forskjellig rekkefølge av farger, men hvis vi kan gjøre det helt annerledes: det er ingen tett kobling mellom venstre og høyre LED -rutine.

Trinn 7: Intern

Interne
Interne

Hele programmet er mindre enn 200 linjer med kode (med kommentarer og tomme linjer) og tar mindre enn 20% av Attiny85 -kodeminnet. Om nødvendig er det mulig å bruke flere flere prototrådrutiner her og tilordne dem mye mer komplisert logikk.

Protothreads -biblioteket er den enkleste formen for samtidig programmering av datamaskiner. Samtidig programmering er en tilnærming som gjør det mulig å dele programmet i logiske deler: noen ganger kalles de coroutines, noen ganger tråd, noen ganger oppgaver. Prinsippet er at hver slik oppgave kan dele den samme prosessorkraften mens den beholder koden mer eller mindre lineær og uavhengig av andre deler. Oppgaver fra logisk synspunkt kan utføres samtidig.

For avanserte systemkontroller av slike oppgaver utført enten av operativsystemets kjerne eller av språkkjøringstid som er innebygd i kjørbar av kompilatoren. Men i tilfelle prototråder styrer applikasjonsprogrammereren det manuelt ved å bruke prototråder -makrobiblioteket i oppgaverutiner og påkaller slike rutiner (vanligvis ut av hovedløkken).

Du vil sannsynligvis vite hvordan prototråd faktisk fungerer? Hvor skjuler magien seg? Protothreads er avhengige av spesiell C -språkfunksjon: det faktum at C -bytte -saksuttalelse kan være innebygd i hvis eller en annen blokk (som mens eller for). Detaljer finner du på Adam Dunkels nettsted

Elektronikkinterne i dette prosjektet er veldig enkle. Bildet ovenfor gir deg en pekepinn. Jeg er sikker på at du kan gjøre det bedre.

Anbefalt: