Forum: Mikrocontroller und Digitale Elektronik Problem beim Empfäng von mehreren Byte über UART


von Michael M. (eos400dman)


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

von Albert .. (albert-k)


Lesenswert?

wie ist Daten Counter definiert?

von Michael M. (eos400dman)


Lesenswert?

Ich definiere ihn so:
1
volatile uint8_t daten_counter=0;

von Michael (Gast)


Lesenswert?

Michael Mayer schrieb:
> Kann es sein das der
> Interrupt zu langsam ist? Mein Atmega läuft mit 10 MHz.

Das siehst du am einfachsten, wenn du das Ganze im Simulator 
durchspielst und die Stopuhr anguckst. Ein Byte zu empfangen dauert 
etwas 1 ms und deine ISR sollte in ein paar µs abgearbeitet sein.

von Michael M. (eos400dman)


Lesenswert?

Laut AVR Studio dauert der Durchlauf durch den ISR mit Rücksprung 9,4µs. 
Also nicht zu langsam. Aber woran kann es dann liegen? Wenn ich es 
simuliere (durch manuelles setzen von UDR und den Flags im Simulator) 
werden auch alle Bytes Empfänger aber in der Hardware nicht.

Gruß Michael

von Michael (Gast)


Lesenswert?

Man könnte mal mit einem Terminalprogramm gucken, ob das die Daten 
korrekt versteht. Sonst hilft auch ein Oszi, um zu sehen, ob die Daten, 
die vom vom Funkboard kommen, ok sind.

von Christopher G. (cbg)


Lesenswert?

In der ISR ist immer nur ein Byte abholbereit. Was meinst du mit 
"Allerdings wird so immer nur 1 Byte empfängen!"? Wie sieht der 
restliche Code aus?
Die Initialisierung ist ja recht dürftig. Vertraust auf die Defaultwerte 
der Register. Stimmt das überhaupt?

von Michael M. (eos400dman)


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

von Christopher G. (cbg)


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.

von Michael M. (eos400dman)


Lesenswert?

Das Problem hat sich gelöst. Es lag an der Software des Funkmoduls 
welche ich aus dem Internet gezogen habe. Diese kam nicht mir dem Wert 0 
klar und hat nur noch mit gesendet.

Danke für eure Hilfe.

Gruß Michael

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.