Forum: Mikrocontroller und Digitale Elektronik USART überträgt den Eingabewert einen Zyklus zu spät?


von Rene (Gast)


Lesenswert?

Hallo Leute!

ich habe ein problem mit meiner USART-Routine.
Ich benutze einen ATmega128 in GCC!

Im Hauptprogramm warte ich auf eine Eingabe, bei der ersten Eingabe(zb. 
ein 'a') bekomme ich eine 0 übertragen, bei der zweiten eingabe bekomme 
ich jetzt den asci-wert für das a übertragen. Also einen durchlauf zu 
spät... warum das ganze????

Auszug aus der Main

UDR0=USART_Recieve();
if(UDR0=='a'){send_string("fhohfkloljladjl");}
char uu;
uu=UDR0;
//itoa(uu, Buffer,10);


//---------------------------------------------------------------------- 
--
// Funktion - USART INIT
//----------------------------------------------------------------------

void USART_Init()
{
  UCSR0C |= 
(0<<USBS)|(1<<UCSZ01)|(1<<UCSZ00)|(0<<UPM01)|(0<<UPM00)|(0<<UMSEL);
  //USBS=1: Asynchron, UCSZ=11: 8 bit,

  //BAUD RATE = 9600 bei f_osc = 10 MHZ, aus Tabelle in Datenblatt
  UBRR0L = 64;
  UCSR0B |= (1<<TXEN1)|(1<<RXEN1);        //UART TX einschalten 
(transmitter)
}


//---------------------------------------------------------------------- 
--
// Funktion - USART Empfangsfunktion
//----------------------------------------------------------------------

unsigned char USART_Recieve(void)
{
/* Wait for data to be recieved */
   while (!(UCSR0A & (1<<RXC0)))
{wdt_reset();}
/* Get and return recieved data from buffer */
   return UDR0;
}


WAS MACHE ICH FALSCH......hab das gefühl.....mir ist ein dummer Fehler 
passiert....weiss nur nicht wo und welcher!

von Jörg X. (Gast)


Lesenswert?

Die USART-Sendefunktionen hast du natürlich erstmal weggleassen, die 
sind ja fehlerfrei, nicht wahr ? ;-)

Empfängst du 0 oder '0' (die Zahl, oder den ASCII code)?
Wenn es die Zahl 0 ist, kann es sein, dass du das string-Ende 
mitsendest...

Könntest ( das nächste Mal) wenigstens die Kommentare anpassen?

hth. Jörg

ps.: <klugscheiß> es heißt 'receive'

von Karl H. (kbuchegg)


Lesenswert?

> Auszug aus der Main
>
> UDR0=USART_Recieve();
> if(UDR0=='a'){send_string("fhohfkloljladjl");}
> char uu;
> uu=UDR0;

Poste das komplette main()!

Du greifst mir etwas zu oft auf das UDR0 Register zu.

Wenn du Sende und Empfangsfunktionen hast, dann läuft alles
über diese Funktionen. D.h. jeglicher anderer Code hat sich
tnulichst von diesen Registern fern zu halten.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.