Sari la conținut
ELFORUM - Forumul electronistilor

Utilizare rotita satelit comanda volan + 12F675


critix

Postări Recomandate

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.

 

post-184190-0-83770400-1401262879_thumb.jpg

Editat de critix
Link spre comentariu
  • Răspunsuri 11
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • Liviu M

    6

  • Elef

    2

  • Mircea

    2

  • critix

    2

Top autori în acest subiect

Imagini postate

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

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 de Liviu M
Link spre comentariu

Salut,16f877a. Am si o poza cu produsul final.  :85

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 de Liviu M
Link spre comentariu

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.

post-175022-0-19743900-1401349939_thumb.png

Editat de Liviu M
Link spre comentariu

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 de Elef
Link spre comentariu

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

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări