Forum: Mikrocontroller und Digitale Elektronik [89C51] Frame Error benutzen


von jojo (Gast)


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

von Reinhard B. (brainstorm)


Lesenswert?

Hallo,

Du kannst das Break auch erkennen, indem du das 9. Datenbit auswertest. 
0 = Break, 1 = Daten (ist dann erstes Stoppbit, wenn ich mich richtig 
erinnere).

mfg

von jojo (Gast)


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

von Reinhard B. (brainstorm)


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

von Michael W. (michelw)


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.

von Reinhard B. (brainstorm)


Lesenswert?

Hm...wie beobachtest du den Zustand des Portpins, an dem du FE ausgibst? 
DMM/Oszi/LED? Vielleicht setzt du ihn zu schnell zurück?

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.