critix Posted November 26, 2015 Share Posted November 26, 2015 Salutare! Nu aveti cumva vreun exemplu de citire a unui rotary encoder ("potentiometru" de volum de la casetofon de masina, asa ceva vreau sa folosesc) cu ajutorul unui pic 12f675? Dar sa nu fie in asm Va multumesc anticipat. Am tot cautat pe net, incercat exemple... dar nu imi iese...din pacate... Link to comment
alcon Posted November 26, 2015 Share Posted November 26, 2015 Luhan Monat din Mesa Arizona are o sursa (Bench Supply) cu encoder, poate te inspira:http://mondo-technology.com/ Link to comment
djvas Posted November 26, 2015 Share Posted November 26, 2015 incearca codul asta : // encoderul este conectat la PORTB , pinii 4 si 5Var encoder,oldencoder:byte;encoder:=portb and 0x30;oldencoder:=encoder;while (1) do begin encoder:=PORTB and 0x30; if encoder<>oldencoder then if encoder.RB4=oldencoder.RB5 then ..... //encoder cw else ..... // encoder ccw end; Link to comment
critix Posted November 28, 2015 Author Share Posted November 28, 2015 Din pacate... nu imi iese... o sa mai sap... poate gasesc ceva ... Multumesc pt exemple... Link to comment
djvas Posted November 28, 2015 Share Posted November 28, 2015 Daca ai da mai multe detalii , eventual schema folosita poate ai avea mai multe sanse sa primesti un raspuns (eventual cod) concret. Link to comment
daniel_88 Posted November 28, 2015 Share Posted November 28, 2015 Te poti inspira si de aici: http://www.emil.matei.ro/digpot1.php http://www.emil.matei.ro/digpot2.php http://www.emil.matei.ro/digpot3.php 1 Link to comment
lrai Posted November 28, 2015 Share Posted November 28, 2015 Ai grijă sa-i faci debounce-ing hardware ca majoritatea encoderelor astea ieftine sunt tragice din punctul asta de vedere. Pui pe un osciloscop înainte să vezi semnalul curat și după aia te ocupi de software altfel alergi după cai verzi pe pereți. Link to comment
critix Posted November 28, 2015 Author Share Posted November 28, 2015 (edited) Concret... Am un rotary encoder, din acela ce se folosesc pe post de "potentiometru" la cd-urile auto. De pe un cd auto l-am recuperat. El este legat la un pic 12f675 pe porturile 2 si 3. Pe porturile 5 si 6 am cate un led. Doresc ca atunci cand rotesc spre stanga sa se aprinda un led, iar cand ii spre dreapta, celalalt led... Ii ceva simplist, zic eu, dar nu reusesc Folosesc ca si limbaj de programare basic-ul, in proton basic. Osciloscop nu am, asa ca nu pot sa vad semnalul... din pacate. Va multumesc pentru ajutoare... Edited November 28, 2015 by critix Link to comment
Mondan Posted November 28, 2015 Share Posted November 28, 2015 Incearca sa pornesti de la mai simpu. El are 2 contacte. Deci verifici daca s-a facut primul contact si aprinzi un LED 1 secunda! Astfel, in orice directie vei roti se va aprinde un LED 1 secunda. Apoi la fel si cu ce-l de-al doilea contact. Vezi daca la rotire se dechid sau se inchid, nu mai siu excat. --------------------------------------- Logica e asa. Care contact s-a facut prmul si care s-a facut al doilea, arata sensul de rotatie. Ai nevoie de un delay foarte mic intre verificarile celor 2 contacte. Link to comment
Mondan Posted November 28, 2015 Share Posted November 28, 2015 Si posteaza si poze sau filmulet. PS: verifica cu un aparat de masura cum se fac contactele alea la rotire. E normal inchis sau normal deschis? Eu am un encoder, inca nu l-am folosit. PS2: daca vrei o solutie 'la cheie' cu PIC12F675 si un Encoder trimisa prin posta....discutam Link to comment
critix Posted November 28, 2015 Author Share Posted November 28, 2015 Encoderul este pe pinii 2 si 3, adica pe GPIO 4 si GPIO 5 Ceva de genul respectiv incerc sa fac: New_Bits=GPIO & %110000 >>4loop: New_Bits = GPIO & %110000 >> 4 If (New_Bits & %110000) = (Old_Bits & %110000) Then DoneRotEnc RotEncDir = New_Bits.4 ^ Old_Bits.5 If RotEncDir = 1 Then led1=1 delayms 1000 led1=0 delayms 1000 Else led2=1 delayms 1000 led2=0 delayms 1000 EndIf GoTo loopDoneRotEnc: Old_Bits = New_BitsGoTo loop Link to comment
Liviu M Posted November 28, 2015 Share Posted November 28, 2015 Cea mai mare problema cred ca e ca, dupa ce citesti, deplasezi rezultatul la dreapta si dupa aia lucrezi cu bitii originali. Ori nu mai deplasezi si lucrezi cu bitii 4 & 5, ori deplasezi si lucrezi cu 0&1. Pe de alta parte, celel 100 ms delay cred ca-s mult. Deplasarea se detecteaza in functie de pozitia anterioara. Daca tu faci asa pauze intre citiri, nu poti detecta corect directia. De obicei, ca sa nu ratezi modificari, se folosesc intreruperi - se modifica un pin, intri in intrerupere si citesti portul. Resetezi flagul, iesi din intrerupere si faci prelucrarile. Din pacate nu stiu cum se face asta in basicul tau. Link to comment
Mondan Posted November 28, 2015 Share Posted November 28, 2015 Nici eu nu am lucrat in embedded BASIC, dar: New_Bits=GPIO & %110000 >>4loop: led1=1 led2=1GoTo loop Se aprind ambele LED-uri pana aici ? Daca da, mergem mai departe........ Link to comment
Elison Posted November 28, 2015 Share Posted November 28, 2015 (edited) Pentru citirea encoderului este recomandat sa folosesti intreruperile. Cel mai bine este sa folosesti interrupt on change. Ai mare grija la setarea bitilor de configurare. Edited November 28, 2015 by Elison Link to comment
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now