-
        

Ergebnis 1 bis 2 von 2

Thema: Ausgabe von Werten über Serielle Schnittstelle

  1. #1
    Moderator Robotik Einstein Avatar von HannoHupmann
    Registriert seit
    19.11.2005
    Ort
    München
    Alter
    34
    Beiträge
    4.528
    Blog-Einträge
    1

    Ausgabe von Werten über Serielle Schnittstelle

    Anzeige

    Hallo,

    von dieser Seite http://alt.kreatives-chaos.com/index...e=c_uart_flash hab ich mir einen Code kopiert der mit Hello World auf der Konsole ausgibt. Er funktioniert einwandfrei.

    Code:
    #include <avr/io.h>
    #include <avr/interrupt.h>
    #include <avr/signal.h>
    #include <avr/pgmspace.h>
    
    #define SYSCLK		7372800
    #define BAUD		9600UL
    #define UBRR_BAUD	((SYSCLK/(16*BAUD))-1)
    
    #define	TRUE	1
    #define	FALSE	0
    
    // USART initialisieren
    void uart_init(void);
    
    volatile unsigned char daten_gesendet = TRUE;
    const prog_char* volatile p_string;
    
    // Zeichenkette im Flashspeicher
    prog_char daten[] = "Hello World!\n";
    
    int main(void)
    {
    	// USART initialisieren
    	uart_init();
    
    	sei();
    
    	while (1)
    	{
    		if (daten_gesendet)
    		{
    			// Flag zurücksetzen
    			daten_gesendet = FALSE;
    
    			// Pointer zeigt auf die Daten im Flashspeicher
    			p_string = daten;
    
    			/* Interrupt aktivieren, damit wird sofort zur
    			   Interruptroutine gesprungen und das erste Zeichen gesendet. */
    			UCSRB |= (1<<UDRIE);
    		}
    	}
    }
    
    void uart_init(void)
    {
    	// Baudrate einstellen ( Normaler Modus )
    	UBRRH = (unsigned char) (UBRR_BAUD>>8);
    	UBRRL = (unsigned char) (UBRR_BAUD & 0x00FF);
    
    	// Aktivieren des Empfängers, des Senders und des "Daten empfangen"-Interrupts
    	UCSRB = (1<<RXEN)|(1<<TXEN);
    
    	// Einstellen des Datenformats: 8 Datenbits, 1 Stoppbit
    	UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
    }
    
    /* Interrupt wird ausgelöst sobald der Sendepuffer leer ist */
    SIGNAL(SIG_UART_DATA)
    {
    	char buffer = pgm_read_byte(p_string++);
    
    	/* Wenn nicht das Ende der Zeichenkette erreicht wurde,
    	   dann weiteres Zeichen senden */
    	if ( buffer != '\0' ) {
    		UDR = buffer;
    
    	} else {
    
    		// Flag setzen, das der String gesendet wurde
    		daten_gesendet = TRUE;
    
    		// Interrupt deaktivieren
    		UCSRB &= ~(1<<UDRIE);
    	}
    }
    Nun möchte ich den Code aber so erweitern bzw. umbauen, dass ich eine Variablen Text ausgeben kann. D.h. ich möchte z.B. Ausgeben: "Der Sensortwert beträgt: " und dann eine Variable z.B. x =253. Leider weis ich nicht was ich machen muss und alle versuche den Code umzubauen schlugen bisher fehl.
    Hoffentlich kann mir einer von euch weiter helfen.

    EDIT: Leider komm ich mit der in der Wiki beschriebenen AVR GCC Bibliothek für UART auch nicht weiter bzw. zu keinem Ergebniss.

    viele Grüße
    HannoHupmann

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Jaecko
    Registriert seit
    16.10.2006
    Ort
    Lkr. Rottal/Inn
    Alter
    35
    Beiträge
    1.987
    Den variablen Text mach ich immer mit der Funktion "sprintf". Frisst zwar etwas Ressourcen, aber arbeitet soweit recht gut.
    Also wenn du z.B. ne Variable 'text' als char-Array hast, dann könnte das etwa so aussehen:

    sprintf(text, "Sensor %d: Temperatur %d°C\r\n", sensornr, temp);
    Ist sensornr 3 und temp 25, dann steht in text das hier:
    "Sensor 3: Temperatur 25°C" (+ Zeilenumbruch)

    Bzw. bei deinem Beispiel:
    sprintf(text, "Der Sensorwert beträgt: %d \r\n", x);

    Dann einfach die Variable 'text' senden.
    #ifndef MfG
    #define MfG

Berechtigungen

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