Hallo zusammen,
ich versuche schon seit einer Weile die Usart-Verbindung von meinem Atmega32 über das MySmartUsb MK2 auf die Reihe zu bekommen. Zum empfangen/senden benutze ich das HyperTerminal. Das was der Atmega sendet empfange ich auch, allerdings kann ich nichts an den Atmega senden da er offenbar aus der Lesefunktion rausspringt. Hier mal meine Einstellungen zwecks Baudrate und Lesefunktion(diese hab ich zugegeben aus der Asuro lib "geklaut").
Code:
#include <avr/io.h>
#ifndef MCU
#define MCU atmega32
#endif
#ifndef F_CPU
#define F_CPU 16000000
#endif
#include <util/delay.h>
#define USART_BAUD_RATE 9600
#define USART_BAUD_SELECT (F_CPU/(USART_BAUD_RATE*16L)-1)
void SerRead (
unsigned char *data,
unsigned char length,
unsigned int timeout)
{
unsigned char i = 0;
unsigned int time = 0;
UCSRB = (1<<RXEN); // Empfaenger einschalten
if (timeout != 0)
{
/*
Die Funktion wird auf alle Faelle, auch ohne empfangene Daten, wieder
verlassen. --> nonblocking mode
*/
while (i < length && time++ < timeout)
{
if ((UCSRA & (1<<RXC)))
{
data [i++] = UDR;
time = 0;
}
}
if (time > timeout)
data [0] = 'T';
}
else
{
/*
Die Funktion wird auf alle Faelle erst nach dem Empfang von der
vorgegebenen Anzahl Zeichen verlassen. blocking mode
*/
while (i < length)
{
while(!(UCSRA & (1<<RXC)));
data [i++] = UDR;
}
}
}
int main()
{
unsigned char data[4];
UBRRH = (unsigned char) (USART_BAUD_SELECT>>8);
UBRRL = (unsigned char) USART_BAUD_SELECT;
UCSRB = (1 << RXEN) | (1 << TXEN);
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
SerRead(data, 2, 0);
//...weiterer Code
}
Schreibe ich in die letzte while-Schleife der SerRead-Funktion rein, dass bei jedem Durchlauf/bei jeder Abfrage eine "hallo" gesendet wird, werd ich "zugespammt". Wenn ich das nicht tue, wird einfach der weitere Code ausgeführt und nichts gelesen.
Lesezeichen