critix Postat Mai 28, 2014 Partajează Postat Mai 28, 2014 (editat) Salutare Am o rugaminte... Am un satelit comanda volan, la care folosesc switch-urile. Mi-a ramas nefolosit rotita din spatele lui. Acea rotita are 4 fire. Un fir comun, iar restul 3 switch-uri, in functie de rotare. Ar veni 1 - 2 - 3 sau 3- 2- 1. Ma intereseaza sa folosesc acea rotita pentru a schimba temporizarea la stergatoarele de parbriz. As face schema din imagine. As folosi doar 2 pozitii. Problema este... cum pot in pic 12f675 sa verific daca rotesc intr-o parte sau in cealalta acea rotita. Limbajul de programare... oricare.. (mai putin asm-ul ;) ) Multumesc anticipat. Editat Mai 28, 2014 de critix Link spre comentariu
Liviu M Postat Mai 28, 2014 Partajează Postat Mai 28, 2014 Folosind un singur pin al pic-ului in mod sigur n-ai cum sa te prinzi de directie. *) Pe de alta parte, encoderele (ca cel din mouse-ul cu bila, de exemplu) nu trimit numai sw1-sw2-sw1-sw2... ci au mai multe stari (pentru 2 switch-uri ar trebi sa iasa 4 stari, vezi "diagramale" de functionare din documentatii de encodere) cu ajutorul careia te poti prinde de directie. *) M-am mai uitat o data si am vazut ca ai rezistente de valori diferite inseriate cu switch-urile, ceea ce sugereaza ca vrei sa folosesti adc-ul pentru "masuratori", da' nu ma prind cum ar trebui sa functioneze. Link spre comentariu
critix Postat Mai 28, 2014 Autor Partajează Postat Mai 28, 2014 Bun... nu neaparat sa folosesc un singur pin... Daca as folosi 2 pini, cum ar trebui facut? Link spre comentariu
Liviu M Postat Mai 28, 2014 Partajează Postat Mai 28, 2014 (editat) Pai ti-am zis, pui osciloscopul/aparatul de masura pe pinii encoderului (rotitei) intre switchiuri si rezistente (cu celalat capat al rezistentelor la VDD), rasucesti de rotita si vezi ce obtii la iesiri. In program salvezi starea curenta si, la o modificare, compari starea curenta cu ce obtii si decizi directia de rasucire. Cam asa arata la mine bucata de cod in care prelucrez un encoder (am sters ce nu era legat de prelucrarea encoderului): if (bNewEncData) //am detectat o intrerupere la encoder { bNewEncData = 0; ucEncNewVal = ucEncNewVal & 0x30; // mask al other bits switch (ucEncNewVal) //detectez sensul de rotatie in functie de starea anterioara si starea actuala { case 0x00: if (ucOldEncValue == 0x10) ucEncDir = 'D'; else if (ucOldEncValue == 0x20) ucEncDir = 'S'; break; case 0x10: if (ucOldEncValue == 0x30) ucEncDir = 'D'; else if (ucOldEncValue == 0x00) ucEncDir = 'S'; break; case 0x20: if (ucOldEncValue == 0x00) ucEncDir = 'D'; else if (ucOldEncValue == 0x30) ucEncDir = 'S'; break; case 0x30: if (ucOldEncValue == 0x20) ucEncDir = 'D'; else if (ucOldEncValue == 0x10) ucEncDir = 'S'; break; default: ucEncDir = 'N'; break; } //switch ucOldEncValue = ucEncNewVal; //memoreaza valoarea actuala a encoderului pentru urmatoarea rotire ucOldEncDir = ucEncDir; //memoreaza directia actuala de rotire. TMR1IE = 1; INTCONbits.RBIF = 0; INTCONbits.RBIE = 1; } //if(bNewEncData) Detectia propriuzisa o fac prin intreruperi: void interrupt isr(void){ if(INTCONbits.RBIE && INTCONbits.RBIF) { //RB4-RB5 - rotary encoder INTCONbits.RBIE = 0; INTCONbits.INTE = 0; INTCONbits.INTF = 0; // TMR1IE = 0; // !!!daca-l opresc pe asta nu mai pot iesi din programare!!! TMR0IF = 0; TMR0IE = 0; ucEncNewVal = PORTB; // read the RB port to clear the missmatch condition INTCONbits.RBIF = 0; ucEncNewVal = PORTB; // read the RB port to clear the missmatch condition bEnc0 = PORTBbits.RB4; bEnc1 = PORTBbits.RB5; bNewEncData = 1; }} Editat Mai 28, 2014 de Liviu M Link spre comentariu
Mircea Postat Mai 28, 2014 Partajează Postat Mai 28, 2014 Liviu, la ce PIC ai folosit acel encoder? Link spre comentariu
Liviu M Postat Mai 28, 2014 Partajează Postat Mai 28, 2014 (editat) Salut,16f877a. Am si o poza cu produsul final. La sfarsit am folosit un encoder special (mai mult din cauza ca trebuia sa-i pot pune un buton), dar primele teste le-am facut cu encodere din mouse. LE Schema... Editat Mai 28, 2014 de Liviu M Link spre comentariu
Mircea Postat Mai 28, 2014 Partajează Postat Mai 28, 2014 Nu vad schema ca nu am cont pe forumul de trenulete, dar se vede din soft ce intrari ai folosit. Multumesc! Link spre comentariu
Liviu M Postat Mai 29, 2014 Partajează Postat Mai 29, 2014 (editat) Sorry, am browserul setat sa ma conecteze automat, asa ca nu m-am prins ca unele chestii nu se vad. Uite si schema. Encoderul e ala din coltul dreapta sus. Aia e schema pentru encoderul din mouse. Encoderul folosit in schema finala are si contact la apasare (al treilea switch din schema), asa ca-l folosesc si pe ala, dar separat de encoder. Editat Mai 29, 2014 de Liviu M Link spre comentariu
Elef Postat Mai 29, 2014 Partajează Postat Mai 29, 2014 (editat) La encoderele incrementale cele doua semnale sunt defazate la 90grade , ordinea ar fi 00->01->11->10 adica un cod Gray. Aici e o metoda mai simpla de calculat sensul: encold<<=1; encold^=encnew if(encold.1) sens1 else sens2 encold=encnew encold - valoarea anterioara a encoderul encnew - valoarea curenta encold.1 = bit-ul 1 din encold Editat Mai 29, 2014 de Elef Link spre comentariu
Liviu M Postat Mai 30, 2014 Partajează Postat Mai 30, 2014 Salut Elef,Mi se parea mie ca am muncit cam mult la asa un montaj simplu. :rade:Multumesc mult! Link spre comentariu
Elef Postat Mai 30, 2014 Partajează Postat Mai 30, 2014 Hehe nu cred ca a fost chiar atat de simplu, da' e loc intotdeauna de o mica optimizare cu riscurile de rigoare ;) (se stie ca mai bine e dusmanul binelui). Link spre comentariu
Liviu M Postat Mai 30, 2014 Partajează Postat Mai 30, 2014 Cu simplu ma refeream la encoder, nu la tot montajul. Oricum, multumesc inca o data. Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum