Atmega88p con registro de desplazamiento 74hc595

0

Necesito usar un registro de desplazamiento para controlar varios leds, pero necesito controlar cada uno individualmente. La idea sería enviar un búfer con los datos, sin embargo, necesito tener varios leds activos y solo quiero cambiar el estado de cada uno a la vez. Por ejemplo: cambiar el estado de led en PIN 1 del PORTC a ALTO, luego el led en PORTC PIN 2 a HIGH, luego el led en PORTC PIN 1 a LOW, etc ... ¿Alguien me puede dar un consejo o algún código de ejemplo? Gracias por escuchar

    
pregunta Carlos Ramos

2 respuestas

2

Eso es hacerlo de la manera más difícil en mi opinión. Manipule un byte (8 bits) o dos con los estados de encendido / apagado del LED. Luego simplemente haga una sola transferencia SPI para enviar los datos. Todas las salidas se actualizarán al mismo tiempo. Si cambias los mismos datos, la salida permanece igual.

// time for an output change?
digitalWrite (ssPin, LOW); // SS goes to RCLK
SPI.transfer(dataToDisplay);  // SCK goes to SH_CLK, Data goes to Serial Data In
SPI.transfer(dataToDisplay2);  // use if have 2  shift registers.
digitalWrite (ssPin, HIGH); // all outputs update on this rising edge
    
respondido por el CrossRoads
0

La idea es enviar los bits en el orden en que los LED están conectados al registro de desplazamiento, mientras se cambia el pin del reloj para la sincronización.

Almacena un byte para cada uno de los 8 LED (o menos) que desea controlar. Cuando desee cambiar un LED, cambie el bit apropiado y envíe los bits al registro de desplazamiento mediante la función shiftOut.

En un Arduino, esto es parte de la biblioteca, de lo contrario tienes que hacerlo manualmente.

En este arduino shift out en C nativo pregunta usted puede encontrar el Código, aquí está el fragmento:

void shiftOut(GPIO dataPin, GPIO clockPin, bool MSBFIRST, uint8_t command)
{
   for (int i = 0; i < 8; i++)
   {
       bool output = false;
       if (MSBFIRST)
       {
           output = command & 0b10000000;
           command = command << 1;
       }
       else
       {
           output = command & 0b00000001;
           command = command >> 1;
       }
       writePin(dataPin, output);
       writePin(clockPin, true);
       sleep(1)
       writePin(clockPin, false);
       sleep(1)
    }
}

En caso de que quiera controlar más de 8 LED, puede almacenar 4 bytes (uint32_t) y cambiar el tipo de argumento de comando de uint8_t a uint32_t y el bucle for para que se ejecute hasta 32. Por supuesto, los registros de desplazamiento deben estar encadenados (máx. 4 para máx. 32 LED).

    
respondido por el Michel Keijzers

Lea otras preguntas en las etiquetas