mikrocontroller.net

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


Autor: jojo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
UART_Init()
{
  SCON = 00010000;  /* UART Tx Mode 2: Osz:64            */
  PCON = 00000000;  /* single Baud: 0x00 --> Teiler = 32 */
  TI   = 1;         /* kein Zeichen im Ausgabepuffer     */
  RI   = 0;
}
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:
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

Autor: Reinhard B. (brainstorm)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: jojo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Reinhard B. (brainstorm)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael Werner (michelw)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Reinhard B. (brainstorm)
Datum:

Bewertung
0 lesenswert
nicht 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?

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.