Problem beim Empfäng von mehreren Byte über UART

OP #2358135
Lesenswert?

Hallo,

ich versuche schon eine Weile mehrere Byte per UART vom einem Funkboard 
zu empfängen. Dabei handelt es sich um ein Startbyte das ignoriert wird 
und 7 Datenbyte.

Ich initialisiere meine UART so auf Baud 9600.
1
void uart_init(void)
2
{
3
  UBRRH = 0x00;
4
  UBRRL = 0x40;
5
  UCSRB = (1<<RXEN)|(1<<RXCIE);  // UART RX und RX Interrupt einschalten
6
}

Mein Empfängsinterrupt sieht so aus:
1
ISR(USART_RXC_vect)
2
{
3
  akku=UDR;
4
  PORTD|=0b10000000;
5
  if(daten_counter==1)
6
  {wert_h=akku;}
7
  if(daten_counter==2)
8
  {wert_l=akku;}
9
  if(daten_counter==3)
10
  {stunden=akku;}
11
  if(daten_counter==4)
12
  {minuten=akku;}
13
  if(daten_counter==5)
14
  {tage=akku;}
15
  if(daten_counter==6)
16
  {monate=akku;}
17
  if(daten_counter==7)
18
  {jahre=akku;
19
  daten_counter=255;
20
  wert = ( (uint16_t)wert_h << 8 ) | wert_l;
21
  PORTD&=0b01111111;}
22
  daten_counter=daten_counter+1;
23
}
Allerdings wird so immer nur 1 Byte empfängen! Kann es sein das der 
Interrupt zu langsam ist? Mein Atmega läuft mit 10 MHz.

Gruß und Danke Michael
OP #2358304
Lesenswert?

Christopher G. schrieb:
> In der ISR ist immer nur ein Byte abholbereit.
Beim ersten Aufruf der ISR wird das empfangene Byte ignoriert da es das 
Startbyte ist. Beim zweiten mal wird das Byte in wert_h geschrieben. 
Beim dritten mal in wert_l. Allerdings ist bei mir nachher nur eine der 
Variablen beschrieben worden.
Christopher G. schrieb:
> Vertraust auf die Defaultwerte der Register
Ja habe ich. Kann man das etwa nicht?
Michael schrieb:
> Man könnte mal mit einem Terminalprogramm gucken, ob das die Daten
> korrekt versteht.
Im Terminalprogramm werden mir die Daten richtig angezeigt.

Gruß Michael
#2358341
Lesenswert?

Michael Mayer schrieb:
> Beim ersten Aufruf der ISR wird das empfangene Byte ignoriert da es das
> Startbyte ist. Beim zweiten mal wird das Byte in wert_h geschrieben.
> Beim dritten mal in wert_l. Allerdings ist bei mir nachher nur eine der
> Variablen beschrieben worden.
Woher weißt du, dass die Variablen nicht beschrieben werden? Das 
Startbyte wird ja wohl einen definierten Wert haben. Du verwirfst 
einfach irgendein Byte. Normalerweise prüft man, ob das angekommene Byte 
dem Startbyte entspricht. Falls es nicht das Startbyte war, braucht man 
erst gar nicht den Frame auffüllen, da es sowieso falsch sein wird.

Michael Mayer schrieb:
> Ja habe ich. Kann man das etwa nicht?
Sobald du mehrere Module verwendest solltest du auf Nummer sicher gehen 
und explizit alles so einstellen, wie man es haben möchte.

> Michael schrieb:
> Im Terminalprogramm werden mir die Daten richtig angezeigt.
Das Terminalprogramm hast du ja auch nicht programmiert. Zeig mal 
deinen Code her, der auf dem µC rennt. Das, was du gepostet hast, 
hilft nicht bei der Fehlersuche. Als Anhang bitte.

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