Përmbajtje:

Si të interpretoni drejtimin e rrotullimit nga një ndërprerës dixhital rrotullues me një PIC: 5 hapa
Si të interpretoni drejtimin e rrotullimit nga një ndërprerës dixhital rrotullues me një PIC: 5 hapa

Video: Si të interpretoni drejtimin e rrotullimit nga një ndërprerës dixhital rrotullues me një PIC: 5 hapa

Video: Si të interpretoni drejtimin e rrotullimit nga një ndërprerës dixhital rrotullues me një PIC: 5 hapa
Video: Как сделать автоматический самодельный инкубатор для яиц, легко, шаг за шагом, дешево и быстро 2024, Nëntor
Anonim
Si të interpretoni drejtimin e rrotullimit nga një ndërprerës dixhital rrotullues me një PIC
Si të interpretoni drejtimin e rrotullimit nga një ndërprerës dixhital rrotullues me një PIC

Qëllimi i këtij udhëzuesi është të ilustrojë se si të ndërlidhni një ndërprerës dixhital (të koduar me kuadraturë) me një mikrokontrollues. Mos u shqetësoni, unë do të shpjegoj se çfarë do të thotë kuadratura e koduar për ne. Kjo ndërfaqe dhe softueri shoqërues do të lejojnë që mikrokontrolluesi të njohë drejtimin e rrotullimit për secilën lëvizje nga një kapës në tjetrin. Kohët e fundit kam përdorur këtë lloj ndërprerës në një projekt mikrokontrollues që kërkonte që një pikë e caktuar presioni të futet duke përdorur një çelës me 16 ndalon në vend të butonave lart/poshtë. Ideja ishte që të lejohej përdoruesi të "telefononte" presionin e dëshiruar. Si rezultat, na u desh të zhvillonim një rutinë softuerike për të marrë informacionin e pozicionit nga ndërprerësi dhe për të nxjerrë përfundimin e drejtimit të rrotullimit në mënyrë që të rrisim ose ulim pikën e vendosur të presionit për sistemin kryesor. Në këtë Udhëzues, unë do të mbuloj ndërfaqen fizike te mikrokontrolluesi, teoria e funksionimit për ndërprerësin rrotullues, teoria e funksionimit për softverin si dhe rutina e zbritjes. Më në fund, unë do t'ju tregoj aplikimin tim për rutinën e zbritjes. Ndërsa përparojmë, do të përpiqem t'i mbaj gjërat disi të përgjithshme në mënyrë që ideja të mund të aplikohet në sa më shumë platforma të jetë e mundur, por gjithashtu do të ndaj atë që kam bërë në mënyrë që të shihni një aplikim specifik.

Hapi 1: Pjesët

Pjesët
Pjesët

Për ta zbatuar këtë, do t'ju duhet: Një ndërprerës rrotullues (i koduar me kuadraturë) Tërhiqni rezistencat Platforma e përshtatshme e mikrokontrolluesve Për projektin tim, kam përdorur një kodues optik Grayhill 61C22-01-04-02. Fleta e të dhënave për ndërprerësin rrotullues bën thirrje për rezistencë tërheqëse prej 8.2khm në dy linjat e të dhënave që vijnë nga ndërprerësi. Ju do të dëshironi të kontrolloni fletën e të dhënave për kodifikuesin që zgjidhni të përdorni. Çelësi rrotullues që kam përdorur gjithashtu mund të porositet me një ndërprerës aksial të butonit. Ashtë një veçori e dobishme për kryerjen e zgjedhjeve që janë thirrur, etj, por unë nuk do të diskutoj këtu për ndërfaqen e tij. Unë kam një "platformë të përshtatshme për mikrokontrollues" të listuar sepse (mendoj) kjo mund të zbatohet në më shumë se një platformë. Unë kam parë shumë njerëz që përdorin mikrokontrollues të tjerë për Instructables kështu që unë dua të tregoj qasjen e përgjithshme gjithashtu. Kam shkruar të gjithë kodin në PIC Basic Pro për përdorim me një mikroçip PIC16F877A. Në të vërtetë, gjëja kryesore që ju nevojitet në mikrokontrollues është aftësia për të ndërprerë kur ka një ndryshim logjik në njërën nga dy kunjat. Në PIC16F877A, kjo quhet ndërprerja e ndryshimit PORTB. Mund të ketë emra të tjerë për të në kontrolluesit e tjerë. Kjo veçori e ndërprerjes së mikrokontrolluesit është pjesë e asaj që e bën këtë zbatim kaq elegant.

Hapi 2: Ndërfaqja e harduerit

Ndërfaqja e harduerit
Ndërfaqja e harduerit

Një zgjidhje "e thjeshtë" do të ishte të kishit një çelës "hedhje të vetme të shtyllës-16" me 16 lidhje me mikrokontrolluesin. Çdo dalje e ndërprerës do të lidhet më pas me një kunj në mikrokontrollues në mënyrë që çdo pozicion i numrit të kontrollohet nga mikrokontrolluesi. Ky është një përdorim i tepërt i kunjave I/O. Gjërat bëhen edhe më keq nëse duam më shumë se 16 pozicione (të ndaluara) në dispozicion për ne në ndërprerës. Çdo pozicion shtesë në ndërprerës do të kërkonte një hyrje shtesë për mikrokontrolluesin. Kjo shpejt bëhet një përdorim shumë joefikas i hyrjeve në një mikrokontrollues. Futni bukurinë e ndërprerësit rrotullues. Çelësi rrotullues ka vetëm dy dalje në mikrokontrolluesin e shënuar si A dhe B në fletën e të dhënave. Ekzistojnë vetëm katër nivele të mundshme logjike që mund të marrin këto rreshta: AB = 00, 01, 10 dhe 11. Kjo zvogëlon shumë numrin e linjave hyrëse që duhet të përdorni në lidhjen e ndërprerësit me mikrokontrolluesin. Pra, ne kemi ulur numrin e linjave të hyrjes në vetëm dy. Tani Cfare? Duket sikur na duhen vërtet 16 shtete të ndryshme, por ky ndërrues i ri ka vetëm katër. A e kemi qëlluar veten në këmbë? Jo Lexo. Ne do të mbulojmë pak teorinë që qëndron prapa funksionimit të ndërprerës rrotullues për të shpjeguar.

Hapi 3: Teoria e operimit të harduerit

Teoria e operimit të harduerit
Teoria e operimit të harduerit
Teoria e operimit të harduerit
Teoria e operimit të harduerit
Teoria e operimit të harduerit
Teoria e operimit të harduerit

Ndjenja e drejtimit të rrotullimit është e mundur duke përdorur çelësin e lartpërmendur "hedhje me një shtyllë-16", por ai përdor shumë hyrje në mikrokontrollues. Përdorimi i çelësit rrotullues zvogëlon numrin e hyrjeve në mikrokontrollues, por tani ne duhet të interpretojmë sinjalet që vijnë nga ndërprerësi dhe t'i përkthejmë ato në një drejtim rrotullimi. Unë përmenda më herët se çelësi ishte i koduar me kuadraturë. Kjo është gjithashtu një nga hijeshitë kryesore në këtë zgjidhje. Kjo do të thotë se ekziston një kod 2-bit që jep çelësi që korrespondon me pozicionin e ndërprerësit. Ju mund të jeni duke menduar: "Nëse ka një hyrje dy bit për mikrokontrolluesin, si i përfaqësojmë të 16 pozicionet?" Kjo është një pyetje e mirë. Ne nuk i përfaqësojmë të gjithë. Ne vetëm duhet të dimë pozicionet relative të çelësit në mënyrë që të mund të përcaktojmë drejtimin e rrotullimit. Pozicioni absolut i çelësit nuk ka rëndësi. Për rrotullimin në drejtim të akrepave të orës, kodi që jep ndërprerësi përsëritet çdo katër ndalime dhe është i koduar gri. Gri i koduar do të thotë që ka vetëm një ndryshim të vogël për çdo ndryshim pozicioni. Në vend që hyrja AB të numërohet për rrotullimin e akrepave të orës në binar si kjo: 00, 01, 10, 11, ajo ndryshon kështu: 00, 10, 11, 01. Vini re se për modelin e fundit, ekziston vetëm një hyrje që ndryshon midis grupe. Vlerat e kundërta të akrepave të orës për hyrjen AB në mikrokontrollues do të duken kështu: 00, 01, 11, 10. Kjo është thjesht e kundërta e modelit të akrepave të orës me AB = 00 të listuara së pari. Hidhini një sy diagrameve për një shpjegim më vizual Me

Hapi 4: Teoria e Funksionimit të Softuerit

Teoria e Funksionimit të Softuerit
Teoria e Funksionimit të Softuerit

Rutina që nxjerr në përfundim drejtimin e rrotullimit drejtohet nga ndërprerja. Mikrokontrolluesi që ju zgjidhni duhet të jetë në gjendje të ndërpresë çdo herë që ka një ndryshim në njërën prej (të paktën) dy kunjave kur ndërprerja është e aktivizuar. Kjo quhet ndërprerja e ndryshimit PORTB në PIC16F877A. Sa herë që ndërrohet ndërprerësi, mikrokontrolluesi do të ndërpritet dhe ekzekutimi i programit do të dërgohet në Rutinën e Shërbimit të Ndërprerjes (ISR). ISR do të kuptojë shpejt se në cilën mënyrë u ndërrua çelësi, do të vendosë një flamur në mënyrë të përshtatshme dhe shpejt do të kthehet në programin kryesor. Ne kemi nevojë që kjo të ndodhë shpejt në rast se përdoruesi rrotullon çelësin shumë shpejt. Ne e dimë që modeli gri i koduar AB përsëritet çdo katër pozicione, kështu që nëse e bëjmë punën rutinë për kalimet midis atyre katër pozicioneve, do të funksionojë për të gjithë të tjerët. Vini re se në një cikël me katër pozicione, ka katër skaje. Një buzë në rritje dhe një buzë në rënie për hyrjen A, si dhe hyrjen B. Mikroprocesori do të ndërpritet sa herë që ka një skaj që do të thotë se mikrokontrolluesi do të ndërpritet sa herë që çelësi të kthehet. Si rezultat, ISR duhet të kuptojë se në cilën drejtim është kthyer doreza. Për të na ndihmuar të kuptojmë se si ta bëjmë këtë, ne i drejtohemi formës së valës për rrotullimin në drejtim të akrepave të orës. Vini re se çdo herë që A ka një avantazh, vlera e saj e re është gjithmonë e ndryshme nga ajo e B. Kur çelësi kalon nga pozicioni 1 në 2, A kalon nga logjika-0 në logjikën-1. B është akoma 0 për këtë kalim dhe nuk përputhet me vlerën e re të A. Kur çelësi kalon nga pozicioni 3 në 4, A ka një avantazh në rënie ndërsa B mbetet në logjikën-1. Vini re përsëri, se B dhe vlera e re e A janë të ndryshme. Tani për tani, ne mund të shohim se në çdo kohë A shkakton ndërprerjen gjatë rrotullimit të akrepave të orës, vlera e saj e re është e ndryshme nga ajo e B. Le të kontrollojmë B për të parë se çfarë ndodh. B ka një avantazh në rritje kur kaloni kalon nga pozicioni 2 në 3. Këtu, vlera e re e B është e njëjtë me A. Duke parë skajin e fundit të mbetur për rrotullimin e akrepave të orës, B ka një skaj që bie duke lëvizur nga pozicioni 4 në 5. (Pozicioni 5 është i njëjtë me pozicionin 1.) Vlera e re e B është e njëjtë me A edhe këtu! Tani mund të bëjmë disa zbritje! Nëse A shkakton ndërprerjen dhe vlera e re e A është e ndryshme nga ajo e B, rrotullimi ishte në drejtim të akrepave të orës. Përveç kësaj, nëse B shkakton ndërprerjen dhe vlera e re e B është e njëjtë me A, atëherë rrotullimi ishte në drejtim të akrepave të orës. Le të shqyrtojmë shpejt rastin e rrotullimit në drejtim të kundërt të akrepave të orës. Ashtu si rrotullimi në drejtim të akrepave të orës, rrotullimi kundër akrepave të orës do të shkaktojë katër ndërprerje në një cikël: dy për hyrjen A dhe dy për hyrjen B. Hyrja A ka një avantazh në rritje kur çelësi lëviz nga pozicioni 4 në 3 dhe një skaj në rënie që lëviz nga pozicioni 2 në 1 Kur çelësi lëviz nga pozicioni 4 në 3, vlera e re e A është e njëjtë me vlerën e B. Vini re se kur A lëviz nga pozicioni 2 në 1, vlera e saj e re është e njëjtë me atë të B gjithashtu. Tani, ne mund të shohim se kur A shkakton ndërprerjen dhe vlera e saj e re përputhet me atë të B, rrotullimi ishte në drejtim të kundërt. Shpejt, ne do të shikojmë hyrjen B për të verifikuar gjithçka. B do të shkaktojë një ndërprerje kur çelësi lëviz nga pozicioni 5 (i cili është i njëjtë me 1) në 4 dhe kur çelësi lëviz nga pozicioni 3 në 2. Në të dyja këto raste, vlera e re e B nuk përputhet me vlerën ekzistuese e A e cila është e kundërta e rasteve kur B shkakton ndërprerjen për rrotullimin e akrepave të orës. Ky është një lajm i mirë. Çdo gjë del si duhet. Për ta përmbledhur, nëse A shkakton ndërprerjen dhe vlera e saj e re nuk përputhet me vlerën e B ose nëse B shkakton ndërprerjen dhe vlera e re e B përputhet me vlerën e A që ne e dimë se ka pasur rrotullim në drejtim të akrepave të orës. Ne mund të kontrollojmë rastet e tjera për rrotullimin e akrepave të orës në softuer ose mund të supozojmë se për shkak se nuk ishte rrotullimi në drejtim të akrepave të orës ishte në drejtim të kundërt. Rutina ime thjesht bëri supozimin.

Hapi 5: Softuer

Softuer
Softuer
Softuer
Softuer

Unë nuk kam përdorur ndërprerjet e integruara në PIC Basic Pro. Kam përdorur disa skedarë që kam përfshirë në kodin tim nga Darrel Taylor për të drejtuar rutinën. Këtu i takon një meritë e madhe Darrel! Skedarët janë falas. Thjesht vizitoni faqen e tij të internetit për më shumë informacion, aplikacione të tjera dhe për të shkarkuar skedarët. Ju mund ta kaloni këtë pjesë nëse nuk jeni duke përdorur një PIC me ndërprerjet e Darrel Taylor. Thjesht vendosni ndërprerjet sipas nevojës në platformën që përdorni. Për të krijuar ndërprerjet e Darrel Taylor (DT) ka dy gjëra për të bërë: 1.) Përfshini skedarët DT_INTS-14.bas dhe ReEnterPBP.bas në dosjen tuaj kodi.2.) Kopjoni dhe ngjisni këtë në kodin tuaj. ASMINT_LIST makro; IntSource, Label, Type, ResetFlag? INT_Handler RBC_INT, _ISR, PBP, po endm INT_CREATEENDASMIFutni skedat dhe hapësirat si grafiku në fund të Instructable, në mënyrë që t'i shihni gjërat pak më lehtë në kodin tuaj. Ju do të duhet ta modifikoni pak për t'iu përshtatur nevojave tuaja. Nën Etiketën, zëvendësoni ISR me emrin e nën -programit që është ISR juaj. Mos harroni nënvizimin! Ju keni nevojë për të! Për të funksionuar ndërprerjet, ka edhe dy gjëra për të bërë: 1.) Shkruani ISR. Ju do ta shkruani këtë ashtu siç do të shkruanit një nënrutinë PBP përveç se do t'ju duhet të futni @ INT_RETURN në fund të nënrutinës në vend të RETURN. Kjo do të pranojë ndërprerjen dhe do të kthejë ekzekutimin e programit aty ku është lënë në lakin kryesor. Brenda ISR, duhet të pastroni flamurin e ndërprerjes në mënyrë që programi juaj të mos kapet në një ndërprerje rekursive. Thjesht leximi i PORTB është gjithçka që duhet bërë për të pastruar flamurin e ndërprerjes në PIC16F877A. Çdo mikrokontrollues i ndryshëm ka një mënyrë të ndryshme të pastrimit të flamujve të ndërprerjes. Kontrolloni fletën e të dhënave për mikrokontrolluesin tuaj. 2.) Kur të arrini pikën në kodin tuaj që dëshironi të aktivizoni ndërprerjen, përdorni këtë linjë të kodit:@ INT_ENABLE RBC_INTKur doni të çaktivizoni ndërprerjen thjesht përdorni:@ INT_DISABLE RBC_INTKa shumë gjëra të paketuara në atë që sapo mbulova, kështu që do t'i përmbledh shpejt. Deri më tani, programi juaj duhet të duket diçka si kjo:; Ndonjë konfigurim ose kod i nevojshëm PCRFSHIR "DT_INTS-14.bas" PCRFSHIJ "Makro ASMINT_LIST" ReEnterPBP.bas "; IntSource, Etiketa, Lloji, ResetFlag? INT_Handler RBC_INT, _myISR, PBP, po endm INT_CREATEENDASM; Çdo konfigurim tjetër i nevojshëm ose kodoni@ INT_ENABLE RBC_INT; Kodi që duhet të dijë se në cilën drejtim rrotullohet çelësi@ INT_DISABLE RBC_INT; Kod tjetërEND; Fundi i programmyISR:; Kodi ISR këtu@ INT_RETURN (Ndërprerësi i Konfigurimit të Tabelave) Unë mendoj se kjo është ajo ku çdokush që nuk po përdor ndërprerjet e PIC ose DT mund të bashkohet përsëri. Tani, ne duhet të shkruajmë ISR në mënyrë që mikrokontrolluesi të dijë se në cilën drejtim rrotullohet çelësi. Kujtoni nga pjesa e teorisë së softuerit se mund të nxjerrim drejtimin e rrotullimit nëse e dimë hyrjen që shkaktoi ndërprerjen, vlerën e saj të re dhe vlerën e hyrjes tjetër. Këtu është pseudokodi: Lexoni PORTB në një ndryshore gërvishtëse për të pastruar flamurin e ndërprerjes Kontrolloni nëse A e ka shkaktuar ndërprerjen. Nëse është e vërtetë, Krahasoni A dhe B. Kontrolloni nëse janë të ndryshme, nëse janë të ndryshme, Ishte rrotullim në drejtim të akrepave të orës Tjetër, Ishte EndifCheck në drejtim të kundërt të orës nëse B shkaktonte ndërprerjen. Nëse është e vërtetë, Krahasoni A dhe B Kontrolloni nëse është e ndryshme, nëse është e njëjtë, Ishte rrotullim në drejtim të akrepave të orës Tjetër, Ishte në drejtim të akrepave të orës Kthimi nga ndërprerja Si e dimë nëse një ndryshim në A ose B shkaktoi ndërprerjen? Zbulimi i vlerës së re të hyrjes së ndryshuar dhe hyrjes tjetër (të pandryshuar) është e lehtë sepse ne mund t'i lexojmë ato brenda ISR. Ne duhet të dimë se cila ishte gjendja e secilit para se ekzekutimi të dërgohet në ISR. Kjo ndodh në rutinën kryesore. Rutina kryesore ulet dhe pret që një variabël byte që ne e quajtëm CWflag të vendoset në 1 ose të pastrohet në 0 nga ISR. Pas çdo ndryshimi të pranuar të çelësit ose nëse nuk ka aktivitet të çelësit, ndryshorja vendoset në 5 për të treguar një gjendje boshe. Nëse flamuri vendoset ose pastrohet, rutina kryesore menjëherë rrit ose zvogëlon presionin e pikës së caktuar në mënyrë të përshtatshme bazuar në rrotullim dhe më pas e vendos ndryshoren CWflag në 5 sepse çelësi tani është përsëri boshe. Ndërsa rutina kryesore është kontrollimi i CWflag, po dokumenton gjithashtu gjendjen e vlerave të ndërruesit rrotullues A dhe B. Kjo është me të vërtetë e thjeshtë dhe duket kështu: oldA = AoldB = BNuk ka vërtet asgjë super të zbukuruar këtu. Thjesht përfshini ato dy rreshta në fillim të lakut që kontrollon CWflag për rrotullim. Ne thjesht po përditësojmë vlerat logjike të hyrjeve nga çelësi rrotullues brenda lakut të rritjes/zvogëlimit në rutinën kryesore, në mënyrë që të shohim se çfarë hyrje ka shkaktuar ndërprerjen kur ekzekutohet ISR. Këtu është kodi ISR: ABchange: scratch = PORTB 'Lexoni PORTB për të pastruar flamurin e ndërprerjes' Nëse A shkakton ndërprerjen, kontrolloni B për drejtimin e rrotullimit NFSE oldA! = A PASTAJ 'Nëse A dhe B janë të ndryshëm, ishte rrotullimi i akrepave të orës IF A! = B PASAJ GOTO CW 'Përndryshe, ishte rrotullim kundër akrepave të orës TJERE GOTO CCW ENDIF ENDIF' Nëse B shkakton ndërprerjen, kontrolloni A për drejtimin e rrotullimit NFSE OldB! = B PASTAJ 'Nëse A dhe B janë të njëjtë, është ishte rrotullimi në drejtim të akrepave të orës IF A == B PASAJ GOTO CW 'Përndryshe, ishte rrotullim kundër akrepave të orës ELSE GOTO CCW ENDIF ENDIFCW: CWflag = 1@ INT_RETURNCCW: CWflag = 0@ INT_RETURNKam përfshirë kodin ISR në një skedar AB_ISR.bas sepse skedat në kod nuk po shfaqen ashtu siç duhet. Tani, sepse ISR ka vlerat e vjetra për hyrjet A dhe B, mund të përcaktojë se cila hyrje ka shkaktuar ndërprerjen, ta krahasojë atë me hyrjen tjetër (të pandryshuar) dhe të përcaktojë drejtimin të rrotullimit. E tëra që rutina kryesore duhet të bëjë është të kontrolloni CWflag për të parë se në cilin drejtim është kthyer doreza (nëse ka) dhe të shtoni ose zvogëloni një numërues, pikë të caktuar ose çfarëdo që ju pëlqen ose keni nevojë. Shpresoj se kjo ndihmon dhe nuk ka qenë shumë konfuze Ky lloj ndërfaqeje është veçanërisht i dobishëm nëse sistemi juaj tashmë po përdor ndërprerje pasi kjo është vetëm një ndërprerje tjetër për të shtuar. Shijoni!

Recommended: