Esta es una pregunta de continuación de esta respuesta de Spehro Pefhany , en la que nos explica cómo usar los registros de desplazamiento en serie 74HC595 con solo un pin de salida digital. A continuación se muestra la imagen que publicó.
Por curiosidad, y también para evaluar si yo mismo sería capaz de controlar un registro de turnos, mis preguntas son:
1. ¿Qué tan complicado es controlar los registros de desplazamiento de esta manera con una MCU, en C, por ejemplo?
2. ¿Cómo sería el firmware que controla este registro de desplazamiento?
3. ¿Hay bibliotecas de Arduino que nos ayuden a manejar eso (o también para otras plataformas)?
No tengo idea de cómo empezar.
Esta es solo una respuesta aproximada porque hay áreas de las que no estoy seguro, por lo que agradecería que alguien pudiera señalar los errores. Supongo que uno de sus problemas es que la delay
función solo permite una resolución de milisegundos y la delayMicroseconds
función solo tiene un tiempo de retraso mínimo de 2 μs. Sin embargo, el ATmega32U4 en Arduino Micro (y otros también) tiene una velocidad de reloj de 16 MHz, por lo que podemos calcular el tiempo entre ciclos:
Por lo tanto, podemos calcular cuántos ciclos de reloj deben transcurrir antes de cambiar la salida de HIGH
a LOW
y viceversa. Queremos un retraso de 1μs y por lo tanto calculamos:
Donde n es el número de ciclos de reloj. Por lo tanto, queremos que la CPU espere 16 ciclos, podemos lograr esto con algún ensamblaje en línea:
__asm__("nop\n\t"/*14 more of these*/"nop\n\t");
Sin embargo, no he tenido en cuenta la cantidad de ciclos de reloj digitalWrite
necesarios antes de cambiar el voltaje del pin de salida, por lo que también deberá analizarlo.
Como dije, esta es solo una respuesta esbozada, por lo que agradecería verificaciones de validez y sugerencias/críticas; Soy bastante nuevo en esto!
Wouter van Ooijen
ricardo
shiftOut
.ricardo
ricardo
Wouter van Ooijen
Tomas Russell
delayMicroseconds
función, pero solo tiene un tiempo de retraso mínimo de 2 μs, que es demasiado para el primer pulso.ricardo
delayMicroseconds()
. Pero quería usar una interrupción de desbordamiento del temporizador para que el bucle principal pueda hacer otras cosas.Tomas Russell
ricardo
Tomas Russell
nop
durante 16 ciclos en la línea principalloop
antes de llamardigitalWrite
, no podría usar una interrupciónWouter van Ooijen