Fluctuación de datos con 74HC165.

Buenas a todos, soy nuevo en esto de la electrónica y en el mundo del Arduino, llevo solo 1 mes.

Mi pregunta es la siguiente, tengo un 74HC165 conectado a cuatro pulsadores, pero los datos del IC, cuando los muestro en el monitor Serial, me da fluctuaciones de datos. ¿Alguien sabe por que?.
Gracias.

int pinDataIC = 9;
int pinClockIC = 10;
int pinLanchIC = 1;

void setup()
{
  pinMode(pinDataIC, INPUT);
  pinMode(pinClockIC, OUTPUT);
  pinMode(pinLanchIC, OUTPUT);
  Serial.begin(9600);
}

void loop()
{
  int tempo = 60;
  byte button = 0;
  byte oldbutton;
  int pausenote;
  String notearray[] = {"Redonda", "Blanca", "Negra", "Corchea", "Tresillo", "Semicorchea", "Seisillo"};
  int numarray[] = {0, 0, 0, 1, 2, 3, 5};
  int index = 2;
  String note;
  int numero;
  int i = 0;
  int show = 1;
  
  digitalWrite(pinClockIC, HIGH);
  digitalWrite(pinLanchIC, HIGH);
  delayMicroseconds(20);
  digitalWrite(pinLanchIC, LOW);
  
  button = shiftIn(pinDataIC, pinClockIC, MSBFIRST);
  Serial.println(button);
  
  if ((oldbutton - button) == 2)
  {
    tempo ++;
    show = 1;
    //beat = beat + 30;
  }
  else if ((oldbutton - button) == 4)
  {
    tempo --;
    show = 1;
    //beat = beat - 30;
  }
  else if ((oldbutton - button) == 8)
  {
    index ++;
    show = 1;
  }
  else if ((oldbutton - button) == 16)
  {
    index --;
    show = 1;
  }
  oldbutton = button;
  numero = numarray[index];
  note = notearray[index];
  if (show == 1)
  {
    Serial.print("TEMPO: ");
    Serial.print(tempo);
    Serial.print(" NOTE: "); 
    Serial.println(note);
    show = 0;
  }
  delay (1000);
}

Hola:

Coloca un condensador de 10 nF entre los pines del 74HC165 entre el positivo y la masa, es para evitar ruidos y las fluctuaciones que te presentan.

Muchos se olvidan de este detalle.

Saludos.

Y como tienes esas entradas ? Hay resistencia pull up o pull down? o no hay nada?
No son ruidos, son rebotes, la misma técnica que se aplica a un pulsador conectado a una entrada de arduin debe usarse con este caso, si tienes rebotes. O sea un debounce.
Lees un dato y lo confirmas x mseg despues, y recién lo validas como tal.

Buenas:

Si son antirebotes, cosa que me he olvidado por completo, en software con el 74HC165 no se como se soluciona, si en hardware como indica aquí.

Ahora te toca hacer pruebas.

Saludos.

Claro que existen esos circuitos pero usarlos con un microcontrolador es un contrasentido al menos para mi.

Es mas fácil crear una rutina que pregunte si el estado del bit esta en 1 luego de 20 mseg que cablear lo que has puesto. Ademas ahorro todos los componentes, aunque sean 1.3 euros.

Como alternativa nadie la discute.

Hola:

A mi me parece un contrasentido también, solo digo alternativas por si las moscas algún usuario le de por satisfecho meterle algo más de electrónica en vez de usar software. :wink:

En la sentradas normales su software es este.

int estadoUltimo=0; 
int contador=0; 

void setup(){
      pinMode(4,OUTPUT); 
      pinMode(8,INPUT);  
      Serial.begin(9600);
}

void loop(){
      estadoActual1=digitalRead(8); 
      delay(10);
      estadoActual2=digitalRead(8);
      if (estadoActual1 == estadoActual2) {
          if (estadoActual1 != estadoUltimo){ 
              if (estadoActual1 == HIGH) {
                    contador = contador + 1;
                    Serial.print ("Ésta es la pulsación nº ");
                    Serial.println(contador); 
              }        
          }
      }  
      estadoUltimo= estadoActual1;
      if (contador % 2 == 0 ) {
          digitalWrite(4, LOW);       
      } else {
          digitalWrite(4, HIGH);     
      }  
}

Los hay mejores. En temas del 74HC165 es otro cantar, no se si realmente se podrá hacer, espero que si y no tan complicado.

Saludos.

Claro que se puede, lees los 8 bits, y esperas 20 mseg y vuelves a leerlos, si coinciden entonces lo tomas como entrada de byte válida.

Eso está bien, habrá que probarlo.

Saludos Zorthon1972.

Creo que tienes unos errores en algunos plantemamiento, por ejemplo usar el pin 1 del Arduino para comunicar con el 74165.

Te recomiendo hagas lo siguiente, prueba con este Sketch la comunicacion con el 74165.

int pinDataIC = 11;     // Conectado al pin 9 del 74165
int pinClockIC = 12;   // Conectado al pin 2 del 74165
int pinLanchIC = 13;    // Conectado al pin 1 del 74165
 
// Configurar el arduino
void setup()
{
  pinMode(pinDataIC, INPUT);
  pinMode(pinClockIC, OUTPUT);
  pinMode(pinLanchIC, OUTPUT);
  Serial.begin(9600);
}
// Ciclo infinito, programa principal
void loop()
{
	//Serial.println(millis()/1000);
	digitalWrite(pinLanchIC, LOW);
	delayMicroseconds(500);
	digitalWrite(pinLanchIC, HIGH);
	byte boton = shiftIn(pinDataIC, pinClockIC, MSBFIRST);
	Serial.println(boton, DEC);
        delay(1000);
}

Aqui veras lo que recibes del 74165. Sigue este diagrama.

Como no respondió a mis preguntas poco se puede aportar, pero Max tiene razón.