SIPO 74164

Estoy controlando el registro SIPO 74164 con el objetivo de realizar un contador binario de 8 bits utilizando sólo dos pines de Arduino. El circuito funciona perfectamente pero al probar el siguiente programa:

int serialInput = 12; // entrada serie, pines 1 y 2 del SIPO
int clockInput = 13; // entrada de sincronismo, pin 8 del SIPO

void setup() { 
  pinMode(serialInput, OUTPUT);
  pinMode(clockInput, OUTPUT);  
  
  shiftOut(serialInput, clockInput, MSBFIRST, 0);

}
// *********************PROGRAMA PRINCIPAL*********************
void loop() {
  
  delay(5000);
  
  for (byte k=0; k<256; k++){
    shiftOut(serialInput, clockInput, MSBFIRST, k);
    delay(150);
  }
  
}

resulta que el retardo de 5 segundos sólo se ejecuta la primera vez. Al llegar a 255, en lugar de esperar 5 otros segundos sigue contando. ¿Hay alguna razón que se me escapa para ello?

Creo que lo que ocurre es que nunca sale del bucle for. La variable k tiene 256 posibles valores, que van de 0 a 255. Cuando k=255 se ejecuta lo que tu crees que sera la ultima vuelta del bucle, pero en su lugar, al incrementar en 1 su valor, k valdra de nuevo 0, con lo cual, k siempre sera menor de 256, y por tanto nunca sale del bucle.
Tienes dos soluciones:

  • Utilizar una variable entera para k (de esta manera, cuando valga 255 y sumes 1, valdra 256 y saldra del bucle
  • Sustituir la sentencia de control de fin de bucle k<256 por k+1<>0. De este modo, cuando k valga 255 saldra, aunque el bucle tendra una vuelta menos de las que esperas.

Gracias Pofenas, sin tu ayuda creo que no hubiera dado con lo que fallaba, aunque ahora lo vea tan obvio. Bastó cambiar el tipo byte por int para que funcionara como yo quería. Aquí dejo el enlace a la entrada en la bitácora que tengo para las "cositas" que voy haciendo con Arduino. Lo dicho, gracias, así da gusto aprender.