Innehållsförteckning:

Attiny85 Samtidig programmering eller pumpa med flerfärgade ögon: 7 steg
Attiny85 Samtidig programmering eller pumpa med flerfärgade ögon: 7 steg

Video: Attiny85 Samtidig programmering eller pumpa med flerfärgade ögon: 7 steg

Video: Attiny85 Samtidig programmering eller pumpa med flerfärgade ögon: 7 steg
Video: ПЕРВЫЕ ПОСЛЕВОЕННЫЕ ГОДЫ. ВОСТОЧНАЯ ПРУССИЯ. КАЛИНИНГРАД. ИСТОРИИ ПРОФЕССОРА. КОП ПО ВОЙНЕ 2024, Juli
Anonim

Av jumbleviewJumbleview.infoFölj mer av författaren:

Skriket
Skriket
Skriket
Skriket
Byte av NiCd -batteri med extern strömförsörjning
Byte av NiCd -batteri med extern strömförsörjning
Byte av NiCd -batteri med extern strömförsörjning
Byte av NiCd -batteri med extern strömförsörjning
Digitalkamerahandtag
Digitalkamerahandtag
Digitalkamerahandtag
Digitalkamerahandtag

Om: Jag arbetar som mjukvaruutvecklare i ett av Bay Area (Kalifornien) företag. När jag har tid tycker jag om att programmera mikrokontroller, bygga mekaniska leksaker och göra några hemförbättringsprojekt. Mer om jumbleview »

Detta projekt visar hur man styr två 10 mm trefärgade vanliga anod-lysdioder (mångfärgade ögon av Pumpkin Halloween Glitter) med Attiny85-chip. Målet med projektet är att introducera läsaren till konsten att samtidigt programmera och använda Adam Dunkels prototrådsbibliotek. Detta projekt förutsätter att läsaren känner till AVR 8-bitars styrenheter, kan skriva något C-program och har viss erfarenhet av Atmel studio.

Projektkod publicerad på GitHub:

Tillbehör

Innan du programmerar behöver du fortfarande bygga kretsen. Här är komponenter:

  • Attiny85 -styrenhet (valfri elektronisk leverantör).
  • Två trefärgs 10 mm lysdioder med gemensam anod. Adafruit lysdioder
  • Motstånd 100 Ohm, 120 Ohm, 150 Ohm 0.125 eller 0.250 Wt (vilken elektronisk leverantör som helst).
  • Six Pin -header för AVR ISP -gränssnitt. Kan göras av denna Adafruit -rubrik
  • Något brödbräda eller tryckt mallbräda. Jag använde den här
  • AVR ISP MKII -gränssnitt och Atmel Studio 6.1 (senare version bör också fungera).

Steg 1: Cirkulera

Circut
Circut

Designen använder fem chipstift:

  • Två stift som används för att styra anoder: varje LED -anod ansluten till den specifika stiftet.
  • Tre stift fästa (genom motstånd) till lysdiodernas katoder (samma färgkatod för varje lysdiod fäst på samma stift)

Man skulle fråga: varför inte använda alla sex in/ut -stiften på chipet så att LED -anoder ansluts direkt till +5 v och varje katod har sin dedikerade stift? Det gör programmeringen enkel. Ack, det är problemet: stift PB5 (ÅTERSTÄLL) är en svag stift som kan ge bara ~ 2 mA av strömmen, medan det är nödvändigt att ha ~ 20 mA.

Självklart kan man bygga transistorförstärkare för denna svaga stift men jag själv föredrar närhelst det är möjligt att lösa problemet genom koden.

Steg 2: Tidsdiagram

Tidsdiagram
Tidsdiagram

Tidsdiagram hjälper oss att förstå vad vi behöver programmera.

De två översta raderna på diagrammet visar spänningsändring på LED -anoder. Spänning på stift anslutna till LED -anoder oscillerar med frekvens ~ 250 Hz. Denna spänningsoscillation för vänster LED är en motsats till oscillationen av höger LED. När spänningen på anoden är hög kan motsvarande LED vara ljus. När den är låg är motsvarande lysdiod mörk. Det betyder att varje LED kan vara ljus under 2 millisekunder intervall och är mörk under ytterligare 2 millisekunder. Eftersom det mänskliga ögat har en viss tröghet märks inte 250 Hz blinkande av observatören. Under tre rader i diagrammet visas förändring av spänningen på stift som är anslutna till lysdiodernas katoder. Låt oss titta på den första diagramkolumnen. Det visar fallet när vänster LED är i röd färg och höger LED i grön färg. Här förblir RÖDA katoder låga medan vänster anod är hög, GRÖN katod förblir låg medan höger anod är hög och BLÅ katod förblir låg hela tiden. Andra kolumner på diagrammet visar kombinationer av katod och anodspänning för olika färger.

Som vi kan se finns det ett beroende av stiftets tillstånd. Utan någon ram skulle det inte vara lätt att lösa. Och det är där prototrådsbiblioteket kommer till nytta.

Steg 3: Programmering. Makron och definitioner

Programmering. Makron och definitioner
Programmering. Makron och definitioner

Exempel i programmeringssteg representerar något förenklad version. Programmet förkortas och någon symbolisk definition ersätts med tydliga konstanter.

Låt oss börja från början. Programmet innehåller filer som kommer med Atmel Studio samt prototråds bibliotekets rubrik. Därefter finns två makron för att manipulera stiftnivåer och några definitioner för att ge logiska namn till stiftsignaler. Än så länge inget speciellt.

Steg 4: Programmering. Huvudslinga

Programmering. Huvudslinga
Programmering. Huvudslinga

Låt oss sedan titta på slutet för att se vad huvudförfarandet innehåller.

Funktionen main efter att ha gjort några initialiseringar stannar i forever loop. I den slingan gör det nästa steg:

  • Återkallar prototrådsrutin för vänster LED. Det ändrar några stift spänning.
  • Fördröj två millisekunder. Det finns ingen förändring i stiftspänningen.
  • Återkallar prototråd för rätt LED. Det ändrar viss stiftspänning.
  • Gör 2 MS fördröjning. Det finns ingen förändring i stiftspänningen.

Steg 5: Programmering. Hjälpfunktioner

Programmering. Hjälpfunktioner
Programmering. Hjälpfunktioner

Innan vi börjar diskutera prototrådar måste vi titta på några hjälpfunktioner. Först finns det funktioner för att ställa in särskild färg. De är raka. Det finns lika många sådana funktioner som antalet stödda färger (sju) och ytterligare en funktion för att ställa in LED mörk (NoColor).

Och det finns ytterligare en funktion som kommer att aktiveras direkt av prototrådsrutinen. Dess namn är DoAndCountdown ().

Tekniskt sett är det inte obligatoriskt att använda en sådan funktion men jag tyckte att det var bekvämt. Den har tre argument:

  • Pekare till funktionsinställning LED -färg (som RedColor eller GreenColor eller etc.)
  • Initialvärde för omvänd räknare: antalet hur många gånger denna funktion måste anropas vid ett särskilt prototrådssteg.
  • Pekare till backräknare. Det antas att när det sker en förändring i färgen så är backräknaren 0, så till en början kommer iterationskoden att tilldela denna räknare initialvärde. Efter varje iterationsräknare minskas.

Funktion DoAndCountdown () returnerar värdet på omvänd räknare.

Steg 6: Programmering. Protothread -rutiner

Programmering. Protothread -rutiner
Programmering. Protothread -rutiner

Och här är ramkärnan: prototrådsrutin. För enkelhetens skull begränsade exemplet endast till tre steg: för färgbyte till RÖD, till GRÖN och till BLÅ.

Funktionen åberopas med två argument:

  • Pekare till prototrådsstruktur. Den strukturen initierades av main innan huvudslingan startade.
  • Pekare till backräknare. Den var inställd på 0 av main innan huvudslingan startade.

Funktionsinställda spänningar för att göra vänster LED aktiv och startar sedan prototrådssegmentet. Detta segment ligger mellan makron PT_BEGIN och PT_END. Inuti finns det en kod som i vårt fall bara upprepar makron PT_WAIT_UNTIL. Dessa makron utför följande:

  • Åkallande av funktion DoAndCountdown. Det sätter spänning på LED -katoder för att avge särskild färg.
  • Returnerat resultat jämfört med 0. Om villkoret är "falskt" går prototrådsfunktionen omedelbart tillbaka och ger kontroll till huvudslingan.
  • När prototråden anropas nästa gång kör det igen kod före PT_BEGIN och hoppar sedan direkt in i PT_WAIT_UNTIL -makron från vilka den återvände förra gången.
  • Sådana åtgärder upprepas tills resultatet av DoAndCountdown är 0. I så fall finns det ingen retur, programmet stannar kvar i prototråden och kör nästa rad i koden. I vårt fall är det nästa PT_WAIT_UNTIL men generellt sett kan det vara nästan vilken C -kod som helst.
  • Vid den första körningen av den andra PT_WAIT_UNTIL backräknaren är 0, så gör proceduren DoAndCountdown () till det initiala värdet. Andra makron körs igen 250 gånger tills backräknaren når 0.
  • Status för struct pt återställs så snart kontrollen når PT_END -makron. När prototrådsfunktionen anropas nästa gång prototrådssegmentet startar kör koden direkt efter PT_BEGIN.

Det finns liknande prototrådsrutin för rätt LED. I vårt exempel tvingar det bara fram olika färger, men om vi kan göra det helt annorlunda: det finns ingen tät koppling mellan vänster och höger LED -rutin.

Steg 7: Intern

Interna
Interna

Hela programmet är mindre än 200 rader kod (med kommentarer och tomma rader) och tar mindre än 20% av Attiny85 kodminne. Om det behövs är det möjligt att använda fler prototrådsrutiner här och tilldela dem mycket mer komplicerad logik.

Protothreads bibliotek är den enklaste formen av samtidig datorprogrammering. Samtidig programmering är en metod som gör det möjligt att dela upp programmet i logiska delar: ibland kallas de coroutines, ibland tråd, ibland uppgifter. Principen är att varje sådan uppgift kan dela samma processorkraft samtidigt som koden hålls mer eller mindre linjär och oberoende av andra delar. Uppgifter ur logisk synvinkel kan utföras samtidigt.

För avancerade systemkontroller av sådana uppgifter som utförs antingen av operativsystemets kärna eller av språk runtime inbäddad i körbar av kompilator. Men i fallet med prototrådar kontrollerar applikationsprogrammeraren det manuellt genom att använda prototrådsmakronbibliotek i arbetsrutiner och åberopar sådana rutiner (vanligtvis ur huvudslingan).

Du vill förmodligen veta hur prototråd faktiskt fungerar? Var gömmer sig magin? Protothreads förlitar sig på en speciell C -språkfunktion: det faktum att C -switch -fallbesked kan vara inbäddad i om eller något annat block (som medan eller för). Detaljer hittar du på Adam Dunkels webbplats

Elektronikinternt i detta projekt är mycket enkelt. Bilden ovan ger dig en aning. Jag är säker på att du kan göra det bättre.

Rekommenderad: