Satura rādītājs:

Lasīšanas slēdži ar ATtiny2313: 9 soļi
Lasīšanas slēdži ar ATtiny2313: 9 soļi

Video: Lasīšanas slēdži ar ATtiny2313: 9 soļi

Video: Lasīšanas slēdži ar ATtiny2313: 9 soļi
Video: Logic Gates Learning Kit #2 - Transistor Demo 2024, Jūlijs
Anonim
Lasīšanas slēdži ar ATtiny2313
Lasīšanas slēdži ar ATtiny2313

Ir bijuši vairāki Instructables, kas nodarbojas ar ATtiny2313 un līdzīgu AVR ierīču izvadiem. Piemēram, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- Motors ar AVR mikroprocesoru/. Strādājot pie jaunākā The Real Elliot, kurā tika parādīts, kā kontrolēt soļu motorus, es atklāju, ka būtu patiešām noderīgi, ja tajā pašā programmā varētu palaist alternatīvas koda sadaļas, tāpēc man nebija jāpārprogrammē katrs ATtiny2313 es gribēju izmēģināt nelielas koda variācijas (piemēram, pakāpienu vai pakāpiena palaišanu atpakaļgaitā). Lai gan kodu ir viegli rakstīt, izmantojot slēdzi/gadījuma paziņojumu, lai varētu izvēlēties alternatīvas variācijas, ir nepieciešams zināms gadījuma izvēles veids. Tas nozīmē, ka, lai kontrolētu lietu, ir jālasa kāda veida ievades ierīce. Par laimi, ATtiny2313 ir daudz I/O tapu, un tas ir labi izstrādāts, lai nolasītu ievadi no slēdžiem. Šī pamācība parādīs, kā lasīt ievades datus un pieņemt lēmumus, pamatojoties uz to stāvokli. Tā kā tas vien padarītu diezgan garlaicīgu pamācību, es paskaidrošu vienkāršu veidu, kā izmantot ATtiny2313 taimera/skaitītāja iespējas, lai vadītu nelielu skaļruni kā pīkstienu. Būs arī neliela atkāpe no vienkāršām atkļūdošanas metodēm.

1. darbība: ievades ierīce

Ievades ierīce
Ievades ierīce
Ievades ierīce
Ievades ierīce

Šī pamācība balstās uz The Real Elliot lielisko darbu un izmanto viņa aprakstīto ATtiny2313 Ghetto izstrādes sistēmu. Atmel ATtiny2313 datu lapa ir galvenā atsauce uz visām funkcijām, taču to ne vienmēr ir viegli nolasīt. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Linkā ir visas AVR datu lapas, atrodiet 2313.) Attēlā parādīts vienkāršs ievades slēdžu komplekts. Tas ir vienkārši četru ieslēgšanas/izslēgšanas slēdžu komplekts; pazīstams arī kā viena pola viena metiena slēdži (SPST). Parasti katra slēdža viens savienojums vai stabs ir piesiets pie zemes, bet otrs savienojums ir izvilkts augstu caur strāvas ierobežošanas rezistoru (10K vai vairāk). Mikrokontrollera ieeja ir savienota ar polu ar rezistoru. Ja slēdzis ir atvērts, mikrokontrolleris nolasīs ievadi kā HI. Ja slēdzis ir aizvērts, mikrokontrolleris nolasīs ievadi LO. Sīkāku informāciju skatiet shēmā. ATtiny2313 vienkāršo lietas, nodrošinot programmējamus pacelšanas rezistorus uz I/O tapām, kad tās ir konfigurētas kā ieejas. Tas nozīmē, ka slēdžiem var vienkārši piestiprināt vienu polu pie zemes (LO) un otru polu pievienot procesora ieejai. Pirmais piemērs parāda tikai divus slēdžus. Slēdži tiek nolasīti un konfigurēti ar šādu kodu. Konfigurējiet slēdžus kā ieejas: (kods nav nepieciešams; tas ir noklusējums.) Ieslēdziet uzvilkšanas rezistorus: PORTB = _BV (PB0) | _BV (PB1); Lasiet ievades: but1 = ~ PINB & 0x03; Ievērojiet apgriešanas un maskēšanas izmantošanu, lai iegūtu pareizo vērtību.

2. solis: mirgo signāllampiņas

Mēs izmantosim šos divus slēdžus, lai programmējamu reižu mirgo LED. Gaismas diodes, kuras mēs izmantosim, būs mirgojošās gaismas, kuras The Real Elliot padarīja slavenas. Slēdži 1 un 2 tiks uzskatīti par diviem binārajiem cipariem, tāpēc kombinācija var attēlot ciparus 0, 1, 2 un 3. Mūsu programma nolasīs abus slēdžus un mirgos gaismas diode atbilstošo reižu skaitu, bet tikai tad, ja slēdzis iestatījumi ir mainījušies. Slēdži tiek atslēgti par 500 milisekundēm (nav optimizēti). Atkāpšanās algoritms ir diezgan vienkāršs. Slēdži tiek nolasīti un rādījumi tiek atzīmēti. Ja tā atšķiras no vecāsBut vērtības (pēdējā saglabātā vērtība), tad programma tiek aizkavēta par 500 milisekundēm un slēdži tiek nolasīti vēlreiz. Ja vērtība ir tāda pati kā iepriekš nolasītā, OldBut vērtība tiks atjaunināta un gaismas diode mirgos, cik reižu norāda divu slēdžu binārā vērtība. Ņemiet vērā vērtības inversiju, jo slēdzis, kas ir ieslēgts, nolasa LO. Slēdži tiks nepārtraukti skenēti, lai veiktu turpmākas izmaiņas. Lūdzu, skatiet The Real Elliot iepriekšējos Instructables, lai uzzinātu vairāk par mirgojošām gaismām. Apskatiet šo https://www.ganssle.com/debouncing.pdf, lai uzzinātu vairāk par atslēgšanas slēdžiem. Šeit ir šī piemēra kods ATtiny2313. Darbības laikā šī programma divas reizes mirgos PB4 (fiziskā tapa 8) LED, lai parādītu, ka tā ir inicializēta. Pēc tam tas nolasīs pirmo un otro slēdzi un mirgos vienu līdz trīs reizes atkarībā no slēdža iestatījuma, kad tie tiks mainīti. Kad slēdži nemainās, gaismas diode mirgos lēni. Lai palaistu šo kodu, izveidojiet jaunu direktoriju (ja vēlaties, nosauciet to par “pamata”) un lejupielādējiet tajā šādu C koda failu un makefile. Pārdēvējiet failu Makefile1.txt uz tikai Makefile. Izmantojot WinAVR, apkopojiet programmu un ielādējiet to savā ATtiny2313.

3. darbība. Neliela atkāpe par atkļūdošanu

Ja jūs esat tāds pats kā es (un visi citi programmētāji pasaulē), iespējams, esat piedzīvojuši brīžus, kad rūpīgi ievadītais un apkopotais kods bez kļūdām neatbilst gaidītajam. Varbūt tas vienkārši neko nedara! Tātad, kāda ir problēma? Kā jūs to uzzināsit? Par laimi, ir vairākas pieejas, lai lietas sāktu darboties. (Iegūstiet šo grāmatu, lai lieliski apskatītu atkļūdošanas tēmu. Http://www.debuggingrules.com/) Es vēlos piedāvāt dažus vienkāršus ieteikumus, kas attiecas uz mikrokontrolleru lietojumprogrammu atkļūdošanas tēmu. Pirmais solis ir balstīties uz ko jūs zināt. Ja vienreiz esat saņēmis mirgojošu gaismu, izmantojiet to vēlreiz, lai redzētu, kur atrodaties savā programmā. Man patīk, ja gaismas diode mirgo divas reizes, lai signalizētu par programmas sākumu. Lai to izdarītu, sākotnēji varat ievadīt kodu programmas sākumā. Kad zināt, ka ar aparatūru nekas nav kārtībā, izveidojiet mirgošanas funkciju. Šeit ir funkcija, kuru es izmantoju. /-------------------------------------------------- ------------------------------ ** blinkEm-funkcija mirgot LED, izmantojot PD4 ** PD4 ir jākonfigurē kā izeja. ** ------------------------------------------------ ---------------------*/void blinkEm (uint8_t count) {while (skaits> 0) {PORTD = _BV (PD4); _kavēšanās_ms (1000); PORTD = ~ _BV (PD4); _kavēšanās_ms (1000); saskaitīt--; }} Tagad šo funkciju ir iespējams izmantot dažādos koda punktos kā signālu, ka kods ir izpildījis tik tālu. Zinot, ka kods darbojas, varat rūpīgi pārbaudīt katru sadaļu, kas ir palaista, bet nav izdarījusi to, ko gaidījāt, lai atrastu kļūdas. Vienu lietu mainīšana vienlaikus ir arī galvenais atkļūdošanas paņēmiens (aprakstīts iepriekšējā atsaucē). Šī klasiskā metode darbojas kopā ar “sadalīt un iekarot”: veicot mazuļa darbības, lai pakāpeniski pievienotu funkcionalitāti. Tas var šķist lēna pieeja, taču tas nav gandrīz tik lēns kā mēģinājums vienlaikus atkļūdot lielu nestrādājoša koda sadaļu.

4. darbība. Vairāk atkļūdošanas

Ir daudzas reizes, kad vēlamies pārbaudīt koda sadaļu, izlaižot lielāko daļu tajā esošo rindu, pēc tam iespējojot tās pa vienai, pārbaudot, vai katra no tām darbojas. Parasti mēs to darām, "komentējot" rindas, kuras vēlamies izlaist. Šīs tehnikas paplašinājums ir izgriezt un ielīmēt koda bloku, komentēt oriģinālu (lai mēs to nezaudētu) un uzlauzt kopiju. C ir četri vienkārši veidi, kā komentēt līnijas. Ievietojot "//" rindas priekšā, tiek komentēta šī līnija. Iekļaujot vienu vai vairākas rindiņas "/*" un "*/", tiks komentēta visa sadaļa. Lai šī metode darbotos efektīvi, koda blokā nedrīkst būt cita "*/" (izņemot beigu). Tātad efektīva disciplīna ir izmantot // komentāriem koda blokos, un rezervēt / * * / konstrukciju komentāru blokiem un koda sadaļu komentēšanai. Ievietojiet "#if 0" bloka sākumā, lai komentētu un sadaļas pabeigšana ar "#endif". Selektīvāka vadība ir iespējama, izmantojot "#ifdef (identifier)" bloka sākumā un "#endif" beigās. Ja vēlaties, lai bloks tiktu apkopots, programmas sākumā izmantojiet "#define (identifier)". Ņemiet vērā, ka pēdiņas ir paredzētas tikai uzsvaram, un tās nav jāiekļauj. Šo metožu kombinācijai vajadzētu būt noderīgai pieejai ATtiny2313 programmu atkļūdošanai. Šie rīki var būt noderīgi, turpinot šo instrukciju.

5. darbība. Taimera/skaitītāja 0 izmantošana pīkstieniem

Taimera/skaitītāja 0 izmantošana pīkstieniem
Taimera/skaitītāja 0 izmantošana pīkstieniem

ATtiny2313 ir divi jaudīgi taimera/skaitītāja resursi: viens 8 bitu un viens 16 bitu. Tos var konfigurēt kā frekvenču ģeneratorus, mainīga impulsa platuma modulācijas kontrolierus un izvades salīdzināšanas reģistrus. To funkcionalitāte ir aprakstīta 49 datu lapas lappusēs. Tomēr mēs izmantosim vienkāršu lietu. Tiks izmantots tikai taimeris/skaitītājs 0 (8 bitu), un tas tiks izmantots vienkārši kā frekvences ģenerators. Frekvence tiks novirzīta uz nelielu skaļruni, lai radītu pīkstienu. Taimeris/skaitītājs 0 ir pilnībā aprakstīts ATtiny2313 datu lapas 66. līdz 83. lappusē. Rūpīga šī materiāla lasīšana sniegs pilnīgu izpratni par laiku/skaitītāju 0. Par laimi, diezgan vienkāršs režīms, Clear Timer on Compare (CTC), ir viss, kas nepieciešams, lai radītu vēlamo pīkstienu.

Mūsu izmantotajam režīmam taimera/skaitītāja darbība ir vienkārša. Kad ir izvēlēts pulksteņa signāls, skaitītājs sākas ar nulli un palielina katru pulksteņa impulsu. Kad skaitītāja vērtība sasniedz izvades salīdzināšanas reģistra (TOP) vērtību, skaitītājs tiek atiestatīts uz nulli un skaitīšana sākas no jauna. Ar taimeri/skaitītāju saistītais izejas bits tiek pārslēgts, lai iegūtu kvadrātveida viļņu izvadi. Tas tieši vada audio devēju, lai radītu pīkstienu. Neliels TDK audio pārveidotājs rada pīkstienu. Piemērota vienība ir Digikey 445-2530-ND, TDK SD1209T3-A1 (es izmantoju tā agrīno versiju). Šī ir 3 voltu versija; 5 voltu versija arī darbosies, es ceru. Es to dzinu tieši no Attiny2313 izejas porta, un šķiet, ka tas darbojas labi. Sparkfun ir līdzīga ierīce.

6. darbība: taimera/skaitītāja konfigurēšana 0

CTC režīmu var izmantot, lai pārslēgtu izeju OC0A uz 2. kontakta, porta B (fiziskā tapa 14). Lai iespējotu izvadi šajā tapā, DDRB ir pareizi jāiestata. C kods tam ir tāds pats kā mirgojošas gaismas izvades iestatīšana. DDRB = _BV (PB2); // Port B2 ir izeja. Nākamais solis ir piegādāt pulksteņa signālu un ielādēt izvades salīdzināšanas reģistru, lai iegūtu frekvences viļņu formu. Rezultātu biežuma vienādojums ir norādīts datu lapā (72. lpp.). Vienādojuma noteikumi tiks aprakstīti zemāk. Šeit ir vienādojums: fOC0A = fclk_I/O/2*N*(1+OCR0A) Kur fOC0A: = izejas frekvence fclk_I/O: = pulksteņa avota frekvence N: = pulksteņa iepriekšēja mēroga koeficients OCR0A: = vērtība izejas salīdzināšanas reģistrā Taimerim/ Skaitītājs 0A. Pulksteņa avota frekvence, fclk_I/O Šī ir sistēmas pulksteņa frekvence. Noklusējuma vērtība ir 1 MHz. TCCR0B biti CS00, CS01 un CS02 kontrolē šo atlasi. Tā kā šie biti arī izvēlas N vērtību, tas ir aprakstīts tālāk. Iepriekšēja mēroga vērtība, NN ir vērtība, ko izmanto, lai sadalītu vai iepriekš iestatītu sistēmas pulksteni. TCCR0B biti CS00, CS01 un CS02 kontrolē šo atlasi. ATtiny2313 datu lapas 41. tabula 81. lappusē apraksta kombinācijas. Tā kā vēlama frekvence tuvu 1 kHz, tiks iestatīti TCCR0B biti CS00 un CS01. Ņemiet vērā, ka visu trīs bitu iestatīšana uz 0, tādējādi neizvēloties pulksteņa avotu, efektīvi pārtrauc izvadi. Šī ir metode, kas tiks izmantota, lai sāktu un apturētu pīkstienu. TOP vērtība, OCR0A Šī vērtība ir skaitītāja TOP vērtība, kas tiek ielādēta taimera/skaitītāja 0A izvades salīdzināšanas reģistrā. Kad šī vērtība ir sasniegta, skaitītājs tiks atiestatīts uz nulli un skaitīšana tiks atsākta, līdz tiks sasniegts TOP un cikls atkārtosies. TOP ir viegli modificējams, tāpēc pīkstiena frekvenci ir viegli mainīt. Tā kā ir vēlama frekvence, kas ir tuvu 1 kHz, TOP ir iestatīts uz 7. (Ņemiet vērā, ka prescaler varēja būt iestatīts uz 8, bet TOP - uz 63. Tas pats rezultāts - jūsu izvēle.) Izejas frekvence, fOC0A Izmantojot vienādojumu, lai aprēķinātu izejas frekvences rezultātus in: fOC0A = 1 000 000 /2 * 64 * (1+7) fOC0A = 977Hz Pietiekami tuvu! Šeit ir kods, lai ielādētu izvades salīdzināšanas reģistru un taimera skaitītāja kontroles reģistru 0B. Lūdzu, skatiet faktisko programmas kodu, lai saprastu, kā tie tiek izmantoti. OCR0A = 7; // Laika vērtība TCCR0B = _BV (CS01) | _BV (CS00); // Izvēlieties iekšējo pulksteni & prescale = 8 TCCR0B = 0; // neviens pulksteņa avots neizslēdz signālu CTC režīmu izvēlas, iestatot bitu WGM01, kā aprakstīts datu lapas 40. tabulā, 79. lappusē. Tā kā mēs vēlamies, lai izvade pārslēgtos katrā ciklā, ir jāiestata arī bits COM0A0, kā aprakstīts 34. tabulā 77. lpp. Šeit ir kods: TCCR0A = _BV (COM0A0) | _BV (WGM01); // CTC pārslēgšanas režīms

7. darbība: četru slēdžu izmantošana

Ieviešot skaņas signālu, paplašināsim aparatūru un programmatūru, lai tā darbotos ar četriem slēdžiem. Tā kā taimera skaitītāja 0A izeja ir pieslēgvietai B, 2. tapa, mēs nevaram vienkārši savienot vairākus slēdžus secīgi pie porta B. Vienkāršs risinājums būtu izmantot portu D, bet paturēsim šo portu pieejamu citām funkcijām (iespējams pakāpju motors). Tātad pievienosim papildu slēdžus uz PB3 un PB4. Slēdžu lasīšana lielākoties nemainās. Maskas vērtība tiek mainīta uz 0x1B (00011011 binārs), lai maskētu 2. bitu kopā ar 5., 6. un 7. Vēl viens triks tiek izmantots, lai izveidotu 4 bitu bināro skaitli. Pārslēdziet 3. un 4. bitu pa labi un apvienojiet tos ar bitiem 0 un 1 4 bitu binārajā skaitlī. Šī ir standarta C sintakse bitu pārslēgšanai un apvienošanai, taču iesācējam tā var nebūt labi zināma. but1a = (but1 & 0x03) | ((but1 & 0x18) >> 1); // but1 ir slēdža nolasīšana Darbībā programma divreiz mirgos un pīkstēs, lai signalizētu par inicializāciju. Ikreiz, kad slēdži tiek mainīti, tiks parādīts to attēlotais numurs. Kad slēdži nemainās, gaismas diode mirgos. Lai palaistu šo kodu, izveidojiet jaunu direktoriju (ja vēlaties, nosauciet to par pīkstienu) un lejupielādējiet tajā šādu C koda failu un makefile. Pārdēvējiet failu Makefile2.txt par tikai Makefile. Izmantojot WinAVR, apkopojiet programmu un ielādējiet to savā Attiny2313.

8. solis: slēdža/korpusa konstrukcijas izmantošana

Pēdējais solis ir "tikai programmatūra": kā solīts, mēs ieviesīsim slēdža/korpusa konstrukciju. Lai gan šajā piemērā ir parādītas tikai divas alternatīvas darbības, ir jābūt ļoti skaidram, kā izmantot šo konstrukciju, lai atlasītu vienu no vairākām alternatīvām koda sadaļām. Darbībā šī programma uzrauga slēdžus, un, ja notiek izmaiņas, tā pīkstēs atbilstošo skaitli, ja tas ir nepāra; tas mirgos, ja skaitlis ir pāra. Tas neko nedara, ja vien nemainās slēdzis.

Lai palaistu šo kodu, izveidojiet jaunu direktoriju (ja vēlaties, nosauciet to par slēdzi) un lejupielādējiet tajā šādu C koda failu un makefile. Pārdēvējiet failu Makefile3.txt par tikai Makefile. Izmantojot WinAVR, apkopojiet programmu un ielādējiet to savā Attiny2313.

9. solis. Secinājums

Secinājums
Secinājums

Tātad tas ir viss! Tagad jūs zināt, kā izmantot slēdžus, lai kontrolētu savas programmas izpildi, izlasot tos un atlasot darbību, pamatojoties uz slēdža iestatījumu. Jūs arī zināt, kā izveidot skaņas signālu, un esat apguvis arī atkļūdošanas stratēģiju.

Ja vēlaties pārbaudīt savu izpratni, mēģiniet modificēt pēdējo programmu, lai pīkstētu augstā augstumā, ja tas ir pat, pīkstiet zemu piezīmi, ja nepāra, un nepārtraukti mirgo gaismas diode, ja slēdžos nav izmaiņu. Atgriezieties sadaļā par atkļūdošanu, lai saņemtu palīdzību.

Ieteicams: