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

PIC бүхий дижитал эргэлтийн унтраалгаас эргэх чиглэлийг хэрхэн тайлбарлах вэ: 5 алхам
PIC бүхий дижитал эргэлтийн унтраалгаас эргэх чиглэлийг хэрхэн тайлбарлах вэ: 5 алхам

Видео: PIC бүхий дижитал эргэлтийн унтраалгаас эргэх чиглэлийг хэрхэн тайлбарлах вэ: 5 алхам

Видео: PIC бүхий дижитал эргэлтийн унтраалгаас эргэх чиглэлийг хэрхэн тайлбарлах вэ: 5 алхам
Видео: Как сделать автоматический самодельный инкубатор для яиц, легко, шаг за шагом, дешево и быстро 2024, Долдугаар сарын
Anonim
PIC бүхий дижитал эргэлтийн унтраалгаас эргэх чиглэлийг хэрхэн тайлбарлах вэ
PIC бүхий дижитал эргэлтийн унтраалгаас эргэх чиглэлийг хэрхэн тайлбарлах вэ

Энэхүү зааварчилгааны зорилго нь дижитал (дөрвөлжин кодтой) эргүүлэгчийг микроконтроллертой хэрхэн холбохыг харуулах явдал юм. Санаа зоволтгүй, квадрат кодчилол нь бидний хувьд ямар утгатай болохыг тайлбарлах болно. Энэхүү интерфэйс болон дагалдах програм хангамж нь микроконтроллерийг нэг саатлаас нөгөөд шилжих тус бүрийн эргэлтийн чиглэлийг таних боломжийг олгоно. Би саяхан ийм төрлийн унтраалгыг микроконтроллерийн төсөлд ашигласан бөгөөд даралтын тохиргооны цэгийг 16 товчлуур ашиглан оруулна. дээш/доош товчлууруудын оронд саатуулах. Энэхүү санаа нь хэрэглэгч хүссэн даралтаа "залгах" боломжийг олгох явдал байв. Үүний үр дүнд бид үндсэн системийн даралтын тогтоосон цэгийг нэмэгдүүлэх эсвэл бууруулахын тулд шилжүүлэгчийн байрлалын мэдээллийг олж авах, эргэлтийн чиглэлийг тодорхойлох програм хангамжийг боловсруулах шаардлагатай болсон. микроконтроллерт, эргэлтэт шилжүүлэгчийн ажиллах онол, програм хангамжийн үйл ажиллагааны онол, хасах горим. Эцэст нь би хасах журмын талаархи өргөдлөө үзүүлэх болно. Бид ахиц дэвшил гаргахдаа энэ санааг аль болох олон платформ дээр хэрэгжүүлэхийн тулд би ерөнхий зүйлийг хадгалахыг хичээх болно, гэхдээ би хийсэн зүйлээ хуваалцах болно, ингэснээр та тодорхой програмыг харах болно.

Алхам 1: эд анги

Эд анги
Эд анги

Үүнийг хэрэгжүүлэхийн тулд танд дараах зүйлс хэрэгтэй болно: Эргэдэг унтраалга (дөрвөлжин кодчилсон) Татах эсэргүүцэл Тохиромжтой микроконтроллер платформ Миний төслийн хувьд би Grayhill 61C22-01-04-02 оптик кодлогч ашигласан. Эргэдэг унтраалгын мэдээллийн хуудас нь шилжүүлэгчээс ирж буй хоёр өгөгдлийн шугам дээр 8.2 к ом эсэргүүцэл татах шаардлагатай байдаг. Та ашиглахыг хүссэн кодлогчын мэдээллийн хуудсыг шалгахыг хүсэх болно. Миний ашиглаж байсан эргүүлэх товчлуурыг мөн тэнхлэгийн түлхэх товчлуураар захиалж болно. Энэ нь залгасан гэх мэт сонголтуудыг хийхэд ашигтай шинж чанар боловч энд би түүний интерфэйсийн талаар ярихгүй. Надад "тохирох микроконтроллерийн платформ" бий, учир нь үүнийг (хэд хэдэн платформ дээр хэрэгжүүлэх боломжтой) гэж бодож байна. Би олон хүмүүс Instructables -ийн бусад микроконтроллерыг ашиглаж байгааг харсан тул ерөнхий хандлагыг харуулахыг хүсч байна. Би Microchip PIC16F877A -тай ашиглахын тулд бүх кодыг PIC Basic Pro дээр бичсэн. Үнэн хэрэгтээ микроконтроллерт хэрэгтэй гол зүйл бол хоёр тээглүүрийн аль нэгэнд логик өөрчлөлт гарсан тохиолдолд таслах чадвар юм. PIC16F877A дээр үүнийг PORTB өөрчлөлтийн тасалдал гэж нэрлэдэг. Бусад хянагч дээр өөр нэр байж болно. Энэхүү микроконтроллерын тасалдлын онцлог нь энэхүү хэрэгжилтийг маш гоёмсог болгодог нэг хэсэг юм.

Алхам 2: Тоног төхөөрөмжийн интерфейс

Тоног төхөөрөмжийн интерфейс
Тоног төхөөрөмжийн интерфейс

"Энгийн" шийдэл бол микроконтроллертой 16 холболттой "ганц туйл-16 шидэлт" унтраалгатай байх явдал юм. Шилжүүлэгчийн гаралт бүрийг микроконтроллер дээрх зүүгээр холбож, залгах байрлал бүрийг микроконтроллероор шалгаж болно. Энэ бол I/O тээглүүрийг хэт их ашиглах явдал юм. Хэрэв бид шилжүүлэгч дээр 16 -аас дээш албан тушаал (саатуулах) авахыг хүсч байвал байдал улам дордох болно. Шилжүүлэгч дээрх нэмэлт байрлал бүрт микроконтроллерт нэмэлт оролт шаардлагатай болно. Энэ нь микроконтроллерийн оролтыг маш үр ашиггүй ашиглах болно. Эргэдэг унтраалгын гоо үзэсгэлэнг оруулаарай. Эргэдэг унтраалга нь мэдээллийн хуудсан дээр А ба В гэж бичигдсэн микроконтроллерт ердөө хоёр гаралттай байдаг. AB = 00, 01, 10 ба 11. Эдгээр мөрүүдийг авч болох логик дөрвөн л түвшин байдаг. Энэ нь шилжүүлэгчийг микроконтроллерт холбоход ашиглах ёстой оролтын шугамын тоог эрс багасгадаг. Тиймээс бид оролтын шугамын тоог ердөө хоёр болгож бууруулсан. Одоо юу гэж? Бидэнд 16 өөр муж үнэхээр хэрэгтэй байгаа юм шиг санагдаж байна, гэхдээ энэ шинэ унтраалга нь ердөө дөрөв байна. Бид өөрсдийгөө хөл рүүгээ буудсан уу? Үгүй ээ. Үргэлжлүүлэн уншина уу. Бид тайлбарлахын тулд эргүүлэх товчлуурын ажиллагааны цаад онолыг бага зэрэг авч үзэх болно.

Алхам 3: Тоног төхөөрөмжийн ажиллагааны онол

Тоног төхөөрөмжийн үйл ажиллагааны онол
Тоног төхөөрөмжийн үйл ажиллагааны онол
Тоног төхөөрөмжийн үйл ажиллагааны онол
Тоног төхөөрөмжийн үйл ажиллагааны онол
Тоног төхөөрөмжийн үйл ажиллагааны онол
Тоног төхөөрөмжийн үйл ажиллагааны онол

Дээр дурдсан "ганц туйл-16 шидэлт" унтраалгыг ашиглан эргэлтийн чиглэлийг мэдрэх боломжтой боловч микроконтроллерт маш их оролт ашигладаг. Эргэдэг товчлуурыг ашиглах нь микроконтроллерийн оролтын тоог бууруулдаг боловч одоо бид шилжүүлэгчээс ирж буй дохиог тайлбарлаж, эргүүлэх чиглэл рүү хөрвүүлэх шаардлагатай байна. Энэ бол энэ шийдлийн гол дэгжин байдлын нэг юм. Энэ нь шилжүүлэгчийн байрлалд тохирох 2 битийн код байдаг гэсэн үг юм. Та бодож байж магадгүй: "Хэрэв микроконтроллерт хоёр битийн оролт байгаа бол бид бүх 16 байрлалыг хэрхэн төлөөлөх вэ?" Энэ бол сайн асуулт. Бид тэднийг бүгдийг нь төлөөлдөггүй. Эргэлтийн чиглэлийг тодорхойлохын тулд бид товчлуурын харьцангуй байрлалыг мэдэх хэрэгтэй. Бариулын үнэмлэхүй байрлал нь хамаагүй. Цагийн зүүний дагуу эргүүлэхийн тулд шилжүүлэгчийн өгсөн код нь дөрвөн саатал тутамд давтагддаг бөгөөд саарал өнгөтэй байдаг. Саарал кодчилсон гэдэг нь албан тушаалын өөрчлөлт бүрт ганцхан өөрчлөлт ордог гэсэн үг юм. AB оролтын оронд цагийн зүүний дагуу эргүүлэх тоог тоолохын оронд дараах байдлаар 00, 01, 10, 11 гэсэн утгаар дараах байдлаар өөрчлөгддөг: 00, 10, 11, 01. Сүүлийн загварын хувьд зөвхөн нэг оролт өөрчлөгдөж байгааг анхаарна уу. багц. Микроконтроллерийн AB оролтын цагийн зүүний эсрэг утгууд нь иймэрхүү харагдах болно: 00, 01, 11, 10. Энэ нь AB = 00 -ийг харуулсан цагийн зүүний эсрэг хэв маягийн урвуу хэлбэр юм. Илүү харааны тайлбарыг диаграмаас харна уу..

Алхам 4: Програм хангамжийн үйл ажиллагааны онол

Програм хангамжийн үйл ажиллагааны онол
Програм хангамжийн үйл ажиллагааны онол

Эргэлтийн чиглэлийг тодорхойлдог журам нь тасалдал юм. Таны сонгосон микроконтроллер тасалдал идэвхжсэн үед (дор хаяж) хоёр тээглүүрийн аль нэгэнд нь өөрчлөлт орсон үед хүссэн үедээ тасалдуулах боломжтой байх шаардлагатай. Үүнийг PIC16F877A дээрх PORTB өөрчлөлтийн тасалдал гэж нэрлэдэг. Шилжүүлэгчийг эргүүлэх үед микроконтроллер тасалдаж, програмын гүйцэтгэлийг тасалдлын үйлчилгээний горимд (ISR) илгээх болно. ISR нь шилжүүлэгчийг аль чиглэлд эргүүлснийг хурдан тодорхойлж, тугийг зохих ёсоор тохируулж, үндсэн програм руу хурдан буцах болно. Хэрэглэгч унтраалгыг маш хурдан эргүүлж байгаа тохиолдолд үүнийг хурдан хийх шаардлагатай байна. Бид саарал кодтой AB загварыг дөрвөн байрлал тутамд давтдаг гэдгийг мэддэг бөгөөд хэрэв бид эдгээр дөрвөн байрлалын хооронд шилжих ажлыг тогтмол хийвэл бусад бүх хүмүүст ашигтай байх болно. Нэг дөрвөн байрлалын мөчлөгт дөрвөн ирмэг байдгийг анхаарна уу. А оролт ба В оролтын хувьд дээшлэх ба буурах ирмэг. Микропроцессорыг ирмэг бүрт тасалдуулах бөгөөд энэ нь товчлуурыг эргүүлэх бүрт микроконтроллер тасалдана гэсэн үг юм. Үүний үр дүнд ISR нь бариулыг аль чиглэлд эргүүлсэн болохыг олж мэдэх хэрэгтэй. Үүнийг хэрхэн яаж хийхийг олж мэдэхийн тулд бид цагийн зүүний дагуу эргүүлэх долгионы хэлбэр рүү ханддаг. А ямар ч үед ирмэг байх тусам түүний шинэ утга нь В-ээс үргэлж ялгаатай байдгийг анхаарна уу. 1-ээс 2-р байрлал руу шилжих үед A нь логик-0-ээс логик-1 рүү шилждэг. B нь энэ шилжилтийн хувьд 0 хэвээр байгаа бөгөөд А-ийн шинэ утгатай тохирохгүй байна. 3-аас 4-р байрлал руу шилжих үед А нь унах ирмэгтэй байхад B нь логик-1 хэвээр байна. В ба А -ийн шинэ утга өөр байгааг дахин анхаарна уу. Яг одоо бид А цагийн зүүний дагуу эргүүлэх явцад тасалдал үүсгэхэд түүний шинэ утга нь В -ээс ялгаатай болохыг харж болно. Шилжүүлэгч 2 -оос 3 -р байр руу шилжих үед B нь өсөх ирмэгтэй байна. Энд B -ийн шинэ утга нь А -тай ижил байна. Цагийн зүүний дагуу эргүүлэх үлдсэн үлдсэн ирмэгийг харахад 4 -ээс 5 -р байр руу шилжих уналтын ирмэг байна. (5 -р байрлал нь 1 -р байрлалтай ижил байна.) B -ийн шинэ утга энд бас А -тай ижил байна! Бид одоо зарим хасалт хийх боломжтой боллоо! Хэрэв А нь тасалдал үүсгэж, А -ийн шинэ утга В -ээс ялгаатай бол эргэлт нь цагийн зүүний дагуу байв. Нэмж дурдахад хэрэв В тасалдал үүсгэж, В -ийн шинэ утга нь А -тай ижил байвал эргэлтийг цагийн зүүний дагуу эргүүлэв. Цагийн зүүний дагуу эргүүлэхтэй адил цагийн зүүний эсрэг эргэлт нь нэг мөчлөгийн дотор дөрвөн тасалдал үүсгэх болно: А оролтод хоёр, В оролтод хоёр, А товчлуур нь 4 -өөс 3 -р байр руу шилжих үед оролтын оролт нэмэгдэж, унах ирмэг нь 2 -оос 1 -р байр руу шилжих болно. 4. Бариул 4 -өөс 3 -р байр руу шилжих үед А -ийн шинэ утга нь В -ийн утгатай ижил байна. 2 -оос 1 -р байр руу шилжих үед түүний шинэ утга нь В -ийнхтэй адил болохыг анхаарна уу. А нь тасалдал үүсгэж, түүний шинэ утга В -тэй тэнцэх үед эргэлт нь цагийн зүүний эсрэг байсан болохыг бид харж байна. Бид бүх зүйлийг шалгахын тулд В оролтыг хурдан харах болно. Б бариул 5 -р байрлалаас (1 -тэй ижил) 4 рүү шилжих ба 3 -оос 2 -р байрнаас шилжих үед тасалдал үүснэ. Эдгээр хоёр тохиолдолд хоёуланд нь B -ийн шинэ утга нь одоо байгаа утгатай тохирохгүй байна. А нь В нь цагийн зүүний дагуу эргүүлэх тасалдал үүсгэдэг тохиолдлуудын эсрэг юм. Энэ бол сайн мэдээ. Дүгнэж хэлэхэд, хэрэв A тасалдал үүсгэж, түүний шинэ утга нь B -ийн утгатай тохирохгүй байвал, эсвэл B нь тасалдал үүсгэж, B -ийн шинэ утга нь A -ийн утгатай таарч байвал бид цагийн зүүний дагуу эргэлт хийснийг мэдэж болно. Бид бусад тохиолдлуудыг програмын цагийн зүүний эсрэг эргүүлэх эсэхийг шалгаж болно, эсвэл цагийн зүүний дагуу эргүүлээгүй тул цагийн зүүний эсрэг байсан гэж үзэж болно. Миний ердийн зүйл зөвхөн таамаглал дэвшүүлсэн.

Алхам 5: Програм хангамж

Програм хангамж
Програм хангамж
Програм хангамж
Програм хангамж

Би PIC Basic Pro дээр бүтээгдсэн тасалдлыг ашиглаагүй. Даррель Тэйлороос кодоо оруулсан хэд хэдэн файлыг ашиглаж хэвшсэн. Энэ бол Даррелд асар их гавьяа юм! Файлууд үнэгүй. Дэлгэрэнгүй мэдээлэл, бусад програмууд болон файлуудыг татаж авахын тулд түүний вэбсайтад зочлоорой. Хэрэв та Darrel Taylor тасалдсан PIC ашигладаггүй бол та энэ хэсгийг алгасаж болно. Darrel Taylor (DT) тасалдлыг тохируулахын тулд хоёр зүйлийг хийх хэрэгтэй: 1.) DT_INTS-14.bas болон ReEnterPBP.bas файлуудыг өөрийн файлд оруулах код.2.) Үүнийг хуулж кодондоо оруулна уу. ASMINT_LIST макро; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, тийм төгсгөл INT_CREATEENDASMI Зааварчилгааны төгсгөлд байгаа график шиг таб, орон зайг оруулаарай, ингэснээр та кодоо арай хялбархан харах боломжтой болно. Та үүнийг өөрийн хэрэгцээнд нийцүүлэн бага зэрэг өөрчлөх хэрэгтэй болно. Шошгоны доор ISR -ийг өөрийн ISR болох дэд програмын нэрээр солино уу. Доод зураасыг бүү мартаарай! Тасалдлыг ажиллуулахын тулд өөр хоёр зүйлийг хийх хэрэгтэй: 1.) ISR бичнэ үү. Та үүнийг PBP програмыг бичих гэж байсан шигээ бичих болно, гэхдээ та RETURN -ийн оронд дэд програмын төгсгөлд @ INT_RETURN оруулах хэрэгтэй болно. Энэ нь тасалдлыг хүлээн зөвшөөрч, програмын гүйцэтгэлийг үндсэн гогцоонд орхисон газартаа буцаана. ISR дотор та тасалдлын тугийг цэвэрлэх хэрэгтэй бөгөөд ингэснээр таны програм рекурсив тасалдалд орохгүй болно. PIC16F877A дээрх тасалдлын тугийг цэвэрлэхийн тулд PORTB -ийг уншихад л хангалттай. Өөр өөр микроконтроллер бүр тасалдлын тугуудыг цэвэрлэх өөр өөр арга барилтай байдаг. Микроконтроллерын мэдээллийн хуудсыг шалгана уу. 2.) Та кодынхоо тасалдлыг идэвхжүүлэхийг хүссэн цэгтээ хүрмэгц энэ кодын мөрийг ашиглана уу:@ INT_ENABLE RBC_INT Тасалдлыг идэвхгүй болгохыг хүсвэл:@ INT_DISABLE RBC_INT Маш их зүйл байдаг. миний бичсэн зүйлд багтах зүйлсийн талаар би товчхон хэлье. Одоогоор таны хөтөлбөр иймэрхүү харагдах ёстой:; Шаардлагатай тохиргоо эсвэл код "DT_INTS-14.bas" INCLUDE "ReEnterPBP.bas" ASMINT_LIST макро; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, тийм төгсгөл INT_CREATEENDASM; Бусад шаардлагатай тохиргоо эсвэл код@ INT_ENABLE RBC_INT; Бариул ямар чиглэлд эргэж байгааг мэдэх шаардлагатай код@ INT_DISABLE RBC_INT; Бусад кодEND; ProgrammyISR -ийн төгсгөл:; ISR код энд@ INT_RETURN (Тасалдлын зохицуулагчийг тохируулах хүснэгт) PIC эсвэл DT тасалдал ашигладаггүй хүн дахин нэгдэх боломжтой гэж би бодож байна. Одоо бид ISR -ийг бичих ёстой бөгөөд ингэснээр микроконтроллер нь бариул ямар чиглэлд эргэж байгааг мэдэх болно. Хэрэв бид тасалдал үүсгэсэн оролт, түүний шинэ утга болон бусад оролтын утгыг мэдэж байвал эргэлтийн чиглэлийг гаргаж чадна гэдгийг програм хангамжийн онолын хэсгээс эргэн санаарай. Псевдокод энд байна: Тасалдлын тугийг цэвэрлэхийн тулд PORTB -ийг зураасны хувьсагч болгон уншина уу. А тасалдал үүсгэсэн эсэхийг шалгана уу. Хэрэв үнэн бол А ба В -г харьцуулаарай. Хэрэв өөр, өөр бол цагийн зүүний дагуу эргэж, В тасалдал үүсгэсэн эсэхийг цагийн зүүний эсрэг EndifCheck болгон шалгаарай. Хэрэв үнэн бол А ба В -г харьцуулаарай Хэрэв ялгаатай бол мөн цагийн зүүний эсрэг эргэлт байсан эсэхийг шалгаарай. Энэ нь цагийн зүүний эсрэг байсан EndifЦагалтаас буцах А эсвэл В дээрх өөрчлөлт тасалдал үүсгэсэн эсэхийг бид хэрхэн мэдэх вэ? Өөрчлөгдсөн оролт болон бусад (өөрчлөгдөөгүй) оролтын шинэ утгыг олж мэдэх нь хялбар байдаг, учир нь бид тэдгээрийг ISR дотор уншиж чаддаг. Цаазаар авах ялыг ISR руу илгээхээс өмнө хүн бүрийн байдал ямар байсныг бид мэдэх хэрэгтэй. Энэ нь үндсэн горимд тохиолддог. Үндсэн горим нь CWflag гэж нэрлэсэн байтын хувьсагчийг 1 болгож тохируулах эсвэл ISR -ээр 0 болгож цэвэрлэхийг хүлээж байна. Товчлуурыг хүлээн зөвшөөрсөн өөрчлөлт бүрийн дараа эсвэл ямар ч товчлуур байхгүй бол хувьсагчийг 5 болгож тохируулаад сул зогсолтыг харуулна. Хэрэв туг тохируулагдах эсвэл цэвэрлэгдэх юм бол үндсэн горим нь эргэлтэнд үндэслэн тогтоосон даралтын даралтыг даруй нэмэгдүүлж эсвэл бууруулж, дараа нь бариул дахин идэвхгүй байгаа тул CWflag хувьсагчийг буцааж 5 болгоно. Үндсэн ажил нь CWflag -ийг шалгаж байгаа тул A ба B эргэдэг унтраалгын утгыг мөн баримтжуулж байна. Энэ бол үнэхээр энгийн бөгөөд иймэрхүү харагдаж байна: oldA = AoldB = B Энд үнэхээр гайхалтай зүйл алга. CWflag -ийг эргүүлэх эсэхийг шалгадаг давталтын эхэнд эдгээр хоёр мөрийг оруулна уу. ISR -ийг гүйцэтгэх үед ямар оролт тасалдал үүсгэсэн болохыг олж мэдэхийн тулд бид зүгээр л нэмэгдэх/бууруулах давталтын дотор эргэлддэг бариулаас оруулсан оролтуудын логик утгыг шинэчилж байна. ISR код энд байна: ABchange: scratch = PORTB 'PORTB -г уншаад тасалдлын тугийг арилгана уу' Хэрэв A тасалдал үүсгэвэл B эргэх чиглэлийг шалгана уу IFA! A! = B THOT GOTO CW 'Үгүй бол энэ нь цагийн зүүний эсрэг эргэлт байсан ELSE GOTO CCW ENDIF ENDIF' Хэрэв В тасалдал үүсгэвэл эргэх чиглэлийг A oldB! = B THEN 'A ба B ижил байвал энэ нь байсан бол цагийн зүүний дагуу эргүүлэх байсан бол A == B THEN GOTO CW 'Үгүй бол энэ нь цагийн зүүний эсрэг эргэлт байв. ISR нь A ба B оролтын хуучин утгуудтай тул энэ нь ямар оролт тасалдал үүсгэсэн болохыг тодорхойлж, нөгөө (өөрчлөгдөөгүй) оролттой харьцуулж, чиглэлийг тодорхойлж болно. эргэлт. Гол хийх ёстой бүх зүйл бол CWflag -ийг шалгаж, бариул аль чиглэл рүү эргэж байгааг харах боломжтой (хэрэв байгаа бол), тоолуур, хүссэн цэг, хүссэн зүйлээ нэмэгдүүлэх эсвэл багасгах. Энэ нь тусалсан гэж найдаж байна. ойлгомжгүй Энэ төрлийн интерфейс нь таны систем аль хэдийн тасалдал ашиглаж байгаа бол энэ нь ялангуяа ашигтай байдаг. Зугаацаарай!

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