Forum: Mikrocontroller und Digitale Elektronik 89C51AC2 UART Variable Baudrate 31.52kBaud


von John (Gast)


Lesenswert?

Hallo Zusammen!

Ich habe folgendes problem mit dem UART des 89C51AC2:

Ich muss mithilfe des UART 8 Datenbits und ein Start- und Stoppbit auf 
eine MIDI Schnittstelle übertragen.
Die Baudrate des MIDI Standard ist 31.52kBaud (31520Bits/s).

Um die Variable Baudrate zu setzten muss ich somit den 8-bit UART mit 
Variabler Baudrate auswählen.

Wie verwende ich den Timer 1 (tf1) als Baudratengenerator?
Und wie berechne ich die Reloadwerte des Timers für die Baudrate von 
31.52kBaud?
Muss ich im Timer-Interrupt den Timer ständig nachladen?

Ich hoffe jemand kann mir mit meinem Anliegen helfen.
Danke im Voraus!

von Bernd N (Gast)


Lesenswert?


von John (Gast)


Lesenswert?

Nachtrag:
Oszillatorfrequenz ist 12.00MHz, kann aber auch ein 16.00MHz Quarz 
verwenden, wenn es weniger Abweichung geben würde.

Danke für die schnelle Antwort.

Laut dieser Berechnung von Keil würde dies einen Reloadwert von 0FEh und 
somit 31,250.00Baud geben, was weniger als 1% Abweichung ergeben würde.

Sehe ich das richtig, das ich TMOD auf 0x20 setzte und somit den
Mode 2: 8-bit auto-reload Timer/Counter (TL1). (1)
konfiguriere?

Wird diese Baudrate übernommen sobald ich den UART in den 8-bit Variable 
Mode setzte?

von Es (Gast)


Lesenswert?

MIDI ist 31250 baud das geht mit 12 Mhz Normalerweise genau.
1
BDMidi  EQU  0FFh    ;6Mhz
2
;BDMidi  EQU  0FEh    ;12Mhz
3
........
4
5
         MOV  PCON,#80h
6
  MOV     TMOD,#00100001b                    ;T0=TIMER T1=TIMER
7
         MOV     TH1,#BDMidi                        ;ZAEHLWERT FUER BAUDR.
8
         MOV     TL1,#BDMidi
9
10
  MOV     SCON,#01010000b                    ;8BIT, TXD READY-FLAG
11
12
  MOV  IE,#00h                    ;INTERR. AUSSCHALTEN
13
14
  SETB  ES             ;RS232 AN
15
  SETB  TR1             ;TIMER 1 EIN
16
17
         SETB    EA                                ;INTERR. ALLG. ERLAUBEN
18
  RET

Funktioniert seit min. 10 jahren so.

von Bernd N (Gast)


Lesenswert?

>> Sehe ich das richtig, das ich TMOD auf 0x20 setzte und somit den
>> Mode 2: 8-bit auto-reload Timer/Counter (TL1). (1)
>> konfiguriere?

Ja

Wie wärs mit nem Baudratenquarz ? oder bist du auf die Frequenz 
festgelegt ?

von John (Gast)


Lesenswert?

Es schrieb:
> MIDI ist 31250 baud das geht mit 12 Mhz Normalerweise genau.

Stimmt, MIDI ist 31250 baud. In diesem Fall ginge das genau.

Auf der Seite von Keil kann man SMOD = 0 oder SMOD = 1 auswählen.
Beim AC2 aber kann man SMOD0 oder SMOD1 setzten, mit SMOD0 kann man 
"framing error detection" aktivieren und mit SMOD1 die Baudrate 
verdoppeln.
Welches SMOD ist auf der Keil Berechnung gemeint?

Wie muss ich das PCON register setzten?

SMOD0 = 1    Baudrate verdoppeln
SMOD1 = 0    SCON SM00

von John (Gast)


Lesenswert?

Bernd N schrieb:
> Wie wärs mit nem Baudratenquarz ? oder bist du auf die Frequenz
> festgelegt ?

Mit dem 12Mhz sollte es genau gehen. über 30Mhz wäre etwas schnell für 
den AC2.

von Bernd N (Gast)


Lesenswert?

PCON = 0x80; => Baudrate verdoppeln.

Nehm es mir nicht übel, ich habe deine Rechnung nicht nachvollzogen, der 
Einwand 1% Fehler kam von dir.

>> über 30Mhz wäre etwas schnell für den AC2.

Wie kommst du darauf das 30 MHz ein Baudratenquarz ist ?

Wie wärs wenn du mal dir Werte eingibst und es ausprobierst... ich habe 
keine entsprechende Hardware aber das Ganze ist doch in 3 Minuten 
ausgestanden.

von John (Gast)


Lesenswert?

Die Rechnung mit der Abweichung ist auf die Baudrate von 31520 bezogen, 
was falsch ist. Mit 31250 ergibt es keine Abweichung.

Habe erst jetz gelesen was ein Baudratenquarz ist, da man aber mit 12MHz 
genau 31250 baud erreichen kann hat es sich sowieso erledigt.

Ich werde den UART bei Gelegenheit ausprobieren.

von John (Gast)


Lesenswert?

Ich habe den das UART mit Annäherungsversuchen auf die gewünschten 31250 
baud gebracht. Reloadwert für Timer1 im Modus 2 ist 0xFE.

Der UART scheint nach dem Startbit das LSB zu senden.

von Peter D. (peda)


Lesenswert?

John schrieb:
> Ich habe den das UART mit Annäherungsversuchen auf die gewünschten 31250
> baud gebracht. Reloadwert für Timer1 im Modus 2 ist 0xFE.

Oh Gott, ist es denn wirklich so schwer, die Formel aus dem Datenblatt 
in den Taschenrechner einzutippen?

C-Programmierer sind selbst dazu zu faul, sie schreiben die Formel hin 
und lassen es den Compiler ausrechnen.

> Der UART scheint nach dem Startbit das LSB zu senden.

Das habe ausnamslos alle UARTs so an sich. Wenn nicht, dann wäre es 
keine UART.
Hätte man aber auch sofort im Datenblatt lesen können.


Peter

von JackTheCoder (Gast)


Lesenswert?

Peter Dannegger schrieb:
> Oh Gott, ist es denn wirklich so schwer, die Formel aus dem Datenblatt
> in den Taschenrechner einzutippen?

Formel aus dem Datenblatt? Schön wärs. Wenn die Formel im Datenblatt des 
AT89C51AC2 wäre und der Zusammenhang zwischen Timer 1 und dem UART so 
schön erklärt wäre wie du denkst, dann wäre manche Posts in diesem Forum 
überflüssig.

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.