PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : USART , zum xten mal!?



dansteu
23.03.2005, 18:32
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).



#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

Dino Dieter
23.03.2005, 21:41
Hallo

Der Code sieht soweit gut aus.

Was mir jetzt so auffällt ist, das du Daten nicht zurück setzt. Einmal a empfangen, bleibt a solange in Daten bis ein neues Zeichen kommt.

Versuch es mal so


if(Daten == 'a')
{
Daten = 0;
lcd_gotoxy(1,1);
lcd_puts ("a"); }

Oder zum eingrenzen von Fehler mal so. Dann siehst du, ob ein INT erzeugt wird.


SIGNAL(SIG_UART_RECV)
{
Daten = UDR;
UDR = Daten +1; //Zeichen +1 zurück senden
}


MFG
Dieter

dansteu
24.03.2005, 08:22
Hallo Dieter!

Danke für deine schnelle Hilfe -> Es funktioniert...!

Habe "Daten", wie du beschrieben hast, wieder auf null gesetzt und siehe da...


Für alle, die es noch Interessiert, hab ich hier noch den leicht ausgebesserten 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;
UDR = Daten;
}



void main(void)
{

lcd_init(LCD_DISP_ON);
lcd_clrscr();
lcd_puts ("Hallo");
UBRRL = 47;
UBRRH = 0;
UCSRB |= (1<<TXEN) |(1<<RXEN)|( 1<<RXCIE);
UCSRC |= (1<<URSEL) | (3<<UCSZ0);
sei();
abfrage();

}






abfrage()
{

for(;;)
{

if(Daten == 'a')
{
Daten = 0;
lcd_gotoxy(1,1);
lcd_puts ("a");
}


if(Daten == 'd')
{
Daten = 0;
lcd_gotoxy(1,1);
lcd_puts ("d");
}


}
}


Nochmals Danke!

Gruß Daniel