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);
}
}