USART überträgt den Eingabewert einen Zyklus zu spät?

Gast #687790
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!
Gast #687805
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'
#687830
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren