Forum: Compiler & IDEs UART senden / empfangen / synchronisieren


von Max  . (ueps)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe mal wieder ein Problemchen mit meinem µC. Handelt sich dabei um 
einen ATMEGA169.. Auf dem berühmten Butterfly-Board..

Und zwar geht es darum zwei Systeme zu synchronisieren. Um das ganze 
drumherum bitte keine Gedanken machen..

Habe den aktuellen Quellcode mal angehängt, aber hier mal eine kurze 
Beschreibung:

Die beiden Controller sollen Synchron laufen, bzw. merken wenn sie 
asynchron sind oder der andere zu lange zum antworten braucht.
habe das über die UART realisiert. dabei senden sich beide systeme 
gegenseitig ihren status (in form einer zahl von 0-255) zu.

hier der relevante codeausschnitt:
1
void doSync(){
2
3
  // aktuellen Status senden
4
  if(cStatus <= iMaxStat){
5
    sendChar(cStatus);
6
  }
7
  else
8
    stdError();
9
  
10
  // Watchdog  zurück setzen um keinen Alarm beim Warten auf Statusantwort zu schlagen
11
  wdt_reset();
12
  
13
  _delay_loop_2(4000);
14
  
15
  TCNT2 = 0;
16
  OCR2A = iDelayMs;              // Lädt das Vergleichsregister
17
  TCCR2A = (1<<CS20)|(1<<CS22)|(1<<WGM21);  // Initialisiert den Timer und startet ihn
18
  
19
  // Schleife zur überprüfung ob Synchronisation stattgefunden hat
20
  while (!(UCSRA & (1<<RXC)));        // Prüfe ob Daten empfangen wurden    
21
  
22
  
23
  
24
  cReceived = UDR;
25
  
26
  if(cReceived != cStatus){              // Wenn Daten empfangen mit aktuellem Status vergleichen
27
    syncError();              // Bei ungleichheit Sychronitätsverlust melden
28
  }  
29
    
30
  TCCR2A &= ~((1<<CS20)|(1<<CS22));      // Timer anhalten
31
}

Mit dem DELAY oben geht es. Die Sache ist die, dass ich, wenn ich das 
DELAY entferne, nach ein paar Sync-Zyklen den Fehler des 
"Sync-Verlustes" bekomme, da ich nurnoch eine 0 zurück lese.. (cReceived 
= 0). Allerdings sendet das andere System den korrekten (und darüber 
hinaus auch synchronen Status)..

Beispiel: Sync 1,2,3,4 gehen durch, bei Sync 5 lese ich nurnoch eine 0 
zurück (hätte aber eine 5 sein müssen, welches das andere System auch 
gesendet hat) allerdings geht er nicht immer bis Sync5 sondern auch 
manchmal nur bis 3 oder auch mal bis 7..

Warum ist dies so? Ich dachte der µC setzt RXC erst, wenn die 
Übertragung komplett abgeschlossen wurde.

Die Kabel an der USART sind ca. 10cm lang, zwischen TX und GND ist ein 
Widerstand von 3,14*Daumen 8kOhm, damit der µC auch seine 3.3V bekommt 
statt die 5V..

Vielleicht sieht ja einer den Fehler!

gruß
Max

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.