89C51AC2 UART Variable Baudrate 31.52kBaud

Gast #1697759
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!
Gast
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?
Gast
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.
Gast
>> 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 ?
Gast
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
Gast
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.
Gast
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.
Gast
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.
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
Gast
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.

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.