Hallo zusammen,
ich bin gerade dabei, ein Programm zum Dekodieren des S-Bus Protokolls
zu schreiben. Dieses soll auf einem Atmega 328P laufen.
Zum Debuggen verwende ich das debug-Wire Interface mit dem Atmel ICE.
Das korrekte Aufzeichnen des S-Bus Datenstroms über den UART des Atmega
funktioniert bereits wunderbar.
Nun stehe ich aber vor folgedem Problem:
Nach dem korrekten Empfang eines Datenframes wird in der Empfangsroutine
ein Flag ( SBUS_Flags.New_Frame_received ) gesetzt.
In der Hauptroutine wird dieses Flag in einer IF-Schleife gepollt, wenn
es gesetzt ist, d.h. wenn ein neues Frame empfangen wurde, soll eine
Funktion zur Umrechnung des Datenframes in Kanalwerte aufgerufen werden.
1 | while(1)
|
2 | {
|
3 | if(SBUS_Flags.New_Frame_received==1){
|
4 | SBUS_Frame_to_Channels();
|
5 | send_Channels_over_UART();
|
6 | SBUS_Flags.New_Frame_received=0;
|
7 | }
|
8 | }
|
Seltsamerweise springt das Programm aber auch bei gesetztem Flag nicht
in die IF Anweisung. Dieses Verhalten kann ich sowohl beim Simulieren im
AVR-Simulator als auch über debug-Wire beobachten.
Noch seltsamer ist, dass im zugehörigen Assembler-Code das Register R24
mit TST auf 0 überprüft wird. Das Register R24 IST TATSÄCHLICH 0.
Theoretisch soll dann der nächste Befehl übersprungen werden. Das
geschicht jedoch nicht??
1 | if(SBUS_Flags.New_Frame_received==1){
|
2 | 00000207 LDS R24,0x0130 Load direct from data space
|
3 | 00000209 ANDI R24,0x40 Logical AND with immediate
|
4 | 0000020A TST R24 Test for Zero or Minus
|
5 | 0000020B BREQ PC-0x01 Branch if equal
|
Bin echt ziemlich ratlos. Würde mich sehr freuen, wenn jemand sich die
besagte Stelle kurz mal anschauen könnte (S-Bus_Serial_Converter.c , if
Schleife ganz am Ende).
Vielen Dank schonmal für eure Hilfe,
Gruß Philipp