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!
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?
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.
>> 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 ?
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
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.
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.
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.
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.