Christoph2
28.06.2009, 21:15
Hi!
Ich bin ein totaler usart-neuling, will dass mein roboter endlich mal mit dem pc kommuniziert.
Im rn-wissen bereich habe ich gleich das passende tutorial gefunden:
http://www.rn-wissen.de/index.php/UART_mit_avr-gcc
Ich hab das einfach mal so nachgemacht (die variante mit interrupts).
roboter.c
#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <fifo.h>
#include <uart.h>
// USART KOMMUNIKATION
// Empfangene Zeichen werden in die Eingabgs-FIFO gespeichert und warten dort
SIGNAL (SIG_UART_RECV)
{ _inline_fifo_put (&infifo, UDR);
}
// Ein Zeichen aus der Ausgabe-FIFO lesen und ausgeben
// Ist das Zeichen fertig ausgegeben, wird ein neuer SIG_UART_DATA-IRQ getriggert
// Ist die FIFO leer, deaktiviert die ISR ihren eigenen IRQ.
SIGNAL (SIG_UART_DATA)
{
if (outfifo.count > 0)
UDR = _inline_fifo_get (&outfifo);
else
UCSRB &= ~(1 << UDRIE);
}
int main(void)
{
...
uart_init();
...
while(1) //Hauptschleife
{ ...
}
}
Die datein uart.c, uart.h, fifo.c und fifo.h wurden 1:1 aus dem tutorial entnommen.
Da habe ich jetzt noch nichts übertragen, nur mal initialisiert. Trotzdem erhalte ich schon fehler:
infifo undecleared
outfifo undecleared
infifo und outfifo kommen in der Interruptroutine vor, und die kennt er anscheinend nicht.
Die beiden Variablen sind aber in der Datei uart.c definiert.
Das struct (fifo_t) ist in der Datei fifo.h definiert.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <uart.h>
#include <fifo.h> // erklärt im Artikel "FIFO mit avr-gcc"
#define BAUDRATE 38400UL //Definition als unsigned long, sonst gibt es Fehler in der Berechnung
// FIFO-Objekte und Puffer für die Ein- und Ausgabe
#define BUFSIZE_IN 0x40
uint8_t inbuf[BUFSIZE_IN];
fifo_t infifo;
#define BUFSIZE_OUT 0x40
uint8_t outbuf[BUFSIZE_OUT];
fifo_t outfifo;
void uart_init()
{...
}
Wieso wieso kennt er outfifo und infifo nicht?
Liegt das daran dass die variablen in der Interruptroutine vorkommen?
müssen infifo und outfifo vielleicht globale variablen sein?
lg Christoph
Ich bin ein totaler usart-neuling, will dass mein roboter endlich mal mit dem pc kommuniziert.
Im rn-wissen bereich habe ich gleich das passende tutorial gefunden:
http://www.rn-wissen.de/index.php/UART_mit_avr-gcc
Ich hab das einfach mal so nachgemacht (die variante mit interrupts).
roboter.c
#include <avr/io.h>
#include <stdlib.h>
#include <util/delay.h>
#include <stdint.h>
#include <avr/interrupt.h>
#include <fifo.h>
#include <uart.h>
// USART KOMMUNIKATION
// Empfangene Zeichen werden in die Eingabgs-FIFO gespeichert und warten dort
SIGNAL (SIG_UART_RECV)
{ _inline_fifo_put (&infifo, UDR);
}
// Ein Zeichen aus der Ausgabe-FIFO lesen und ausgeben
// Ist das Zeichen fertig ausgegeben, wird ein neuer SIG_UART_DATA-IRQ getriggert
// Ist die FIFO leer, deaktiviert die ISR ihren eigenen IRQ.
SIGNAL (SIG_UART_DATA)
{
if (outfifo.count > 0)
UDR = _inline_fifo_get (&outfifo);
else
UCSRB &= ~(1 << UDRIE);
}
int main(void)
{
...
uart_init();
...
while(1) //Hauptschleife
{ ...
}
}
Die datein uart.c, uart.h, fifo.c und fifo.h wurden 1:1 aus dem tutorial entnommen.
Da habe ich jetzt noch nichts übertragen, nur mal initialisiert. Trotzdem erhalte ich schon fehler:
infifo undecleared
outfifo undecleared
infifo und outfifo kommen in der Interruptroutine vor, und die kennt er anscheinend nicht.
Die beiden Variablen sind aber in der Datei uart.c definiert.
Das struct (fifo_t) ist in der Datei fifo.h definiert.
#include <avr/io.h>
#include <avr/interrupt.h>
#include <uart.h>
#include <fifo.h> // erklärt im Artikel "FIFO mit avr-gcc"
#define BAUDRATE 38400UL //Definition als unsigned long, sonst gibt es Fehler in der Berechnung
// FIFO-Objekte und Puffer für die Ein- und Ausgabe
#define BUFSIZE_IN 0x40
uint8_t inbuf[BUFSIZE_IN];
fifo_t infifo;
#define BUFSIZE_OUT 0x40
uint8_t outbuf[BUFSIZE_OUT];
fifo_t outfifo;
void uart_init()
{...
}
Wieso wieso kennt er outfifo und infifo nicht?
Liegt das daran dass die variablen in der Interruptroutine vorkommen?
müssen infifo und outfifo vielleicht globale variablen sein?
lg Christoph