HannoHupmann
13.12.2008, 21: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
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