sst64
19.04.2006, 19:02
Hallo,
ich hoffe diese Fragen stellen zu dürfen, weil es eigentlich so gar nix mit Robotern zu tun hat, aber halt mit serieller Datenübertragung, was hier doch öfter diskutiert wird. Also:
Ich möchte mir einen 8-Kanal-DMX-Dimmer bauen, welcher über einen PIC16F628 gesteuert werden soll. Nun habe ich ein Problem bei der Erkennung des DMX-Signals (http://www.soundlight.de/techtips/dmx512/dmx512.htm). Die Verarbeitung der gesendeten Bytes ist eigentlich kein Problem, da das Startbit, die 8 Datenbits und die 2 Stopbits durch das USART-Modul des PICs gelesen werden können. Der PIC ist im RX9-Modus initialisiert, wobei das 9. Bit als 1. Stopbit interpretiert wird. Das USART-Modul soll mit 250kBit arbeiten (16MHz am PIC, BRGH=0, SPBRG=0)
Größere Kopfzerbrechen bereitet mir die Erkennung des Break/Resetsignals, welches 88µs lang ist und immer am Anfang einer kompletten DMX-Übertragung steht. Wenn das USART-Modul eingeschaltet ist, würde es ja dieses Resetsignal als Startbit + 8xDatenbit(Low) + fehlerhaftes Stopbit (das muß ja High sein und nicht Low) erkennen und somit einen Fehler auslösen (FERR=1). Das könnte ich mir zu nutze machen um das Ende einer Übertragung zu erkennen. Allerdings weis ich nicht, ob das USART-Modul auch bei FERR=1 einen Interupt auslößt oder nur, wenn echte Daten übertragen wurden. Dies wäre dann also meine erste Frage an euch.
Wie arbeitet das USART-Modul dann aber weiter? Interpretiert es das weiterhin andauernde Low-aktive-Resetsignal als weitere hereinkommende Bits? Wie erkennt es das nächste Startbit nach dem DMX-Resetsignal? An dieser Stelle hänge ich nun und weis nicht so recht weiter. Ich hatte die Idee, nach einem FERR=1 das USART abzuschalten (SPEN=0) und auf eine L-H-Flanke am Port RB1 zu warten (diese müsste aber auch als Interrupt erkannt werden). Dann hätte ich nach dem Protokoll 8µs (=32 Befehle) Zeit den USART wieder einzuschalten (SPEN=1). Das müsste aber alles als Interrupt passieren und da kommen mir 32 Befehle etwas kurz vor. Was meint ihr könnte diese ständige hinundherschalterei funktionieren oder hättet ihr eine bessere Idee?
Danke schon mal im vorraus
Gruß Sven
ich hoffe diese Fragen stellen zu dürfen, weil es eigentlich so gar nix mit Robotern zu tun hat, aber halt mit serieller Datenübertragung, was hier doch öfter diskutiert wird. Also:
Ich möchte mir einen 8-Kanal-DMX-Dimmer bauen, welcher über einen PIC16F628 gesteuert werden soll. Nun habe ich ein Problem bei der Erkennung des DMX-Signals (http://www.soundlight.de/techtips/dmx512/dmx512.htm). Die Verarbeitung der gesendeten Bytes ist eigentlich kein Problem, da das Startbit, die 8 Datenbits und die 2 Stopbits durch das USART-Modul des PICs gelesen werden können. Der PIC ist im RX9-Modus initialisiert, wobei das 9. Bit als 1. Stopbit interpretiert wird. Das USART-Modul soll mit 250kBit arbeiten (16MHz am PIC, BRGH=0, SPBRG=0)
Größere Kopfzerbrechen bereitet mir die Erkennung des Break/Resetsignals, welches 88µs lang ist und immer am Anfang einer kompletten DMX-Übertragung steht. Wenn das USART-Modul eingeschaltet ist, würde es ja dieses Resetsignal als Startbit + 8xDatenbit(Low) + fehlerhaftes Stopbit (das muß ja High sein und nicht Low) erkennen und somit einen Fehler auslösen (FERR=1). Das könnte ich mir zu nutze machen um das Ende einer Übertragung zu erkennen. Allerdings weis ich nicht, ob das USART-Modul auch bei FERR=1 einen Interupt auslößt oder nur, wenn echte Daten übertragen wurden. Dies wäre dann also meine erste Frage an euch.
Wie arbeitet das USART-Modul dann aber weiter? Interpretiert es das weiterhin andauernde Low-aktive-Resetsignal als weitere hereinkommende Bits? Wie erkennt es das nächste Startbit nach dem DMX-Resetsignal? An dieser Stelle hänge ich nun und weis nicht so recht weiter. Ich hatte die Idee, nach einem FERR=1 das USART abzuschalten (SPEN=0) und auf eine L-H-Flanke am Port RB1 zu warten (diese müsste aber auch als Interrupt erkannt werden). Dann hätte ich nach dem Protokoll 8µs (=32 Befehle) Zeit den USART wieder einzuschalten (SPEN=1). Das müsste aber alles als Interrupt passieren und da kommen mir 32 Befehle etwas kurz vor. Was meint ihr könnte diese ständige hinundherschalterei funktionieren oder hättet ihr eine bessere Idee?
Danke schon mal im vorraus
Gruß Sven