Go Down

Topic: Debounce hardware per encoder rotativo (Read 1 time) previous topic - next topic

the_dragonlord

è montato su una breakout e chiude a gnd

Etemenanki

Allora probabilmente ha gia delle resistenze di pullup sulla breakout ... metti 3 condensatorini ceramici (valori fra 47n e 100n dovrebbero andare bene) sui pin di uscita (fra ogni pin e massa), e dovresti essere gia a posto ...
"Sopravvivere" e' attualmente l'unico lusso che la maggior parte dei Cittadini italiani,
sia pure a costo di enormi sacrifici, riesce ancora a permettersi.

miky_police

#32
Nov 21, 2017, 11:18 pm Last Edit: Nov 21, 2017, 11:36 pm by miky_police
Mi è chiaro però allo stesso tempo mi sfugge una cosa: il mio encoder ha già due PIN VCC e GND, per realizzare questo schema dovrei quindi scollegarli?
L'encoder dell'immagine che hai linkato ha tre soli PIN:


beh, non si vedono, ma gli altri 2 sono alle spalle ma comandano il pulsante dell'encoder che si dovrebbe poter cablare (in caso di necessità e in linea di massima) come un pulsante normalissimo....
EDIT:  e comunque funziona questo schema... almeno con me è andato bene...
Il vero stupido è colui che fa e rifa la stessa cosa aspettandosi risultati diversi. A.E.

Datman

#33
Nov 22, 2017, 08:09 pm Last Edit: Nov 22, 2017, 10:02 pm by Datman
Durante le selezioni del menu devi fare un loop stretto e veloce, così anche senza interrupt non perde impulsi. Io faccio così e funziona benissimo (il loop veloce è fatto con while() ):
Code: [Select]
void Menu()
{
lcd.clear(); lcd.print("> "+String(voce[cv]));
while(!(PIND&0x20)) // Attende che venga lasciato il pulsante. PIND&0x20 è simile a digitalRead(5). Se l'encoder è premuto (a massa) legge zero, altrimenti legge 16.
{delay(200);}
t1=millis();
while(PIND&0x20) // Continua a leggere l'encoder finché non premo
  {
  encoder();
  if(E!=0) {cv+=E; E=0; t1=millis(); delay(20);}
  if(cv>8) {noTone(7); cv=8;}
  if(cv<1) {noTone(7); cv=1;}
  lcd.setCursor(2,0); lcd.print (voce[cv]); lcd.setCursor(4,1); lcd.print (voce[cv+1]);
  if(millis()-t1>4999) return; // Dopo 5 secondi di inattività esce.
  }
delay(200); lcd.clear();
switch(cv)
  {
  case 1: Integrazione(); break;
  case 2: Azzeramento(); break;
  case 3: massimi(); break;
  case 4: suoni(); break;
  case 5: allarme(); break;
  case 6: retroillum(); break;
  case 7: precisione(); break;
  case 8: autonomia(); break;
  }
}


void encoder()
{
//S=3-(PIND>>3)&B00000011; Serviva per l'encoder su PD3 e PD4.
    // PD 76543210
S=3-PIND&B00000011; // Gli I/O 0 e 1 sono PD0 e PD1, perciò non devo scorrere a destra.
// Il valore binario di S rappresenta A e B. Il centrale dell'encoder è a massa,
                    // quindi faccio complemento a 3 (11) 
S^=S>>1; // Faccio XOR (^) fra S (gray) e il suo bit 1, facendolo scorrere a Dx: AB XOR A,
         // ottenendo un binario che per ogni scatto fa 0-1-2-3-0 oppure 0-3-2-1-0.
if (S!=So && S==0) X=0;
if (X==0)
  {
  if (So==1&&S==2)
    {E=1; X=1; if(!mute)Bip();}
  if (So==3&&S==2)
    {E=-1; X=1;if(!mute)Bip();}
  if (S==0)
    {E=0; X=0;}
  So=S; 
  }
}
Hi, I am Gianluca from Roma. I play and work with electronics since I was 16 (1984).
After 25 years of maintenance on cameras and video mixers, since 2013 my job is HD TV studios design.
In Jan 2015 I began playing with Arduino.

Go Up