-
        

Ergebnis 1 bis 8 von 8

Thema: Ausgabe mit rs232

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    06.11.2005
    Beiträge
    58

    Ausgabe mit rs232

    Anzeige

    Hallo,
    ich würde gerne über RS232 auf den Bildschirm etwas ausgeben lassen(irgend welche Werte oder Texte), doch es klappt nicht (bin in solchen Sachen noch ein Anfänger und benutze avrstudio4, c-Sprache).
    Mit printf geht es gar nicht, hab auch schon im AVR-GCC Tutorial geschaut.
    Kennt jemand eine Lösung?

    MfG
    Palmer

  2. #2
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.08.2005
    Alter
    33
    Beiträge
    685
    Es gibt doch sehr viele Threads darüber...

    Hier eine Möglichkeit:

    für char:
    Code:
    void zeichen_senden(char zeichen)
    { 
         while (!(UCSRA & (1<<UDRE))); 
         UDR = zeichen; 
    }
    für string:
    Code:
    void string_senden(char *string) 
    { 
         while (*string) 
         { 
             while (!(UCSRA & (1<<UDRE))) 
             {} 
             UDR = *string++; 
         } 
    }
    Init für Atmega 32:
    Code:
    void usart_init(void)
    {
         /* Baudrate: 115200*/
         UBRRH  = 0;                               
         UBRRL  = 7;
    	 UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); 
    	 UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);                             
    }
    Gruß
    Stefan

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    06.11.2005
    Beiträge
    58
    Hallo,
    danke schon mal für die schnelle antwort, aber es funktioniert nicht wirklich, oder stell ich mich zu blöd an (ich verwende das rn controller board mit atmega 32).
    Als Programm benutze ich HTerm und ich weiß, dass meine Baud-Rate immer auf 9600 war,doch es scheint nichts anzukommen. Gibt es keinen einzigen Befehl wie "print" oder so Ähnliches?

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.08.2005
    Alter
    33
    Beiträge
    685
    @ Palmer

    Die Init musst du natürlich nach Datenblatt (oben für 115200 !) anpassen oder allgemein:

    Code:
    #define UBRR_BAUD	((F_CPU/(16L*BAUD))-1)
    #define BAUD		115200UL
    
    void usart_init(void) 
    {
    	UBRRH = (uint8_t) (UBRR_BAUD>>8);
    	UBRRL = (uint8_t) (UBRR_BAUD & 0xFF);
    	UCSRB = (1<<RXCIE)|(1<<RXEN)|(1<<TXEN); 
        UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    }
    In main dann einfach nur noch für ein Zeichen senden zB.: "zeichen_senden('x');" und für einen string: "string_senden("Hallo");"

  5. #5
    Erfahrener Benutzer Robotik Visionär Avatar von oberallgeier
    Registriert seit
    01.09.2007
    Ort
    Oberallgäu
    Beiträge
    7.554
    Hi, Palmer,

    für meinen mega168 (beispielsweise) verwende ich folgenden Code in (m)einer header-Datei:

    Code:
    /* ============================================================================== */
    /*	Initialisiere USART0 mit vorgegebener Baudrate		Neu am 07jan2008
    	Zum Senden von Zeichen im Hauptprogramm entweder        nach doc2545, S179
    	char irgendwas[] = "meintext";
    	sendUSART(irgendwas);		oder direkt
    	sendUSART("meinText");		verwenden.				  */
    void init_USART0( unsigned int ubrr ) 
    { 					
        UBRR0H  =  (unsigned char)(ubrr>>8);      // Set baud rate
        UBRR0L  =  (unsigned char)ubrr;	 
        UCSR0B  =  (1<<RXEN0)|(1<<TXEN0); 	// Enable receiver and transmitter
        UCSR0C |=  (1<<UCSZ01)|(1<<UCSZ00);	// 8 Data, (async: UMSELnx empty, doc S193)
    			//  no parity weil UPMn1:0 empty, 1 Stop, weil UPMn1:0 empty
    }
    /* ============================================================================== */
    // ------------------------------------------------------------------ 
    void sendchar(unsigned char c) 
    { 
       while(!(UCSR0A & (1<<UDRE0)))        //Warten, bis Senden möglich ist 
       { 
       } 
       UDR0 = c; //schreibt das Zeichen aus 'c' auf die Schnittstelle 
    } 
    /* ============================================================================== */
    void sendUSART(char *s)          //   *s funktiniert wie eine Art Array - auch bei 
            // einem String werden die Zeichen (char) einzeln ausgelesen - und auf die
            // Sendeschnittstelle übertragen 
    { 
       while(*s) 
       { 
       sendchar(*s); 
       s++; 
       } 
    } 
    /* ============================================================================== */
    Im main werden diese Schnippsel wie folgt angesprochen (Nachtrag beachten!!):

    Code:
    #define MCU = AVR_ATmega168
    
    //   Mit Quarz 20 Mhz-CPU 
    #define F_CPU  20000000 
    #define BAUD   56000 
    #define MYUBRR (unsigned int)(F_CPU/16/BAUD-1)	//nach doc2545, S 179
    
    /* ============================================================================== */
    .
    .
    .
    // hier folgen div. Initialisierungen sowie >>>>> hier Nachtrag!!!
    
        init_USART0(MYUBRR);  //USART0 initialisieren mit wählbarer Baudrate (s.o.)
    
    // evtl. weitere Initialisierungen ....
    Die Textausgabe geht - beispielsweise - so:

    Code:
        sendUSART("FLEX168/20MHz mit SFH415-37,0kHz und SFH5110-36\r\n");
        sendUSART("Code irDMEm168-x24.c  27feb08 23:38ff");
    Als Beispiel für eine Datenausgabe: den Wert mecho gebe ich damit so aus:

    Code:
    // Natürlich müssen die Variablen definiert werden - entweder lokal 
    //   oder global (auch dies nur beispielhaft)
    
    	uint8_t mecho = 50;
    	char wortadc[10];
    
    
        mecho  = istaus / 10;
            
        utoa(mecho, wortadc, 10);
        sendUSART("\tAR \t");	//aktuellen Rampensteuerwert ausgeben
        sendUSART(wortadc);sendUSART("\r\n");	// Meldung ausgeben
    Vielleicht hilft Dir dies etwas weiter. Für Deine Anwendung musst Du natürlich einmal den Prozessortakt anpassen, der Name des Prozessors gilt nur für meine Anwendung, dem von mir verwendeten Prozessortyp entsprechen die Kommentare/Hinweise auf die Dokumentationsstellen, und, ganz wichtig, Du musst die Baudrate einstellen, die Deinem Problem und Deiner Sende- und Empfangshardware entspricht. Aufpassen: Wenn Du keinen Quarz verwendest, oder - wie ich - einen, der nicht für USART-Zwecke optimiert ist (das sind dann ziemlich krumme Werte), kann beim Einstellen der Baudrate durch die Ganzzahligkeit des Wertes ein Fehler auftreten, der von der Hardware (beispielsweise Deiner RS232 am PC) nicht mehr verdaut wird. Dazu such mal ein bisschen nach den entsprechenden Fehlertabellen in Abhängigkeit vom Quarztakt.

    Nachtrag am 10.03.08, 19:23 im Codestück "main". Sorry, hatte diese Initialisierung vergessen.
    Ciao sagt der JoeamBerg

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.12.2007
    Ort
    Berlin
    Alter
    33
    Beiträge
    211
    Sehr schön das ich den Threat finde habe
    hier ganz ähnliche sachen vor ...

    also werd das mal schön lesen

    grüße * wenn jemand tipps hat wäre ich dafür sehr dankbar !

  7. #7
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    08.05.2005
    Ort
    Issum
    Alter
    45
    Beiträge
    2.236
    Gibt es keinen einzigen Befehl wie "print" oder so Ähnliches?
    Natürlich gibt es die Möglichkeit printf zu benutzen sehe hier
    Es muß einfach nur die Ausgabe entsprechend auf UART "umgebogen" werden...
    Es stellt sich nur die Frage, ob der Aufwand lohnt...
    Auf einem M16,32,128 dürfte es egal sein, aber auf kleineren µC würde ich nicht unbedingt die stdio.h einbinden wollen und eher den schon oben gezeigten Weg gehen.

    Gruß Sebastian
    Software is like s e x: its better when its free.
    Linus Torvald

  8. #8
    Benutzer Stammmitglied
    Registriert seit
    06.11.2005
    Beiträge
    58
    Hallo Leute,

    nach ein paar einstellung hat es dann geklappt, ich empfang jetzt alles, was ich ihm eingebe.
    Mal ne Frage: wovon hängt eigentlich die Baudrate ab (Hardware, Software)?

    MfG
    Palmer

Berechtigungen

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