es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Registro de desplazamiento reaccionando incorrectamente a la función shiftout

Soy nuevo en este registro de desplazamiento. Así que creé una simulación en línea del registro de desplazamiento que está conectado a 8 LEDs, el antiguo experimento de 8 bits traducido a 8 LEDs. Mi diseño es que cuando ingreso un carácter como “a” en el monitor serial, se mostrará en el resultado en el código como 100000, y también debería mostrarse en los LEDs (el sexto LED debería encenderse).

char character;
byte input = 0b01;

void setup() {
  pinMode(latchPin, OUTPUT);
  pinMode(dataPin, OUTPUT);
  pinMode(clockPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  byte input = 0b01;
  if (Serial.available() > 0) {
    character = Serial.read();
    if (character == 'a') {
      Serial.print("character received: ");
      Serial.println(character);
      for (int i = 0; i < 5; i++) {
        updateShiftRegister(input);
        input = input << 1;
        delay(100);
      }

      Serial.print("Input: ");
      Serial.print(input, BIN);
      Serial.println();
    } else {
      Serial.print("Please retry.\n");
    }
  }
}

void updateShiftRegister(byte input) {
  digitalWrite(latchPin, LOW);
  shiftOut(dataPin, clockPin, LSBFIRST, input);
  digitalWrite(latchPin, HIGH);
}

El problema es que cuando ejecuto esto, el resultado está bien pero el registro de desplazamiento en la simulación está mal. Todos los LEDs se encienden.

LEDs

Encontré que la función shiftOut es la principal causa de esto, ¿alguna idea de por qué está haciendo que todos los LEDs se enciendan?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    Parece que la función shiftOut() no está desplazando correctamente los bits hacia el registro de desplazamiento. Una posible razón para esto es que el orden de los pines en la función shiftOut() es incorrecto.

    La función shiftOut() toma los siguientes argumentos:

    shiftOut(dataPin, clockPin, bitOrder, value)

    • dataPin: el pin que envía los datos al registro de desplazamiento
    • clockPin: el pin que envía la señal de reloj al registro de desplazamiento
    • bitOrder: el orden en el que se desplazan los bits (ya sea MSBFIRST o LSBFIRST)
    • value: los datos que se deben desplazar

    En el código proporcionado, se llama a la función shiftOut() con el argumento LSBFIRST. Sin embargo, es posible que el registro de desplazamiento esté esperando los bits en orden MSBFIRST. Esto puede provocar que los bits se desplacen en el orden incorrecto y que todos los LEDs se enciendan.

    Para solucionar este problema, intenta cambiar el argumento LSBFIRST a MSBFIRST en la llamada a la función shiftOut():

    void updateShiftRegister(byte input){
      digitalWrite(latchPin, LOW);
      shiftOut(dataPin, clockPin, MSBFIRST, input); // Cambiar LSBFIRST por MSBFIRST
      digitalWrite(latchPin, HIGH);
    }
    

    Esto debería desplazar los bits en el orden correcto y mostrar el patrón de LED esperado.

Comments are closed.