El registro de desplazamiento 74HC164 no funciona

1

Hace poco comencé a trabajar con electrónica digital como pasatiempo, conseguí algunas partes y soldé una placa de prueba para AVR µC. Estoy usando un ATMega328P.

Ahora quería jugar con un registro de desplazamiento, específicamente un SIPO de 8 bits del tipo 74HC164.

Lo conecté como dice el pinout, conecté el reloj al pin 0 en el puerto B (pinb0) de la atmósfera y una línea de datos (a) está conectada al pin 7 en el puerto D (pind7). Como primera prueba, quise establecer un bit y cambiarlo, visualizando el resultado con cuatro LED. Para hacerlo, establezco pind7 alto, luego establezco pinb0 alto y luego establezco pinb0 bajo de nuevo, así como pind7. Hago eso en un bucle cada 5 ° ciclo, las otras cuatro veces simplemente mantengo la configuración de pinb0 high y luego low nuevamente para obtener un reloj y dejar que cambie el registro de cambios.

Ahora el problema es que los leds están todos encendidos y se apagan cuando la señal del reloj está allí.

También es raro que también reaccione a mi proximidad a los cables de la placa de pruebas, haciendo que los leds parpadeen.

De todos modos, aquí está el esquema, debe ser correcto, disculpe mis habilidades esquemáticas de mala calidad:

por cierto, siempre tengo solo un µC insertado a la vez, así que ignora ATTiny.

Y aquí está el código:

#define F_CPU 20000000UL

#include <avr/io.h>
#include <util/delay.h>


int main(void)
{
    /* Replace with your application code */
    uint8_t i = 0;
    uint8_t j = 0;
    while (1) 
    {

        if (i == 0)
        {   
            //clear register
            PORTD &= ~(1 << PIND7); 
            for(j = 0; j < 8; ++j)
            {
                PORTB |= (1 << PINB0);
                _delay_ms(1);
                PORTB &= ~(1 << PINB0);
                _delay_ms(1);
            }

            //set first bit to high
            PORTD |= (1 << PIND7);  
            _delay_ms(1);   
            PORTB |= (1 << PINB0);
            _delay_ms(1);
            PORTB &= ~(1 << PINB0);     
            _delay_ms(1);
            PORTD &= ~(1 << PIND7); 
            _delay_ms(1);
        }
        else
        {
            PORTB |= (1 << PINB0);
            _delay_ms(1);
            PORTB &= ~(1 << PINB0); 
        }



        i = (i+1)%5;

        _delay_ms(1000);
    }
}
    
pregunta rfreytag

2 respuestas

3

Parece que se olvidó de configurar los pines como salidas. Deberá escribir en DDRB y DDRD al inicio de su método principal. Los pines de entrada del registro de desplazamiento probablemente están captando campos eléctricos perdidos en este momento, ya que tienen una impedancia muy alta. Ahora, es posible que haya algo más en juego, pero el primer paso es encender los pines.

    
respondido por el alex.forencich
0

Olvidó las resistencias limitadoras de corriente entre las salidas del HC164 y los LED. Si la corriente extraída de las salidas es demasiado alta, puede producirse un comportamiento extraño o el HC164 puede destruirse. No debe utilizar más de 20 mA de corriente de las salidas. Siempre debe haber una resistencia limitadora de corriente para un LED.

    
respondido por el Uwe

Lea otras preguntas en las etiquetas