PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Ausgabe von Werten über Serielle Schnittstelle



HannoHupmann
13.12.2008, 20:52
Hallo,

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


#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

Jaecko
13.12.2008, 21:29
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.