Indholdsfortegnelse:

Læseomskiftere med ATtiny2313: 9 trin
Læseomskiftere med ATtiny2313: 9 trin

Video: Læseomskiftere med ATtiny2313: 9 trin

Video: Læseomskiftere med ATtiny2313: 9 trin
Video: Угрюм-река (1969) (1 серия) фильм 2024, November
Anonim
Læseomskiftere med ATtiny2313
Læseomskiftere med ATtiny2313

Der har været flere instruktioner, der beskæftiger sig med output fra ATtiny2313 og lignende AVR -enheder. For eksempel https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- Motor-med-en-AVR-mikroprocessor/. Ved at arbejde på den nyeste fra The Real Elliot, som viste, hvordan man styrer steppermotorer, fandt jeg ud af, at det ville være virkelig nyttigt at kunne køre alternative dele af koden i det samme program, så jeg ikke behøvede at omprogrammere ATtiny2313 hver gang ville jeg prøve en lille kodevariation (f.eks. halvt trin eller kører stepperen i omvendt). Selvom det er let at skrive kode ved hjælp af en switch/case statement for at tillade valg af alternative variationer, er det nødvendigt med en måde at vælge sagen på. Det betyder, at en slags inputenhed skal læses for at styre sagen. Heldigvis har ATtiny2313 masser af I/O-ben og er godt designet til at læse input fra switches. Denne instruktør viser, hvordan man læser input og træffer beslutninger baseret på deres tilstand. Da det alene ville gøre en temmelig kedelig instruerbar, vil jeg forklare en enkel måde at bruge timer/tæller -funktionen på ATtiny2313 til at køre en lille højttaler som en bipper. Der vil også være en lille afvigelse på enkle fejlfindingsteknikker.

Trin 1: Inputenheden

Inputenheden
Inputenheden
Inputenheden
Inputenheden

Denne instruks bygger på det fremragende arbejde fra The Real Elliot og bruger det ATtiny2313 Ghetto -udviklingssystem, han beskriver. ATtiny2313 -databladet fra Atmel er den ultimative reference for alle funktioner, men det er ikke nødvendigvis let at læse. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Link har alle AVR -datablade, lokaliser 2313.) Figuren viser et simpelt sæt inputkontakter. Dette er simpelthen en pakke med fire tænd/sluk -switches; også kendt som single pole, single throw switches (SPST). Typisk er en forbindelse eller pol for hver switch bundet til jorden, mens den anden forbindelse trækkes højt gennem en strømbegrænsende modstand (10K eller deromkring). En mikrokontrollerindgang er forbundet til polen med modstanden. Hvis kontakten er åben, læser mikrokontrolleren input som HI. Hvis kontakten er lukket, læser mikrokontrolleren input LO. Se skematisk for detaljer. ATtiny2313 forenkler tingene ved at levere programmerbare pull-up-modstande på I/O-ben, når de er konfigureret som indgange. Det betyder, at switchene simpelthen kan have en pol bundet til jorden (LO) og den anden pol forbundet til en processorindgang. Det første eksempel viser kun to kontakter. Kontakterne læses og konfigureres med følgende kode. Konfigurer kontakterne som indgange: (Ingen kode påkrævet; dette er standard.) Tænd for pull-up-modstandene: PORTB = _BV (PB0) | _BV (PB1); Læs input: but1 = ~ PINB & 0x03; Bemærk brug af inversion og maskering for at få den korrekte værdi.

Trin 2: Blinkenlights til et signal

Vi bruger disse to kontakter til at blinke en LED et programmerbart antal gange. De lysdioder, vi vil bruge, er blinkenlights, som The Real Elliot gjorde berømt. Skifter 1 og 2 behandles som to binære cifre, så kombinationen kan repræsentere tallene 0, 1, 2 og 3. Vores program læser de to kontakter og blinker LED'en det passende antal gange, men kun hvis kontakten indstillinger er ændret. Omskifterne afbrydes i 500 millisekunder (ikke optimeret). Debounce -algoritmen er ret simpel. Kontakterne læses, og aflæsningen noteres. Hvis den er forskellig fra oldBut -værdien (den sidst gemte værdi), forsinkes programmet i 500 millisekunder, og switchene læses igen. Hvis værdien er den samme som tidligere læst, opdateres værdien af oldBut, og LED'en blinker det antal gange, den binære værdi for de to switches antyder. Bemærk inversionen af værdien, da en switch, der er "tændt", læser LO. Skifterne scannes løbende for yderligere ændringer. Se venligst tidligere Instructables af The Real Elliot for at lære mere om blinkenlights. Tag et kig på denne https://www.ganssle.com/debouncing.pdf for at lære mere om afbrydelse af switches. Her er ATtiny2313 -koden til dette eksempel. Under drift blinker dette program LED'en på PB4 (fysisk pin 8) to gange for at vise, at den er initialiseret. Den læser derefter switches en og to og blinker en til tre gange afhængigt af switchindstillingen, når de ændres. Når kontakterne ikke ændrer sig, vil LED'en blinke langsomt. For at køre denne kode skal du oprette et nyt bibliotek (kald det "Basic" hvis du vil) og downloade følgende C -kodefil og lave en fil i den. Omdøb Makefile1.txt til bare Makefile. Brug WinAVR til at kompilere programmet og indlæse det i din ATtiny2313.

Trin 3: En mindre digression ved fejlfinding

Hvis du er som mig (og enhver anden programmør i verden), har du sandsynligvis oplevet tider, hvor den "fejlfrie" kode, du omhyggeligt har indtastet og kompileret, ikke gør, hvad du forventer, at den gør. Måske gør det simpelthen ingenting! Så hvad er problemet? Hvordan finder du ud af det? Heldigvis er der flere måder at få tingene til at fungere. (Få denne bog til en fremragende behandling af emnet debugging. Http://www.debuggingrules.com/) Jeg vil gerne tilbyde et par enkle forslag vedrørende emnet debugging microcontroller applikationer. Trin et er at bygge videre på hvad ved du. Hvis du har fået en blinkenlight til at fungere en gang, så brug den igen til at se, hvor du er i dit program. Jeg kan godt lide, at LED'en blinker to gange for at signalere starten på programmet. Du kan først indtaste koden for at gøre dette i starten af dit program. Når du ved, at der ikke er noget galt med din hardware, skal du oprette en funktion til at blinke. Her er den funktion, jeg bruger./*------------------------------------------ ------------------------------ ** blinkEm-funktion til at blinke LED ved hjælp af PD4 ** PD4 skal konfigureres som en output. ** ------------------------------------------------ ---------------------*/void blinkEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _forsinkelse_ms (1000); PORTD = ~ _BV (PD4); _forsinkelse_ms (1000); tælle--; }} Det er nu muligt at bruge denne funktion på forskellige punkter i din kode som et signal om, at koden har udført så langt. At kende koden betyder, at du omhyggeligt kan undersøge hver sektion, der har kørt, men ikke gjort, hvad du havde forventet, for at finde fejl. At ændre én ting ad gangen er også en nøgleteknik til fejlfinding (beskrevet i referencen ovenfor). Denne klassiske metode fungerer sammen med "divider og erobre": at tage baby skridt for at tilføje funktionalitet trinvist. Dette kan virke som en langsom tilgang, men det er ikke nær så langsomt som at prøve at fejlsøge en stor del af ikke-fungerende kode på én gang.

Trin 4: Mere fejlfinding

Der er mange gange, hvor vi vil kontrollere et afsnit af kode ved at springe de fleste af linjerne over i det og derefter aktivere dem en ad gangen, når vi kontrollerer, at hver enkelt fungerer. Typisk gør vi dette ved at "kommentere" linjer, vi vil springe over. En udvidelse af denne teknik er at klippe og indsætte en kodeblok, kommentere originalen (så vi ikke mister den) og hacke væk på kopien. C har fire nemme måder at kommentere linjer på. Hvis du sætter "//" foran en linje, kommenteres denne linje. Hvis du lukker en eller flere linjer i "/*" og "*/", kommenteres en hel sektion. For at denne metode skal fungere effektivt, må der ikke være noget andet "*/" i kodeblokken (bortset fra den slutende). Så en effektiv disciplin er at bruge // til kommentarer inden for kodeblokke og reservere / * * / konstruktionen til kommentarblokke og til at kommentere dele af koden. Placering af "#if 0" i starten af en blok for at kommentere og afslutning af afsnittet med "#endif". Mere selektiv kontrol er mulig ved hjælp af "#ifdef (identifikator)" i starten af en blok og "#endif" i slutningen. Hvis du vil have blokken til at kompilere, skal du bruge "#define (identifier)" tidligere i programmet. Bemærk citatmærkerne er kun til vægt og skal ikke medtages. Kombination af disse teknikker bør være en nyttig metode til fejlfinding af dine ATtiny2313 -programmer. Du kan finde disse værktøjer nyttige, når vi fortsætter gennem denne instruks.

Trin 5: Brug af timer/tæller 0 til bip

Brug af timer/tæller 0 til bip
Brug af timer/tæller 0 til bip

ATtiny2313 har to kraftige timer/tællerressourcer: en 8-bit og en 16-bit. Disse kan konfigureres som frekvensgeneratorer, modulære regulatorer med variabel pulsbredde og output -sammenligningsregistre. Den fulde funktionalitet af disse er beskrevet på 49 sider i databladet. Vi vil dog bruge en simpel sag. Kun timer/tæller 0 (den 8-bit) vil blive brugt, og den vil blot blive brugt som en frekvensgenerator. Frekvensen dirigeres til en lille højttaler for at afgive et bip. Timer/tæller 0 er fuldt ud beskrevet på side 66 til 83 i ATtiny2313 -databladet. En nærlæsning af dette materiale vil give en en fuldstændig forståelse af Time/Counter 0. Heldigvis er en temmelig enkel tilstand, Clear Timer on Compare (CTC), alt hvad der kræves for at generere den biptone, vi ønsker.

I den tilstand, vi vil bruge, fungerer timeren/tælleren ligetil. Når et ur -signal vælges, starter tælleren på nul og øger hver urpuls. Når tællerværdien når værdien i Output Compare Register (TOP), nulstilles tælleren til nul, og tællingen starter igen. Outputbitten, der er forbundet med timeren/tælleren, skiftes til at producere en firkantbølgeudgang. Dette driver en lydtransducer direkte til at lave en biplyd. En lille TDK -lydtransducer afgiver bip. En passende enhed er Digikey 445-2530-ND, TDK SD1209T3-A1 (jeg brugte en tidlig version af dette). Dette er en 3 volt version; 5 volt versionen vil også fungere jeg forventer. Jeg kører dette direkte fra outputporten på Attiny2313, og det ser ud til at fungere fint. Sparkfun har en lignende enhed.

Trin 6: Konfiguration af timer/tæller 0

CTC -tilstand kan bruges til at skifte output OC0A på Pin 2, Port B (fysisk pin 14). For at aktivere output på denne pin, skal DDRB indstilles korrekt. C -koden for dette er ligesom at oprette en output til et blinkenlight. DDRB = _BV (PB2); // Port B2 er en output. Det næste trin er at levere et kloksignal og indlæse output -sammenligningsregistret for at producere en bølgeform som en frekvens. Ligningen for den resulterende frekvens er angivet i databladet (side 72). Termer i ligningen vil blive beskrevet nedenfor. Her er ligningen: fOC0A = fclk_I/O/2*N*(1+OCR0A) Hvor fOC0A: = udgangsfrekvens fclk_I/O: = urkildefrekvens N: = urforkalkningsfaktor OCR0A: = værdi i output sammenlign register for Timer/ Tæller 0A. Clock Source Frequency, fclk_I/ODette er systemurets frekvens. Standardværdien er 1MHz. Bits CS00, CS01 og CS02 i TCCR0B styrer dette valg. Da disse bits også vælger værdien af N, beskrives det derefter. Forkalkningsværdi, NN er den værdi, der bruges til at dividere eller forskala systemuret. Bits CS00, CS01 og CS02 i TCCR0B styrer dette valg. Tabel 41 på side 81 i ATtiny2313 -databladet beskriver kombinationerne. Da en frekvens nær 1 kHz ønskes, indstilles bit CS00 og CS01 i TCCR0B. Bemærk, at hvis du sætter alle tre bits til 0, og dermed vælger ingen urkilde, effektivt stopper output. Dette er den metode, der vil blive brugt til at starte og stoppe bip. TOP -værdi, OCR0A Denne værdi er TOP -værdien for den tæller, der indlæses i Output Compare Register for Timer/Counter 0A. Når denne værdi er nået, nulstilles tælleren til nul, og tællingen begynder igen, indtil TOP er nået, og cyklussen gentages. TOP ændres let, så bipperens frekvens er let at ændre. Da en frekvens nær 1 kHz ønskes, er TOP sat til 7. (Bemærk, at forkalkeren kunne have været indstillet til 8 og TOP sat til 63. Samme resultat - dit valg.) Outputfrekvens, fOC0ABrug ligningen til at beregne outputfrekvensresultaterne in: fOC0A = 1, 000, 000 /2 * 64 * (1+7) fOC0A = 977Hz Luk nok! Her er koden til indlæsning af Output Compare Register og Timer Counter Control Register 0B. Se den aktuelle programkode for at forstå, hvordan disse bruges. OCR0A = 7; // Tidsværdi TCCR0B = _BV (CS01) | _BV (CS00); // Vælg internt ur & prescale = 8 TCCR0B = 0; // ingen urkilde slukker tonen Indstilling af tid/tæller -tilstand Som en sidste detalje angiver vi den timer-/tællertilstand, vi ønsker, ved at indstille passende bits i Timer/Counter Control Register 0A. CTC -tilstand vælges ved at indstille bit WGM01 som beskrevet i tabel 40, side 79 i databladet. Da vi vil have output til at skifte hver cyklus, skal bit COM0A0 også indstilles som beskrevet i tabel 34 på side 77. Her er koden: TCCR0A = _BV (COM0A0) | _BV (WGM01); // CTC Toggle Mode

Trin 7: Brug af fire switches

Når vi implementerer bipper, lad os udvide vores hardware og software til at håndtere fire switches. Da output fra Timer Counter 0A er på Port B, pin 2, kan vi ikke bare tilslutte flere switches i rækkefølge til Port B. En let løsning ville være at bruge Port D, men lad os have den port tilgængelig til andre funktioner (måske en trinmotor). Så lad os tilslutte de ekstra switches til PB3 og PB4. Aflæsning af switchene er stort set uændret. Maskeværdien ændres til 0x1B (00011011 binær) til at maskere bit 2 sammen med 5, 6 og 7. Et yderligere trick bruges til at oprette et 4-bit binært tal. Skift bit 3 og 4 højre en bit og kombiner dem med bit 0 og 1 til et 4 bit binært tal. Dette er standard C -syntaks for forskydning og kombination af bits, men er måske ikke velkendt for nybegyndere. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1 har switch læsning I drift blinker programmet to gange og bipper to gange for at signalere initialisering. Hver gang switcherne ændres, bippes det nummer, de repræsenterer. Når kontakterne ikke ændres, blinker LED'en. For at køre denne kode skal du oprette et nyt bibliotek (kald det Beep, hvis du vil) og downloade følgende C -kodefil og lave en fil i den. Omdøb Makefile2.txt til bare Makefile. Brug WinAVR til at kompilere programmet og indlæse det i din Attiny2313.

Trin 8: Brug af switch/case -konstruktionen

Det sidste trin er "bare software": Som lovet implementerer vi switch/case -konstruktionen. Selvom dette eksempel kun viser to alternative handlinger, bør det være meget klart, hvordan man bruger denne konstruktion til at vælge en af flere alternative kodesektioner. I drift overvåger dette program kontakterne, og hvis der er en ændring, bipper det det passende nummer, hvis det er ulige; det blinker, hvis tallet er lige. Det gør ingenting, medmindre en switch ændrer sig.

For at køre denne kode skal du oprette et nyt bibliotek (kald det Switch hvis du vil) og downloade følgende C -kodefil og lave en fil i den. Omdøb Makefile3.txt til bare Makefile. Brug WinAVR til at kompilere programmet og indlæse det i din Attiny2313.

Trin 9: Konklusion

Konklusion
Konklusion

Så det er det! Nu ved du, hvordan du bruger switches til at styre udførelsen af dit program ved at læse dem ind og vælge en handling baseret på switchindstillingen. Du ved også, hvordan du opretter en biptone og har også lært nogle fejlfindingsstrategier.

Hvis du gerne vil teste din forståelse, kan du prøve at ændre det sidste program til at bippe ved en høj tone, hvis det er ens, bip en lav tone, hvis det er ulige, og blinke LED'en konstant, hvis der ikke er nogen ændring i kontakterne. Du vil måske se tilbage til afsnittet om fejlfinding efter hjælp.

Anbefalede: