Hallo,
folgende Frage lässt mich nicht mehr ruhig schlafen -> Was ist an dem angefügten C-Code Falsch?
Ich möchte gerne über den Controller (ATmega32) Zeichen empfangen. Senden mit dem BRAY Terminal, vom Controller zum PC, funktioniert soweit einwandfrei. Also laut Datenblatt von Atmel muss bei einer Taktfrequenz von 7,3728 MHz und 9600 Bauds, UBRRL = 47 (dez), eingestellt werden.
Die Fusebits hab ich schon kontrolliert. (...müssen ja stimmen, wenn das Senden funktioniert, oder?)
Meiner Meinung nach (bitte korrigiert mich), sollte ein Interrupt ausgelöst werden, sobald ein Zeichen empfangen wird. Dieses wird nun in die Variable "Daten" gespeichert. "Daten" wird verglichen, und je nachdem erfolgt eine ausgabe am Display. (Peter Fleurys lcd libary).
Code:
#include <inttypes.h>
#include <avr/io.h>
#include "lcd.h"
#define LCD_LINES 2
#define LCD_DISP_LENGTH 8
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/iom32.h>
volatile unsigned char Daten;
int p;
SIGNAL(SIG_UART_RECV)
{
Daten = UDR;
}
void main(void)
{
lcd_init(LCD_DISP_ON);
lcd_clrscr();
UBRRL = 47;
UBRRH = 0
UCSRB |= (1<<TXEN) |(1<<RXEN)|( 1<<RXCIE);
UCSRC |= (1<<URSEL) | (3<<UCSZ0);
sei();
abfrage();
}
abfrage()
{
for(;;)
{
if(Daten == 'a')
{lcd_gotoxy(1,1);
lcd_puts ("a"); }
if(Daten == 'd')
{lcd_gotoxy(1,1);
lcd_puts ("d");}
}
}
Das Display flimmert kurz, wenn ich eines der beiden Zeichen sende ( also nur bei "d" und "a"). Dass lässt mich daraus schließen, das ein Interrupt ausgelöst wurde. Allerdings funktioniert das nur einmal, dann muss ich den Controller Reseten.
Vielen Dank schon mal im Voraus
Gruß Daniel
Lesezeichen