Sisukord:

Lugemislülitid ATtiny2313: 9 sammuga
Lugemislülitid ATtiny2313: 9 sammuga

Video: Lugemislülitid ATtiny2313: 9 sammuga

Video: Lugemislülitid ATtiny2313: 9 sammuga
Video: Värvisorteerija korduses. Kordus ja lüliti. LEGO EV3 Colour Sensor. Loop Block, Switch Block 2024, Juuli
Anonim
Lugemislülitid ATtiny2313 abil
Lugemislülitid ATtiny2313 abil

ATtiny2313 ja sarnaste AVR -seadmete väljunditega on tegeletud mitmete juhistega. Näiteks https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- Mootor-AVR-mikroprotsessoriga/. Töötades The Real Elliot'i viimase osa kallal, mis näitas samm -mootorite juhtimist, leidsin, et oleks tõesti kasulik, kui saaksin samas programmis käivitada alternatiivseid koodilõike, nii et ma ei peaks igaüks ATtiny2313 ümber programmeerima ma tahtsin proovida väikest koodi variatsiooni (näiteks pooleldi samm või tagurpidi käivitamine). Ehkki alternatiivsete variatsioonide valimiseks on lihtne lüliti/juhtumilause abil koodi kirjutada, on vaja teatud juhtumi valimise viisi. See tähendab, et juhtumi juhtimiseks tuleb lugeda mingit sisendseadet. Õnneks on ATtiny2313-l palju I/O kontakte ja see on hästi kavandatud lülitite sisendite lugemiseks. See juhend sisaldab juhiseid sisendite lugemiseks ja nende oleku põhjal otsuste tegemiseks. Kuna see ainuüksi muudaks üsna igava juhendatava, selgitan lihtsat viisi ATtiny2313 taimer/loenduri kasutamise kohta väikese kõlari helisignaalina kasutamiseks. Samuti tehakse väike kõrvalepõige lihtsate silumistehnikate kohta.

Samm: sisendseade

Sisendseade
Sisendseade
Sisendseade
Sisendseade

See juhend sisaldab tõelise Ellioti suurepärast tööd ja kasutab tema kirjeldatud ATtiny2313 Ghetto arendussüsteemi. Atmeli andmeleht ATtiny2313 on kõigi funktsioonide lõplik viide, kuid seda pole tingimata lihtne lugeda. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Linkil on kõik AVR -i andmelehed, leidke 2313.) Joonisel on kujutatud lihtne sisendlülitite komplekt. See on lihtsalt nelja sisse/välja lüliti komplekt; tuntud ka kui ühepooluselised üheheitmelülitid (SPST). Tavaliselt on iga lüliti üks ühendus või poolus maapinnaga seotud, teine aga tõmmatakse kõrgele läbi voolu piirava takisti (10K või nii). Takisti abil on poolusega ühendatud mikrokontrolleri sisend. Kui lüliti on avatud, loeb mikrokontroller sisendi HI -ks. Kui lüliti on suletud, loeb mikrokontroller sisendi LO. Üksikasju vaadake skeemilt. ATtiny2313 lihtsustab asju, pakkudes programmeeritavaid tõmbetakistusi I/O kontaktidele, kui need on sisenditeks konfigureeritud. See tähendab, et lülititel võib lihtsalt olla üks poolus maaga seotud (LO) ja teine poolus ühendatud protsessori sisendiga. Esimene näide näitab ainult kahte lülitit. Lüliteid loetakse ja konfigureeritakse järgmise koodiga. Konfigureerige lülitid sisenditeks: (koodi pole vaja; see on vaikimisi.) Lülitage sisse tõmbetakistid: PORTB = _BV (PB0) | _BV (PB1); Lugege sisendeid: but1 = ~ PINB & 0x03; Õige väärtuse saamiseks pange tähele inversiooni ja maskeerimist.

2. samm: vilkuvad signaallambid

Kasutame neid kahte lülitit LED -i vilgutamiseks programmeeritaval arvul kordadel. Valgusdioodid, mida me kasutame, on vilkurid, mille The Real Elliot kuulsaks tegi. Lüliteid 1 ja 2 käsitletakse kahe binaarse numbrina, nii et kombinatsioon võib tähistada numbreid 0, 1, 2 ja 3. Meie programm loeb kahte lülitit ja vilgutab LED -i sobival arvul, kuid ainult siis, kui lüliti seaded on muutunud. Lülitid on tühistatud 500 millisekundi jooksul (pole optimeeritud). Tagasilöögialgoritm on üsna lihtne. Lülitid loetakse ja näit märgitakse. Kui see erineb väärtusest oldBut (viimane salvestatud väärtus), lükatakse programm edasi 500 millisekundi võrra ja lülitid loetakse uuesti. Kui väärtus on sama, mis eelnevalt loetud, uuendatakse väärtust oldBut ja LED vilgub, mitu korda kahe lüliti binaarväärtus eeldab. Pange tähele väärtuse ümberpööramist, kuna lüliti, mis on sisse lülitatud, loeb LO. Lüliteid skannitakse pidevalt täiendavate muudatuste tegemiseks. Vilkuvate tulede kohta lisateabe saamiseks vaadake The Real Ellioti varasemaid juhiseid. Vaadake seda https://www.ganssle.com/debouncing.pdf, et saada lisateavet tagasivoolulülitite kohta. Siin on selle näite jaoks kood ATtiny2313. Töötamise ajal vilgutab see programm PB4 (füüsiline tihvt 8) LED -i kaks korda, näidates, et see on lähtestatud. Seejärel loeb see lüliteid üks ja kaks ning vilgub üks kuni kolm korda sõltuvalt lüliti seadistusest, kui neid muudetakse. Kui lülitid ei muutu, vilgub LED aeglaselt. Selle koodi käivitamiseks looge uus kataloog (kui soovite, nimetage see "Basic") ja laadige alla järgmine C -koodifail ja makefile. Nimeta fail Makefile1.txt ümber lihtsalt failiks Makefile. WinAVR -i abil kompileerige programm ja laadige see oma ATtiny2313 -sse.

3. samm: väike kõrvalekalle silumisel

Kui olete nagu mina (ja kõik teised maailma programmeerijad), siis olete ilmselt kogenud aegu, mil "veavaba" kood, mille olete hoolikalt sisestanud ja koostanud, ei tee seda, mida te ootate. Võib -olla see lihtsalt ei tee midagi! Milles siis probleem? Kuidas kavatsete teada saada? Õnneks on asjade toimimiseks mitmeid lähenemisviise. (Hankige see raamat silumise teema suurepäraseks käsitlemiseks. Http://www.debuggingrules.com/) Tahaksin pakkuda mõningaid lihtsaid soovitusi, mis on seotud mikrokontrollerite rakenduste silumise teemaga. Esimene samm on tugineda mida sa tead. Kui olete saanud vilkumise korra tööle, kasutage seda uuesti, et näha, kus te oma programmis olete. Mulle meeldib, kui LED vilgub kaks korda, et anda märku programmi algusest. Selleks saate koodi sisestada programmi alguses. Kui teate, et teie riistvaral pole midagi viga, looge vilkumise tegemiseks funktsioon. Siin on funktsioon, mida ma kasutan. /-------------------------------------------------- ------------------------------ ** blinkEm-funktsioon LED-i vilkumiseks PD4 abil ** PD4 tuleb konfigureerida väljundiks. ** ------------------------------------------------ ---------------------*/void blinkEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _ viivitus_ms (1000); PORTD = ~ _BV (PD4); _ viivitus_ms (1000); loe--; }} Nüüd on seda funktsiooni võimalik kasutada oma koodi erinevates punktides signaalina, et kood on seni täitnud. Koodi töötamise teadmine tähendab, et saate vigade leidmiseks hoolikalt uurida iga jaotist, mis on käivitatud, kuid pole teinud seda, mida ootasite. Ühe asja korraga muutmine on ka silumise põhitehnika (kirjeldatud ülaltoodud viites). See klassikaline meetod töötab koos "jaga ja valluta": sammude astumine funktsionaalsuse järkjärguliseks lisamiseks. See võib tunduda aeglane lähenemisviis, kuid see pole kaugeltki nii aeglane, kui üritada siluda suurt osa mittetöötavat koodi korraga.

4. samm: rohkem silumist

On palju kordi, kui tahame koodilõiku kontrollida, jättes vahele enamiku selle ridadest ja lubades need ükshaaval, kui kontrollime, kas igaüks neist töötab. Tavaliselt teeme seda, kommenteerides ridu, mille tahame vahele jätta. Selle tehnika laienduseks on koodiploki lõikamine ja kleepimine, originaali kommenteerimine (et me seda ei kaotaks) ja koopia häkkimine. C -l on neli lihtsat viisi ridade kommenteerimiseks. "//" rea ette panemine kommenteerib seda rida. Ühe või mitme rea lisamisel "/*" ja "*/" kommenteeritakse terve jaotis. Selle meetodi tõhusaks toimimiseks ei tohi koodiplokis olla ühtegi muud "*/" (peale lõpliku). Seega on tõhus distsipliin kasutada // koodide plokkides olevate kommentaaride jaoks ja reserveerida / * * / konstruktsioon kommentaariplokkide jaoks ja koodilõikude kommenteerimiseks. "#If 0" paigutamine ploki alguses kommenteerimiseks ja lõpuosa lõpuga "#endif". Selektiivsemaks juhtimiseks on võimalik kasutada ploki alguses "#ifdef (identifier)" ja lõpus "#endif". Kui soovite ploki kompileerida, kasutage programmi "#define (identifier)" varem. Pange tähele, et jutumärgid on ainult rõhuasetuseks ja neid ei tohi kaasata. Nende meetodite kombineerimine peaks pakkuma kasuliku lähenemisviisi teie ATtiny2313 programmide silumiseks. Need tööriistad võivad teile selle juhendi läbimisel kasulikuks osutuda.

Samm: taimeri/loenduri 0 kasutamine piiksude jaoks

Taimeri/loenduri 0 kasutamine piiksude jaoks
Taimeri/loenduri 0 kasutamine piiksude jaoks

ATtiny2313-l on kaks võimsat taimerit/loendurit: üks 8-bitine ja üks 16-bitine. Need võivad olla konfigureeritud sagedusgeneraatoriteks, muutuva impulsi laiusega modulatsioonikontrolleriteks ja väljundvõrdlusregistriteks. Nende täielikku funktsionaalsust on kirjeldatud andmelehe 49 leheküljel. Siiski kasutame lihtsat juhtumit. Kasutatakse ainult taimerit/loendurit 0 (8-bitine) ja seda kasutatakse lihtsalt sagedusgeneraatorina. Sagedus suunatakse piiksu saamiseks väikesesse kõlarisse. Taimerit/loendurit 0 on täielikult kirjeldatud ATtiny2313 andmelehe lehekülgedel 66 kuni 83. Selle materjali põhjalik lugemine annab ajale/loendurile 0 täieliku ülevaate. Õnneks on soovitud piiksutooni genereerimiseks vaja üsna lihtsat režiimi, Clear Timer on Compare (CTC).

Meie kasutatava režiimi puhul on taimeri/loenduri töö lihtne. Kella signaali valimisel algab loendur nullist ja suurendab iga kellaimpulssi. Kui loenduri väärtus jõuab väljundvõrdlusregistri (TOP) väärtuseni, lähtestatakse loendur nulli ja loendamine algab uuesti. Taimeri/loenduriga seotud väljundbitt lülitatakse ruutlaine väljundi saamiseks. See juhib helisignaali vahetult piiksuma. Väike TDK helimuundur annab piiksu. Sobiv seade on Digikey 445-2530-ND, TDK SD1209T3-A1 (kasutasin selle varajast versiooni). See on 3 -voldine versioon; 5 -voldine versioon töötab ka ma ootan. Sõidan selle otse Attiny2313 väljundpordist välja ja tundub, et see töötab hästi. Sparkfunil on sarnane seade.

6. samm: taimeri/loenduri seadistamine 0

CTC -režiimi saab kasutada väljundi OC0A vahetamiseks tihvti 2, pordi B (füüsiline tihvt 14) vahel. Selle tihvti väljundi lubamiseks peab DDRB olema õigesti seadistatud. Selle C -kood on täpselt nagu välklambi väljundi seadistamine. DDRB = _BV (PB2); // Port B2 on väljund. Järgmine samm on edastada kellasignaal ja laadida väljundvõrdlusregister, et saada sagedusena lainekuju. Saadud sageduse võrrand on toodud andmelehel (lk 72). Võrrandi termineid kirjeldatakse allpool. Siin on võrrand: fOC0A = fclk_I/O/2*N*(1+OCR0A) Kus fOC0A: = väljundsagedus fclk_I/O: = kella allika sagedus N: = kella eelseadistustegur OCR0A: = väärtus väljundi võrdlusregistris taimerile/ Loendur 0A. Kella allika sagedus, fclk_I/O See on süsteemi kella sagedus. Vaikeväärtus on 1 MHz. TCCR0B bitid CS00, CS01 ja CS02 kontrollivad seda valikut. Kuna need bitid valivad ka väärtuse N, kirjeldatakse seda järgnevalt. Eelkvaliteedi väärtus, NN on süsteemikella jagamiseks või eelkvalifitseerimiseks kasutatav väärtus. TCCR0B bitid CS00, CS01 ja CS02 kontrollivad seda valikut. Tabelis 41 leheküljel 81 on ATtiny2313 andmelehel kirjeldatud kombinatsioone. Kuna soovitakse 1kHz lähedast sagedust, määratakse TCCR0B bitid CS00 ja CS01. Pange tähele, et kõigi kolme biti seadmine väärtusele 0, seega kellaallika puudumine, peatab väljundi. See on meetod, mida kasutatakse piiksu alustamiseks ja peatamiseks. TOP väärtus, OCR0A See väärtus on loenduri TOP väärtus, mis on laaditud taimeri/loenduri 0A väljundvõrdlusregistrisse. Kui see väärtus on saavutatud, lähtestatakse loendur nulli ja loendamine algab uuesti, kuni saavutatakse TOP ja tsükkel kordub. TOPi on lihtne muuta, seega on helisignaali sagedust lihtne muuta. Kuna soovitakse sagedust 1kHz lähedal, on TOP seatud väärtusele 7. (Pange tähele, et eelseadistaja oleks võinud olla 8 ja TOP 63. Sama tulemus - teie valik.) Väljundsagedus, fOC0A Väljundsageduse tulemuste arvutamiseks võrrandi kasutamine in: fOC0A = 1 000 000 /2 * 64 * (1+7) fOC0A = 977HzSulge! Siin on kood väljundvõrdlusregistri ja taimeriloenduri juhtimisregistri 0B laadimiseks. Palun vaadake programmi tegelikku koodi, et mõista, kuidas neid kasutatakse. OCR0A = 7; // Aja väärtus TCCR0B = _BV (CS01) | _BV (CS00); // Vali sisemine kell & prescale = 8 TCCR0B = 0; // ükski kellaallikas ei lülita tooni välja Kellaaja/loenduri režiimi seadistamine Viimase detailina täpsustame soovitud taimeri/loenduri režiimi, määrates taimer/loenduri juhtimisregistris 0A sobivad bitid. CTC -režiim valitakse, seadistades biti WGM01, nagu on kirjeldatud andmelehe tabelis 40, lk 79. Kuna me tahame, et väljund vahetaks iga tsüklit, tuleb ka bitt COM0A0 seadistada, nagu on kirjeldatud tabelis 34 lk 77. Siin on kood: TCCR0A = _BV (COM0A0) | _BV (WGM01); // CTC lülitusrežiim

Samm: nelja lüliti kasutamine

Piiksu rakendamisel laiendame oma riistvara ja tarkvara nelja lüliti haldamiseks. Kuna taimeriloenduri 0A väljund on pordis B, tihvt 2, ei saa me lihtsalt järjest rohkem porte B külge ühendada. Lihtne lahendus oleks kasutada porti D, kuid hoiame selle pordi muude funktsioonide jaoks kättesaadavana (võib -olla samm -mootor). Seega ühendame täiendavad lülitid PB3 ja PB4 külge. Lülitite lugemine on enamasti muutumatu. Maski väärtus muudetakse väärtuseks 0x1B (00011011 binaarne), et varjata bitti 2 koos 5, 6 ja 7. 4-bitise kahendnumbri loomiseks kasutatakse veel ühte trikki. Nihutage bitte 3 ja 4 ühe bitti paremale ja ühendage need bittidega 0 ja 1 4 -bitiseks kahendarvuks. See on standardne C süntaks bittide nihutamiseks ja kombineerimiseks, kuid ei pruugi algajale hästi teada. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1 -l on lülitilugemineTegevuse ajal vilgub programm kaks korda ja piiksub kaks korda, et anda märku lähtestamisest. Iga kord, kui lüliteid vahetatakse, piiksub nende esindatud number. Kui lülitid ei muutu, vilgub LED. Selle koodi käivitamiseks looge uus kataloog (kui soovite, nimetage see piiksuks) ja laadige alla järgmine C -koodifail ja makefile. Nimeta Makefile2.txt ümber lihtsalt failiks Makefile. WinAVR -i abil kompileerige programm ja laadige see oma Attiny2313 -sse.

8. samm: lüliti/korpuse ehitamine

Viimane samm on "lihtsalt tarkvara": nagu lubatud, rakendame lüliti/korpuse konstruktsiooni. Kuigi see näide näitab ainult kahte alternatiivset toimingut, peaks olema väga selge, kuidas seda konstruktsiooni kasutada mitme alternatiivse koodiosa valimiseks. Töötades jälgib see programm lüliteid ja muutuse korral piiksub vastava numbri korral, kui see on paaritu; see vilgub, kui number on paaris. See ei tee midagi, kui lüliti ei muutu.

Selle koodi käivitamiseks looge uus kataloog (kui soovite, nimetage seda Switchiks) ja laadige sinna alla järgmine C -koodifail ja makefile. Nimeta Makefile3.txt ümber lihtsalt failiks Makefile. WinAVR -i abil kompileerige programm ja laadige see oma Attiny2313 -sse.

9. samm: järeldus

Järeldus
Järeldus

Nii see on! Nüüd teate, kuidas lülitite abil oma programmi täitmist juhtida, lugedes need sisse ja valides lüliti sätte alusel toimingu. Samuti teate, kuidas piiksu tooni luua, ja olete õppinud ka silumisstrateegiat.

Kui soovite oma arusaamist proovile panna, proovige viimast programmi muuta nii, et see piiksuks kõrgel tasemel, kui see on ühtlane, piiksuge madalal noodil, kui see on paaritu, ja vilgutage LED -i pidevalt, kui lülitites pole muutusi. pöörduge abi saamiseks silumise jao juurde.

Soovitan: