[89C51] Frame Error benutzen

Gast #1070045
Lesenswert?

Hallo,

zurzeit arbeite ich daran, ein DMX Signal mit 250kbaut zu empfangen und 
auszuwerten. Mein Problem liegt jetzt darin, den Break zu erkennen. Mein 
Controller (89C51ED2) verfügt zwar über eine Frame Error Erkennung, 
jedoch ist mir diese nicht ganz klar.
Im Datenblatt steht, dass das FE-Bit an der 7. Stelle in SCON liegt. 
Soweit kein Problem. Das Problem liegt jedoch darin, dass es sich diesen 
Platz mit dem SM0-Bit teilt. Im Datenblatt steht weiterhin, dass ich zur 
Auswahl eines der beiden Bits das SMOD0 Bit in PCON umschalten muss
(SMOD0 =1 --> FE, SMOD0 = 0 --> SM0).
Meinen UART initialisiere ich so:
1
UART_Init()
2
{
3
  SCON = 00010000;  /* UART Tx Mode 2: Osz:64            */
4
  PCON = 00000000;  /* single Baud: 0x00 --> Teiler = 32 */
5
  TI   = 1;         /* kein Zeichen im Ausgabepuffer     */
6
  RI   = 0;
7
}
Soweit scheint das auch in Ordnung zu sein bei einem Quarztakt von 
16MHz, ohne X2-Bit.
Jetzt schalte ich vor dem Empfang das SMOD0-Bit um:
1
PCON  |= 0100000;
Wenn ich nun jedoch hingehe, und mir den Zustand des FE-Bits auf einen 
Port-Pin ausgeben lasse, kann ich keine Änderung erkennen.
Wo liegt mein Problem?

Viele Grüße und vielen Dank im Vorraus

Jojo
Gast #1070059
Lesenswert?

Hallo Reinhard,

tatsächlich....Darauf habe ich gar nicht so geachtet. Problematisch wird 
es dann nur, wenn ein DMX sender sich nicht genau an die Spezifikation 
hält (aber dann kann ich ja nichts dafür...). D.h. den Brak müsste ich 
über das 9.Bit erkennen, und wenn dann das erste Byte 0 ist habe ich 
sicher ein Frame erkannt.
Trotzdem würde mir die Lösung über das FE-Bit auch gefallen, wenn jmd. 
weiß wie das geht.

Viele Grüße

Johannes
#1070080
Lesenswert?

Was mir grade auffällt:

> Jetzt schalte ich vor dem Empfang das SMOD0-Bit um:
> PCON  |= 0100000;

Da fehlt ne 0, su setzt das nicht dokumentierte bit. Ist der Fehler nur 
beim Abtippen fürs Forum passiert? Oder ist das direkt kopiert aus dem 
Programm? Das geht so nicht, weil der Compiler das nicht als binär 
erkennen kann.

Und überhaupt: In SCON setzt du gerade mal REN und sonst nichts?


Laut Datenblatt muss man das FE bit selbst zurücksetzen. Machst du das? 
Poste vielleicht den vollständigen Code.

mfg
#1070097
Lesenswert?

Hallo,
der Init Teil bei mir:
SERINIT:
  MOV SCON,#10011000B  ;
  MOV PCON,#64    ;
  SETB ES      ;SERIELLEN INT FREIGEBEN

In der ISR geht es dann so los:

;__________________SERIELLER INTERRUPT______________________
INT_232:
  CLR RI      ;DEN NÄCHSTEN FREIGEBEN
  PUSH ACC
  PUSH PSW
  JNB FE,NO_FE    ;ABFRAGE AUF FRAMING ERROR
  MOV C,FE    ;FRAMING ERROR STATUS KOPIEREN
  CLR FE      ;ERROR STATUS LÖSCHEN
  MOV BREAK,C    ;MERKERBIT IN SPEICHER, BREAK WAR DA
  POP PSW
  POP ACC
  call wd_reset    ;Watchdog zurücksetzen
  RETI      ;WAR BREAK

NO_FE:
  MOV C,BREAK    ;LETZTES BYTE AUF BREAK TESTEN
  JNC BYTES_HOLEN    ;NICHT 1, DANN WAR LETZTES KEIN BREAK ODER SB
  MOV A,SBUF    ;AUF STARTBYTE TESTEN
  CJNE A,#0,NO_STARTBYTE  ;BYTE AUF NULL TESTEN
  CLR C      ;IST NULL, BREAK LÖSCHEN
  MOV BREAK,C    ;BREAK INDIKATOR LÖSCHEN
  INC AUXR1
  MOV DPTR,#0    ;ZEIGER AUF SPEICHER START
  INC AUXR1
  POP PSW
  POP ACC
  call wd_reset    ;Watchdog zurücksetzen
  RETI      ;WARTE AUF NÄCHSTES BYTE

Is nur ein Auszug, aber vielleicht hilft der Teil mit dem FE ja weiter.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren