mikrocontroller.net

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


Autor: Rene (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Jörg X. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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'

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.