89C51AC2 UART Variable Baudrate 31.52kBaud

Gast #1697759
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!
Gast #1697787
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?
Gast #1697813
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.
Gast #1697816
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 ?
Gast #1697856
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
Gast #1697873
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.
Gast #1700286
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.
#1708476
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
Gast #1709767
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.

Antwort schreiben

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.

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.