Hallo,
ich bin zur Zeit dabei einen ATMega328P in Assembler zu programmieren, der anschließend in der Lage sein soll WS2811 Pixel anzusteuern. Die Daten soll er später von Glediator bekommen.
Die eigentliche Datenausgabe an die Pixel funktioniert auch soweit korrekt. Probleme bereitet mir nun der Datenempfang.
Zu Testzwecken habe ich jetzt ein neuen Codeblock geschrieben, welcher einfach eine LED beim Empfangen eines bestimmten Zeichens (hier "d") einschaltet. Wird irgendein anderes Zeichen gesendet so soll die LED wieder ausgehen.
Packe ich das ganze in die Main-Loop passiert folgendes:
Der µC reagiert, so wie ich das sehe immer auf das vorletzte Zeichen was gesendet wurde, also sende ich per Terminalprog z.B. ein "s" & "d" so passiert erstmal nichts. Erst wenn ich ein weiteres Zeichen sende geht die LED an, abhängig davon, ob dieses Zeichen ein "d" war, bleibt die LED bei einem weiteren Zeichen an oder geht aus.
Aber eigentlich soll der Datenempfang bzw deren Verarbeitung per Interrupt ablaufen. Wenn ich nun die Routine aus der Main- Loop lösche und nur bei einem Rx- Complete-Interupt anspringe, ist es so, dass die LED quasi die ganze Zeit aus ist. Erst wenn ich eine Taste gedrückt halte, also Daten ununterbrochen gesendet werden, so flackert die LED. Dabei scheint es auch nicht zu interessieren, ob ich "d" oder eine andere Taste gedrückt halte.
Daraus schließe ich schonmal, dass die ISR immerhin angespringen wird bzw der Interrupt auslöst
Hier erstmal mein Code um das ganze etwas zu veranschaulichen:
Die Block sieht folgendermaßen aus:
Main:
cpi temp0,100 ;ist temp0="d"?
brne ledaus ;nein,also springen
sbi LED_Port,Test_Pin ;led an
rjmp Main
ledaus:
cbi LED_Port,Test_Pin ;led aus
rjmp Main
Die ISR sieht dan folgendermaßen aus:
SUB_Byte_received:
push temp0 ; Register sichern
in temp0, SREG
push temp0
lds temp0,UDR0 ;hole Daten
cpi temp0,100 ;ist temp0="d"?
brne ledaus ;nein,also springen
sbi LED_Port,Test_Pin ;led an
rjmp weiter
ledaus:
cbi LED_Port,Test_Pin ;led aus
weiter:
pop temp0 ;Register wiederherstellen
out SREG, temp0
pop temp0
reti
Alles anzeigen
Es wäre nett wenn mich jemand aufklären könnte was ich falsch mache. Denn wenn selbst sowas simples nicht funktioniert, brauche ich mir über komplexere Sachen gar keine Gedanken machen. Falls noch weitere Dinge zur Aufklärung benötigt werden liefer ich die gerne nach.
Ach so zu sagen wäre noch, dass der µC mit 16MHz läuft und UART für den Moment auf 9600 Baud, 8Bit, 1 Stoppbit, No Parity eingestellt ist.
Vielen lieben Dnak schonmal