PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RS232 Problem



EasyRider
01.11.2005, 08:25
Habe folgendes Problem! Einen Buchstaben sende ich vom Controller an
den PC. Leider empfängt das Terminal Programm aber nur Zeichenmüll.
Kann mir bitte jemand helfen?
AT89S53 mit 11,0592 MHZ 9600 Baud

#include <REGS53.H>
void init_serial(void);
void senden(char);
sbit flag=P2^5;
sbit test=P3^1;

//Hauptprogramm------------------------------------------
main()
{
unsigned int i;
init_serial();

while(1) //Endlosschleife
{
for(i=0;i<0xf;i++); //Warteschleife (in Hex angeben,da int zu klein)
senden('T'); //Buchstabe "T" wird an PC gesendet!
}
}
//Unterprogram Initialisierung RS232
void init_serial(void)
{
SCON=0x50; //Register SCON einstellung Seriell mode
TMOD=0x20; //Timermodus 2, autoreload
TR2=1; //Start Timer 2
RCLK=1;
TCLK=1;
EA=1;
ES=1; //Seriellen Interrupt freigeben

RCAP2L=0xE2;
RCAP2H=0xFF;
T2CON=0x34; //Timer 2 control Register

}
//Unterprogramm Senden---------------------------------
void senden(char zeichen)
{
SBUF=zeichen; //Puffer Daten senden/empfangen
while(TI==0); //Warte bis Controller bereit
TI=0;
}

SprinterSB
01.11.2005, 09:01
Das ist ein AVR? Sieht mir eher nach 8051 aus...

Auf 8051 hatte ich mal Probleme mit der Baudrate, die nicht so war wie im Manual beschrieben, war der Faktor 2 bzw 0.5, und Baudrate verdoppeln ging auch nicht.

Hier mal ein Assembler-Schnippsel aus meinem Uralt-Code, vielleicht hilft dir das irgendwie weiter:


MOV TMOD, #$21 ' Timer0 auf 16 Bit intern und
' Timer1 auf 8 Bit autoreload
SETB PS ' Serial hat Priorität
CLR PT0
SETB ET0 ' Timer0 aktivieren
CLR ET1 ' Timer1 nicht aktivieren
CLR ES ' Serial deaktivieren

' Timer auslösen
MOV TL0, #$ff
MOV TH0, #$ff
MOV TL1, #$ff


SETB SM0 ' 9 Bit UART mit Timer 1
SETB SM1 ' "
CLR SM2 ' keine Multiprozessor Kommunikation
CLR REN ' Serial Receive sperren
CLR RI ' nichts empfangen
CLR TI ' nichts gesendet

MOV TH1, #$ff ' f4 = -12: 9600 Baud bei 22.1184 MHz
MOV TL1, TH1
SETB PCON.7 ' ...dazu muß die Baudrate verdoppelt werden

SETB EA ' Interrupts aktivieren
SETB TR0 ' Timer0 starten
SETB TR1 ' Timer1 starten

EasyRider
01.11.2005, 09:24
Danke, der Assembler Code hilft mir leider auch nicht weiter.
Vermutlich liegt der Fehler hier:
RCAP2L=0xE2;
RCAP2H=0xFF;
Kann das mal bitte jemand nachrechnen.
11,0592 MHZ 9600 Baud.
Komme mit der Baud Rate Formel nicht zurecht.

SprinterSB
01.11.2005, 09:28
Wie ist denn die Formel?

EasyRider
01.11.2005, 09:36
Modes 1 and 3 = Oscillator Frequency
----------------- = ---------------------------------------
Baud Rate = 32* (65536- (RCAP2H, RCAP2L))

Im Datenblatt steht noch 1/2 Oscillator Frequency
Wenn Timer 2 als Baudratengenerator verwendet wird

SprinterSB
01.11.2005, 09:55
So?

baud = fOsc /(32*(65536-RCAP2))

Dann ist

RCAP2 = 65536-fOsc/(32*baud)

fOsc = 1105920
baud = 9600

Das gäbe 65535-3.6, was bedeuten würde, daß die Baudrate mit dem Quarz nicht darstellbar istt. Das kann eigentlich nicht sein bei der Frequenz.

EasyRider
01.11.2005, 10:24
Ja, so steht es im Datenblatt seite 13
Hier ist der link:
http://www.atmel.com/dyn/general/advanced_search_results.asp?device=1&tools=1&faqs=1&datasheets=1&appNotes=1&userGuides=1&software=1&press=1&articles=1&flyers=1&checkAllReference=1&target=at89s53

SprinterSB
01.11.2005, 10:39
Dann brauchst du ne andere Baudrate oder nen anderen Kristall.
Mit der Einschränkung für Timer2 wäre es dann

RCAP2 = 65536-fOsc/(64*baud)

Sorry, hab Müll gerechnet oben *rotwerd*

RCAP2 = -18 = 0xffee

EasyRider
01.11.2005, 10:51
Funktioniert leider auch nicht.
Trotzdem danke
MFG

EasyRider
01.11.2005, 18:32
Ich habe den Fehler gefunden! Timer hatte falschen Wert.
Hier ist die korrekte Initialisierung:

void init_serial(void)
{
SCON=0x50; //Register SCON einstellung Seriell mode
EA=1;
ES=1; //Seriellen Interrupt freigeben
RCAP2L=0xDC; // Timerwert 65500
RCAP2H=0xFF; //9600Baud=11,0592MHZ/(32*(65535-65500))
T2CON=0x34; //Timer 2 control Register

}

SprinterSB
01.11.2005, 20:18
Das ist der Wert, der bei
RCAP2 = 65536-fOsc/(32*baud)
rauskommt, also OHNE 1/2 Oscillator Frequency...