Entschuldigung das war etwas unkontrolliert aus dem Kopf heraus geschrieben XD
Der Code wäre in der tat unheimlich simpel.
1 ATTiny mit
1 Timer mit einer Überlaufzeit 1/800kHZ , 2 Compare Outputs als Fast PWM
1ter PWM Output auf 50% und invertiert (der Pin simuliert unsere SCLK):
Immer wenn wir einen Überlauf vom Timer haben, wird die SCLK von der PWM Logik auf "low" gesetzt
Sobald der Compare Matchwert bei 50% Duty Cycle erreicht wird, wird SCLK auf "high" gesetzt und gleichzeitig ein Interrupt ausgeführt, welcher das Compare Register des 2ten PWM Output mit dem Timing für das Bit am MISO Eingang programmiert
Kurz vor dem Timer Überlauf wird dann der neue PWM Wert für den 2ten PWM Ausgang übernommen
Nach dem Update folgt der Überlauf und das Spiel geht von vorne los, bis alle LEDs mit Bits versorgt wurden, dann wird der Chipselect abgeschaltet und eine Pause gemacht damit die LEDs intern updaten.
Der Chipselect wird wieder eingeschalten, das erste Bit wird per Software eingelesen und der Timer neu gestartet.
Zum zählen der LEDs werden auf Knopfdruck einfach nur Nullen über den PWM geschoben und die Bits gezählt, bis von der letzen LED das erste Bit zurück kommt.
Leider blockieren in meinem Hirn gerade alle Programmierkenntnisse, vll. kann ich morgen mal einen brauchbaren Fetzen Code präsentieren
Code:
TCCR0A = \
(COM0A0 | COM0A1) | \ //Compare Output A low on Overrun/BOTTOM, high on Match (SCLK)
(COM0B0) | \ //Compare B high on Overrun/BOTTOM, low on Match (WS2812 PWM)
(WGM14); //WAveForm Mode 14: Fast PWM Count to TOP read from ICR0
ISR(TIM0_COMPA_vect)
{
if(PINB & PINB2){
TCCR0B = LONG_PULSE;
}
else
{
TCCR0B = SHORT_PULSE;
}
}
jetzt nur ganz grob, ohne Timer Werte für irgendwas
PortB
Pin2 ist MISO
Pin 1 (Compare B) der PWM
Pin 0 (Compare A) ist SCLK
Lesezeichen