Агуулгын хүснэгт:

ATtiny2313: 9 алхамтай унтраалга унших
ATtiny2313: 9 алхамтай унтраалга унших

Видео: ATtiny2313: 9 алхамтай унтраалга унших

Видео: ATtiny2313: 9 алхамтай унтраалга унших
Видео: Обзор и программирование ATtiny2313. Прошивка через Arduino UNO и USBasp 2024, Долдугаар сарын
Anonim
ATtiny2313 -тай унших унтраалга
ATtiny2313 -тай унших унтраалга

ATtiny2313 болон үүнтэй төстэй AVR төхөөрөмжүүдийн гаралттай холбоотой хэд хэдэн зааварчилгаа байдаг. Жишээлбэл, https://www.instructables.com/id/Ghetto-Programming%3a-Getting-started-with-AVR-micro/, https://www.instructables.com/id/Drive-a-Stepper- AVR-микропроцессортой мотор/. The Real Elliot -ийн хамгийн сүүлийн хувилбар дээр ажиллаж, stepper моторыг хэрхэн удирдахыг харуулсан бөгөөд нэг програмд кодын өөр хэсгүүдийг ажиллуулах нь үнэхээр тустай болохыг олж мэдсэн тул ATtiny2313 програмыг дахин програмчлах шаардлагагүй болсон. Би бага зэрэг кодын өөрчлөлтийг туршиж үзэхийг хүссэн (хагас алхам эсвэл урвуу алхам хийх гэх мэт). Өөр хувилбарыг сонгохын тулд switch/case мэдэгдэл ашиглан код бичих нь хялбар боловч хэргийг сонгох зарим арга хэрэгтэй болно. Энэ нь хэргийг хянахын тулд ямар нэгэн оролтын төхөөрөмжийг унших ёстой гэсэн үг юм. Аз болоход, ATtiny2313 нь олон оролтын/залгууртай бөгөөд унтраалгын оролтыг уншихад зориулагдсан болно. Энэхүү зааварчилгаа нь орцыг хэрхэн уншиж, төлөв байдалд нь үндэслэн шийдвэр гаргахыг харуулах болно. Зөвхөн энэ нь үнэхээр уйтгартай зааварчилгаа өгөх болно, тиймээс би ATtiny2313 -ийн таймер/тоолуурыг ашиглан жижиг чанга яригчийг дуут дохио болгон ашиглах энгийн аргыг тайлбарлах болно. Мөн дибаг хийх энгийн аргуудын талаар бага зэрэг ухрах болно.

Алхам 1: Оруулах төхөөрөмж

Оруулах төхөөрөмж
Оруулах төхөөрөмж
Оруулах төхөөрөмж
Оруулах төхөөрөмж

Энэхүү зааварчилгаа нь Real Elliot -ийн маш сайн бүтээл дээр үндэслэсэн бөгөөд түүний тодорхойлсон ATtiny2313 Ghetto хөгжүүлэх системийг ашигладаг. Atmel -аас авсан ATtiny2313 мэдээллийн хуудас нь бүх функцуудын хувьд хамгийн сайн лавлах боловч уншихад тийм ч хялбар биш юм. https://www.atmel.com/dyn/products/datasheets.asp?family_id=607 (Холбоос нь бүх AVR мэдээллийн хуудастай, 2313 -ийг олоорой.) Зураг дээр оролтын унтраалгын энгийн багцыг харуулав. Энэ бол зүгээр л дөрвөн асаах/унтраах багц юм; дан туйл, ганц шидэлт унтраалга (SPST) гэж нэрлэдэг. Ихэвчлэн унтраалга бүрийн нэг холболт буюу туйлыг газарт холбодог бол нөгөө холболтыг гүйдэл хязгаарлах эсэргүүцэлээр (10K орчим) өндөр татаж авдаг. Микроконтроллерийн оролт нь резистортой туйлд холбогдсон байна. Хэрэв унтраалга нээлттэй байвал микроконтроллер оролтыг HI гэж уншина. Хэрэв унтраалга хаагдсан бол микроконтроллер нь LO оролтыг уншина. ATtiny2313 нь оролт болгон тохируулагдсан үед I/O зүү дээр програмчлагдах татах эсэргүүцэл өгөх замаар бүх зүйлийг хялбаршуулдаг. Энэ нь унтраалга нь нэг туйлыг газардуулсан (LO), нөгөө туйлыг процессорын оролттой холбож болно гэсэн үг юм. Эхний жишээ нь зөвхөн хоёр унтраалгыг харуулж байна. Шилжүүлэгчийг дараах кодыг ашиглан уншиж, тохируулна. Шилжүүлэгчийг оролт болгон тохируулаарай: (Код шаардлагагүй, энэ нь анхдагч юм.) Татах эсэргүүцлийг асаана уу: PORTB = _BV (PB0) | _BV (PB1); Оролтуудыг уншина уу: but1 = ~ PINB & 0x03; Зөв утгыг олж авахын тулд урвуу болон маск ашиглах аргыг анхаарна уу.

Алхам 2: Дохио өгөхөд гэрэл анивчина

Бид эдгээр хоёр унтраалгыг ашиглан LED програмчлагдах боломжтой удаа хэдэн удаа анивчих болно. Бидний ашиглах LED нь Real Elliot -ийн алдаршуулсан анивчих гэрэл болно. 1 ба 2 -р унтраалгуудыг хоёртын хоёр оронтой цифр гэж үзэх тул хослол нь 0, 1, 2, 3 гэсэн тоонуудыг илэрхийлж болно. Манай програм нь хоёр унтраалгыг уншиж, LED -ийг зохих тооны удаа анивчих болно. тохиргоо өөрчлөгдсөн байна. Шилжүүлэгчид 500 миллисекундээр зарагдсан (оновчтой биш). Татгалзах алгоритм нь маш энгийн. Шилжүүлэгчийг уншиж, уншилтыг тэмдэглэв. Хэрэв энэ нь oldBut утгаас (хамгийн сүүлд хадгалсан утга) ялгаатай байвал програм 500 миллисекундээр хойшлогдож, унтраалгыг дахин уншина. Хэрэв утга нь өмнө уншсантай ижил байвал oldBut -ийн утга шинэчлэгдэх бөгөөд LED нь хоёр унтраалгын хоёртын утгыг илэрхийлсэн хэдэн удаа анивчих болно. "Асаасан" унтраалга LO уншдаг тул утгын урвалыг анхаарч үзээрэй. Нэмэлт өөрчлөлтүүдийг унтраалгуудыг тасралтгүй сканнердах болно. Гэрлийн гэрлийн талаар илүү ихийг мэдэхийн тулд Real Elliot -ийн өмнөх зааварчилгааг үзнэ үү. Энэ https://www.ganssle.com/debouncing.pdf -ийг үзээд унтраалгыг задлах талаар илүү ихийг мэдэхийг хүсвэл энэ жишээний ATtiny2313 код энд байна. Ажиллаж байх үед энэ програм PB4 (физик зүү 8) дээрх LED -ийг хоёр удаа анивчих бөгөөд үүнийг эхлүүлсэн болохыг харуулна. Дараа нь энэ нь нэг, хоёр унтраалгыг уншиж, солих бүртээ унтраалгын тохиргооноос хамааран нэгээс гурван удаа анивчих болно. Шилжүүлэгчид өөрчлөгдөөгүй тохиолдолд LED аажмаар анивчих болно. Энэ кодыг ажиллуулахын тулд шинэ лавлах үүсгээрэй (хэрэв хүсвэл үүнийг "Үндсэн" гэж нэрлээрэй), дараах C кодын файлыг татаж аваарай. Makefile1.txt -ийн нэрийг Makefile болгон өөрчил. WinAVR -ийг ашиглан програмыг эмхэтгээд ATtiny2313 -д ачаална уу.

Алхам 3: Дебаг хийх талаар бага зэргийн ухралт

Хэрэв та над шиг (мөн дэлхийн бусад бүх програмист) бол "алдаагүй" кодоо сайтар бичиж, эмхэтгэсэн нь таны хүлээж байсан зүйлийг хийхгүй байх үе танд тохиолдож байсан байх. Магадгүй энэ нь зүгээр л юу ч хийхгүй байж магадгүй юм! Тэгэхээр ямар асуудал байна вэ? Та яаж олж мэдэх гэж байна? Аз болоход, аливаа зүйлийг ажиллуулах хэд хэдэн арга байдаг. (Дебаг хийх сэдвийг маш сайн эмчлэхийн тулд энэ номыг аваарай. Http://www.debuggingrules.com/) Би микроконтроллер програмыг дибаг хийх сэдэвтэй холбоотой хэд хэдэн энгийн зөвлөмжийг санал болгохыг хүсч байна. таны мэддэг зүйл. Хэрэв та нэг удаа ажиллахад гэрэл гэгээтэй болсон бол програмаа хаана байгааг харахын тулд үүнийг дахин ашиглаарай. Хөтөлбөрийг эхлүүлэхийн тулд LED хоёр удаа анивчих дуртай. Үүнийг хийхийн тулд кодыг програмынхаа эхэнд оруулах боломжтой. Таны техник хангамжид ямар ч буруу зүйл байхгүй гэдгийг мэдмэгцээ анивчих функцийг үүсгээрэй. Миний ашигладаг функц энд байна./*------------------------------------------ ------------------------------ ** blinkEm-PD4 ашиглан LED анивчих функцийг ** PD4 гаралт болгон тохируулах ёстой. ** ------------------------------------------------ ---------------------*/void blinkEm (uint8_t count) {while (count> 0) {PORTD = _BV (PD4); _хойшлох_ms (1000); PORTD = ~ _BV (PD4); _хойшлох_ms (1000); тоолох-; }} Энэ функцийг кодынхоо янз бүрийн цэгүүдэд код өнөөг хүртэл биелүүлсний дохио болгон ашиглах боломжтой боллоо. Кодыг ажиллуулж байгааг мэдэх нь алдааг олохын тулд ажиллаж байсан боловч хүлээсэн зүйлээ хийгээгүй хэсэг бүрийг сайтар шалгаж үзэх боломжтой гэсэн үг юм. Нэг удаад нэг зүйлийг өөрчлөх нь дибаг хийх гол техник юм (дээрх лавлагаанд тайлбарласан болно). Энэхүү сонгодог арга нь "хувааж, байлдан дагуулах" -тай хамт ажилладаг: хүүхдийн үйл ажиллагааг аажмаар нэмэгдүүлэхийн тулд алхам хийх. Энэ нь удаан арга мэт санагдаж болох ч энэ нь ажиллахгүй кодын том хэсгийг нэг дор дибаг хийх гэж оролдохтой адил удаан биш юм.

Алхам 4: Илүү дибаг хийх

Бид кодын хэсгийг шалгахын тулд ихэнх мөрүүдийг алгасаад дараа нь тус бүрийг нь шалгаж байхдаа нэг нэгээр нь идэвхжүүлэхийг хүсдэг. Ерөнхийдөө бид үүнийг алгасахыг хүсч буй мөрөө "тайлбарлах" замаар хийдэг. Энэхүү техникийн өргөтгөл нь кодын блокыг хайчилж буулгах, эх хувилбарыг нь тайлбарлах (тиймээс бид үүнийг алдахгүй байх), хуулбарыг нь хакердах явдал юм. Мөрүүдийг тайлбарлах дөрвөн хялбар арга байдаг. Шугамын урд "//" гэж оруулбал тухайн мөрийг тайлбарлах болно. "/*" Ба "*/" тэмдэгтүүдэд нэг буюу хэд хэдэн мөрийг оруулснаар бүхэл бүтэн хэсгийг тайлбарлах болно. Энэ аргыг үр дүнтэй ажиллуулахын тулд кодын блокод өөр "*/" тэмдэг байх ёсгүй (төгсгөлөөс бусад). Тиймээс үр дүнтэй сахилга бат бол кодын блок доторх тайлбарыг бичихийн тулд // -г ашиглах, тайлбар блок болон кодын хэсгүүдийг тайлбарлахын тулд / * * / бүтцийг нөөцлөх явдал юм. болон хэсгийг "#endif" -ээр дуусгах. Илүү сонгомол хяналтыг блокийн эхэнд "#ifdef (танигч)", төгсгөлд нь "#endif" ашиглан хийх боломжтой. Хэрэв та блокыг эмхэтгэхийг хүсч байвал програмын өмнөх хэсэгт "#define (identifier)" ашиглана уу. Эдгээр аргуудыг нэгтгэх нь ATtiny2313 програмыг дибаг хийх ашигтай аргыг санал болгох ёстой. Энэхүү зааварчилгааг үргэлжлүүлэх явцад эдгээр хэрэгслүүд танд хэрэгтэй байж магадгүй юм.

Алхам 5: Таймер/Тоолуур 0 -ийг ашиглан дохио өгөх

Таймер/Тоолуур 0 -ийг дуут дохионд ашиглах
Таймер/Тоолуур 0 -ийг дуут дохионд ашиглах

ATtiny2313 нь хоёр хүчирхэг таймер/тоолуурын нөөцтэй: нэг нь 8 бит, нэг нь 16 бит. Эдгээрийг давтамжийн үүсгүүр, импульсийн өргөний модуляцийн хянагч, гаралтын харьцуулах регистр болгон тохируулж болно. Эдгээрийн бүрэн ажиллагааг мэдээллийн хуудасны 49 хуудсанд тайлбарласан болно. Гэсэн хэдий ч бид энгийн хэргийг ашиглах болно. Зөвхөн таймер/тоолуур 0 (8 битийн) ашиглах бөгөөд үүнийг зөвхөн давтамжийн үүсгүүр болгон ашиглах болно. Давтамжийг жижиг чанга яригч руу чиглүүлж дохио өгөх болно. Таймер/Тоолуур 0 -ийг ATtiny2313 мэдээллийн хуудасны 66-83 -р хуудсанд бүрэн тайлбарласан болно. Энэ материалыг сайтар уншсанаар цаг/тоолуур 0 -ийн талаар бүрэн ойлголттой болох болно. Аз болоход, харьцуулах энгийн таймер, харьцуулах цагийн хуваарь (CTC) нь бидний хүссэн дууны дохиог гаргахад л хангалттай.

Бидний ашиглах горимын хувьд таймер/тоолуурын ажиллагаа шууд явагддаг. Цагийн дохиог сонгоход тоолуур тэгээс эхэлж, цагны импульс бүрийг нэмэгдүүлдэг. Тоолуурын утгыг Гаралтын харьцуулалтын бүртгэл (TOP) дээрх утгад хүрэхэд тоолуур тэг болж дахин тоолж эхэлнэ. Таймер/Тоологчтой холбоотой гаралтын битийг сольж квадрат долгионы гаралтыг гаргадаг. Энэ нь дуут дохио гаргахын тулд аудио хувиргагчийг шууд удирддаг. Жижиг TDK аудио хувиргагч нь дохио өгдөг. Тохиромжтой нэгж бол Digikey 445-2530-ND, TDK SD1209T3-A1 (би үүний эхний хувилбарыг ашигласан). Энэ бол 3 вольтын хувилбар юм; 5 вольтын хувилбар бас миний хүлээж байгаагаар ажиллах болно. Би үүнийг Attiny2313 гаралтын портоос шууд хөөж байгаа бөгөөд энэ нь сайн ажиллаж байгаа юм шиг байна. Sparkfun ижил төстэй төхөөрөмжтэй.

Алхам 6: Таймер/Тоолуурыг тохируулах 0

CTC горимыг OC0A гаралтыг Pin 2, B порт (физик зүү 14) дээр шилжүүлэхэд ашиглаж болно. Энэ зүү дээрх гаралтыг идэвхжүүлэхийн тулд DDRB -ийг зохих ёсоор тохируулсан байх ёстой. Үүний C код нь анивчих гэрлийн гаралтыг тохируулахтай адил юм. DDRB = _BV (PB2); // В2 порт нь гаралт юм. Дараагийн алхам бол цагийн дохио өгч, давтамж хэлбэрээр долгионы хэлбэрийг гаргахын тулд гаралтын харьцуулалтын бүртгэлийг ачаалах явдал юм. Үүссэн давтамжийн тэгшитгэлийг мэдээллийн хуудсанд өгсөн болно (хуудас 72). Тэгшитгэлийн нэр томъёог доор тайлбарлах болно. Энд тэгшитгэл байна: fOC0A = fclk_I/O/2*N*(1+OCR0A) Энд fOC0A: = гаралтын давтамж fclk_I/O: = цагийн эх давтамж N: = цагийн урьдчилсан тооцооны коэффициент OCR0A: = Таймерын гаралтын харьцуулалтын регистрийн утга/ Тоолуур 0A. Цагны эх үүсвэрийн давтамж, fclk_I/O Энэ бол системийн цагийн давтамж юм. Анхдагч утга нь 1 МГц байна. TCCR0B -ийн CS00, CS01, CS02 битүүд энэ сонголтыг хянадаг. Эдгээр битүүд нь мөн N -ийн утгыг сонгодог тул үүнийг дараа нь тайлбарлах болно. TCCR0B -ийн CS00, CS01, CS02 битүүд энэ сонголтыг хянадаг. ATtiny2313 мэдээллийн хуудасны 81 -р хуудасны 41 -р хүснэгтэд хослолыг тайлбарласан болно. 1 кГц -ийн ойролцоо давтамжийг хүсч байгаа тул TCCR0B -ийн CS00 ба CS01 битүүдийг тохируулах болно. Гурван битийг 0 болгож, цагийн эх үүсвэрийг сонгохгүй байх нь гаралтыг үр дүнтэй зогсооно гэдгийг анхаарна уу. Энэ бол дуут дохиог эхлүүлэх, зогсооход хэрэглэгдэх арга юм. TOP утга, OCR0 Энэ утга нь таймер/тоолуур 0А -ийн гаралтын харьцуулалтын бүртгэлд ачаалагдсан тоолуурын ТОП утга юм. Энэ утгад хүрмэгц тоолуурыг тэг болгож, ТОП -д хүрч мөчлөг давтагдах хүртэл тоолж эхэлнэ. TOP нь амархан өөрчлөгддөг тул дуут дохионы давтамжийг өөрчлөхөд хялбар байдаг. 1 кГц -ийн ойролцоо давтамжийг хүсч байгаа тул ТОП -ийг 7 гэж тохируулсан болно. (Урьдчилан тооцоолох төхөөрөмжийг 8 болгож, ТОП -ийг 63 болгож тохируулах боломжтой болохыг анхаарна уу. Үүнтэй ижил үр дүн таны сонголт болно.) Гаралтын давтамж, fOC0A Гаралтын давтамжийн үр дүнг тооцоолохын тулд тэгшитгэлийг ашиглана уу. in: fOC0A = 1, 000, 000 /2 * 64 * (1+7) fOC0A = 977Hz Хангалттай ойрхон байна! Гаралтын харьцуулалтын бүртгэл болон таймерын тоолуурын хяналтын бүртгэл 0B -ийг ачаалах код энд байна. Эдгээрийг хэрхэн ашиглаж байгааг ойлгохын тулд програмын бодит кодыг үзнэ үү. OCR0A = 7; // Цагийн утга TCCR0B = _BV (CS01) | _BV (CS00); // Дотоод цаг & prescale = 8 TCCR0B = 0 сонгох; // ямар ч цагийн эх сурвалж аяыг унтраахгүй Цаг/Тоолуурын горимыг тохируулах Хамгийн сүүлд нь бид Таймер/Тоолуурын хяналтын бүртгэл 0А -д тохирох битүүдийг тохируулж хүссэн Таймер/Тоолуурын горимыг зааж өгөх болно. CTC горимыг мэдээллийн хүснэгтийн Хүснэгт 40, 79 -р хуудсанд тайлбарласны дагуу WGM01 битийг тохируулах замаар сонгоно. Бид гаралтыг мөчлөг бүрээр солихыг хүсч байгаа тул COM0A0 битийг 77 -р хүснэгт 34 -т тайлбарласны дагуу тохируулах шаардлагатай байна. Энд код байна: TCCR0A = _BV (COM0A0) | _BV (WGM01); // CTC сэлгэх горим

Алхам 7: Дөрвөн унтраалга ашиглах

Дуут дохиог ажиллуулахдаа техник хангамж, програм хангамжаа дөрвөн унтраалгатай харьцуулж өргөжүүлье. Таймер Тоолуурын 0А гаралт нь В порт 2 -р зүү дээр байгаа тул бид илүү олон унтраалгыг В порт руу залгах боломжгүй. Д портыг ашиглах нь хамгийн хялбар шийдэл боловч энэ портыг бусад функцуудад ашиглах боломжтой байлгая. stepper мотор). Нэмэлт унтраалгуудыг PB3 ба PB4 -д холбож үзье. Шилжүүлэгчийг унших нь ихэвчлэн өөрчлөгддөггүй. Маскийн утгыг 0x1B (00011011 binary) болгон өөрчилж, бит 2-ийг 5, 6, 7-той хамт маск болгоно. 4 битийн хоёртын дугаарыг бий болгохын тулд бас нэг арга хэрэглэдэг. 3 ба 4 -р битүүдийг баруун тийш нь шилжүүлж, 0 ба 1 битүүдтэй нийлүүлээд 4 битийн хоёртын тоо болгоно. Энэ бол битүүдийг шилжүүлэх, нэгтгэх стандарт С синтакс боловч эхлэгчдэд тийм ч сайн мэддэггүй байж магадгүй юм. but1a = (but1 & 0x03) | ((гэхдээ1 & 0x18) >> 1); // but1 нь унтраалгатай уншилттай байна. Ашиглалтын явцад програм нь хоёр удаа анивчиж, хоёр удаа дуугарч дохио өгөх болно. Шилжүүлэгчийг хэзээ ч солиход тэдний төлөөлж буй дугаар дуугарах болно. Шилжүүлэгчид өөрчлөгдөөгүй тохиолдолд LED анивчих болно. Энэ кодыг ажиллуулахын тулд шинэ лавлах үүсгэж (хэрэв хүсвэл Beep гэж нэрлэнэ үү) дараах C кодын файлыг татаж аваад дотор нь оруулна уу. Makefile2.txt -ийн нэрийг Makefile болгон өөрчил. WinAVR -ийг ашиглан програмыг эмхэтгэн Attiny2313 -д ачаална уу.

Алхам 8: Switch/case Construct -ийг ашиглах

Эцсийн алхам бол "зүгээр л програм хангамж": Амласан ёсоор бид шилжүүлэгч/кейс бүтцийг хэрэгжүүлэх болно. Энэ жишээ нь зөвхөн хоёр өөр үйлдлийг харуулсан боловч хэд хэдэн өөр кодын хэсгүүдийн аль нэгийг сонгохдоо энэ бүтцийг хэрхэн ашиглах нь маш тодорхой байх ёстой. Ажиллаж байх үед энэ програм нь унтраалгуудыг хянадаг бөгөөд хэрэв өөрчлөлт гарсан бол сондгой байвал зохих дугаарыг дуугаргах болно; Хэрэв тоо тэгш бол энэ нь анивчих болно. Шилжүүлэгч солихгүй бол юу ч хийхгүй.

Энэ кодыг ажиллуулахын тулд шинэ лавлах үүсгэ (хэрэв хүсвэл үүнийг Switch гэж нэрлээрэй), дараах C кодын файлыг татаж аваад дотор нь makefile оруулна уу. Makefile3.txt -ийн нэрийг Makefile болгон өөрчил. WinAVR -ийг ашиглан програмыг эмхэтгэн Attiny2313 -д ачаална уу.

Алхам 9: Дүгнэлт

Дүгнэлт
Дүгнэлт

Ингээд л боллоо! Одоо та унтраалгыг ашиглан програмынхаа гүйцэтгэлийг хянах, унтраах тохиргоон дээр үндэслэн үйлдлийг сонгох замаар хэрхэн ашиглахаа мэддэг болсон. Та хэрхэн дуугарах дуу гаргахаа мэддэг бөгөөд дибаг хийх стратеги сурсан болно.

Хэрэв та өөрийн ойлголтыг туршиж үзэхийг хүсч байвал хамгийн сүүлчийн програмыг өндөр давтамжтай, хэрэв сондгой байвал бага тэмдэглэж, унтраалга өөрчлөгдөөгүй бол LED -ийг тасралтгүй анивчихыг оролдоорой. тусламж дибаг хийх хэсэгт буцаж очно уу.

Зөвлөмж болгож буй: