- 12V Akku mit 280 Ah bauen         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 11

Thema: RS232 Problem

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Neuer Benutzer Öfters hier
    Registriert seit
    14.10.2005
    Beiträge
    15

    RS232 Problem

    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;
    }

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    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:
    Code:
    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
    Disclaimer: none. Sue me.

  3. #3
    Neuer Benutzer Öfters hier
    Registriert seit
    14.10.2005
    Beiträge
    15
    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.

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    Wie ist denn die Formel?
    Disclaimer: none. Sue me.

  5. #5
    Neuer Benutzer Öfters hier
    Registriert seit
    14.10.2005
    Beiträge
    15
    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

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    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.
    Disclaimer: none. Sue me.

  7. #7
    Neuer Benutzer Öfters hier
    Registriert seit
    14.10.2005
    Beiträge
    15
    Ja, so steht es im Datenblatt seite 13
    Hier ist der link:
    http://www.atmel.com/dyn/general/adv...target=at89s53

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von SprinterSB
    Registriert seit
    09.06.2005
    Ort
    An der Saar
    Beiträge
    2.802
    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
    Disclaimer: none. Sue me.

  9. #9
    Neuer Benutzer Öfters hier
    Registriert seit
    14.10.2005
    Beiträge
    15
    Funktioniert leider auch nicht.
    Trotzdem danke
    MFG

  10. #10
    Neuer Benutzer Öfters hier
    Registriert seit
    14.10.2005
    Beiträge
    15
    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

    }

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen