Forum: Mikrocontroller und Digitale Elektronik At89C51RD2---UART konfigurieren


von Jojo (Gast)


Lesenswert?

Guten Abend,

nachdem ein paar Freunde und ich beschlossen haben, ein kleines 
Washlight zu bauen, geht es nun an den Bau.Allerdings habe ich das 
Problem, dass ich trotz Studium der Datenblätter (sie liegen vor mir auf 
dem Tisch) nicht herausfinden konnte,wie ich den UART konfigurieren 
muss.

Als MC haben wir einen At89C51RD2,der über ein 16MHz Quarz getaktet 
ist.Nun sind wir soweit,dass wir als Modus für den UART den Mode2 
ausgewählt haben(dieser teilt die Taktfrequenz um 32 bzw. 16 und stellt 
die für DMX notwendigen Einstellungen zur Verfügung).Wenn ich das 
richtig verstaden habe,teilt dieser Teiler die CPU Frequenz um 16 bzw. 
32.Die CPU Frequenz beträgt nach Datenblatt in Standard-Einstellung die 
Hälfte der Frequenz des Oszillators.Also müsste ich den 32-er Teiler 
verwenden, um die 250.000 Baud zu erzeugen(Stimmt die Überlegung?).

Nun meine eigentliche Frage: Wie stelle ich den Teiler ein? Im 
Hardware-Manual von Atmel steht dazu,man soll das SMOD-Bit(PCON) 
setzen,dies kann ich jedoch nicht finden.
Oder gibt es vllt. eine bessere Einstellung für den UART, bzw. für den 
ganzen MC? (Kritik wird gerne angenommen)Bisher sind wir nur auf den MC 
festgelegt.Das ganze möchte ich jedoch gerne mit C programmieren(bisher 
mit µVision).

Viele Grüße und vielen Dank im Vorraus

Jojo

von Ralf (Gast)


Lesenswert?

Hallo,

poste doch bitte mal deinen Code. Das SMOD-Bit wird gesetzt, indem du 
das Register PCON mit 0x80 veroderst, und gelöscht, indem du es mit 0x7F 
verundest. Das Register PCON ist nicht bitadressierbar, deswegen musst 
du es auf diesem Wege machen. Das verunden/verodern deswegen, damit die 
anderen Bits des Registers nicht beeinflusst werden. Übrigens heisst das 
SMOD-Bit des originalen 8051 beim RD2 SMOD1.

Das Register SCON setzt du auf 100100x0 (x bedeutet 0 oder 1, je 
nachdem, ob du Polling oder Interrupt benutzt). Arbeitest du mit 
Interrupt-Betrieb?

Zur Berechnung kann ich momentan sagen, dass dabei eine Baudrate von 
250k rauskommen müsste, wenn a) das SMOD-Bit gesetzt ist und b) du im 
X1-Modus des Oszillators arbeitest.

Hast du die Möglichkeit, mit einem Oszi nachzusehen, welche Baudrate 
rauskommt?

Falls weitere Fragen zur seriellen Kommunikation bestehen (oder auch 
andere Fragen), nur her damit :-)

Hoffe, ich konnte schon mal ein bisschen helfen...

Ralf

von Michael W. (michelw)


Lesenswert?

SERINIT:
  MOV SCON,#10011000B  ;MODUS 2 9BIT-UART TB8=1
  MOV PCON,#64    ;TEILER DURCH 64 FUER 250K-BAUD
  SETB ES      ;SERIELLEN INT FREIGEBEN

von Ralf (Gast)


Lesenswert?

> MOV PCON,#64    ;TEILER DURCH 64 FUER 250K-BAUD

NEIN! Das Register PCON ist kein Teiler-Register. Das Bit 7 in PCON 
heisst SMOD und bestimmt, ob deine Baudrate verdoppelt wird. Deswegen 
hab ich geschrieben, dass du mit verunden bzw. verodern arbeiten musst, 
damit die anderen Bits nicht beeinflusst werden.
Wenn du 64 in PCON schreibst, dann passiert gar nix, ausser dass SMOD0 
gesetzt wird.

Die Zeile muss heissen:

ORL PCON,#128

dann wird das SMOD-Bit gesetzt und deine Teilerrate ist 32, andernfalls 
64.

Ralf

von Matthias (Gast)


Lesenswert?


von Jojo (Gast)


Lesenswert?

Hallo,

ich habe jetzt mal versucht das so zu übertragen.Also für den Modus 2 
muss ich SMOD0, SM0, SM1 und SMOD1 setzen bzw. "ausschalten".
D.h.:
1
    PCON |= 0x80   //SMOD1
2
    PCON |= 0x40   //SMOD0
3
    SCON |= 0x80   //SM0-FE
4
    SCON |= 0x40   //SM1
Stimmt das dann so,bzw. ich müsste doch auch schreiben können:
1
 
2
    PCON |= 0xC0
3
    SCON |= 0xC0

@Matthias
Leider bringt mir das Tool nichts, da ich die Baudrate ja nicht über 
einen Timer erzeuge.

Viele Grüße
Johannes

von Matthias (Gast)


Lesenswert?

ohne Timer oder Baudrategenerator (letztlich auch ein Timer) geht das 
nicht...

von Michael W. (michelw)


Lesenswert?

>NEIN! Das Register PCON ist kein Teiler-Register. Das Bit 7 in PCON
>heisst SMOD und bestimmt, ob deine Baudrate verdoppelt wird. Deswegen

Ja , sorry .
Der Kommentar gehört nicht in die Zeile.

von Michael W. (michelw)


Lesenswert?

Hmm,
wie willst Du denn das Brak erkennen?

Ich mach das immer über das FE-Bit.

von Jojo (Gast)


Lesenswert?

Hallo,
erstmals Danke für die Antworten.
Die Erkennung des Break sollte eig.über das 9. Bit erfolgen.Über die 
Auswertung des RI-Bits erkenne ich die Aktivität des Eingangs.Dann die 
abfrage ob das 9.bit gesetzt ist oder nicht.Wenn es längere Zeit nicht 
gesetzt ist -->break (22 Bits).

Viele Grüße
Jojo

PS:Ohne nerven zu wollen, funktioniert das Setzen der Bits so??

von Alexander B. (lpc900)


Lesenswert?

Hallo,

also ich bin auch gerade dabei mir einen LEDMovinghead zu bauen der über 
DMX steuerbar ist.
Ich habe da so meine probleme da ich bis jetzt noch überhaupt nichts mir 
µC gemacht habe Hardware bin ich 100%fit nur software naja ....

So mal die Frage beim DMX Signal gibt es ja 2 Stopbits nur die sind ja 
beide auf High also kann ich ja kein fehlerhaftes Stopbit erkennen oder 
habe ich da gerade einen Denkfehler.

Würde mich auch freuen wenn jemand einen Quelltext in C oder ASM habt 
und ihn mir bereitstellen könnte ich arbeite mit einem LPC932 (8051) 
vielleicht hat ja jemand schon mal soetwas gemacht ein DMX signal auf 
nem 8051 ausgewertet .

Freue mich über eine Antwort

Gruß Alex

von Alexander B. (lpc900)


Angehängte Dateien:

Lesenswert?

Fertig :-)

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.