UART senden / empfangen / synchronisieren

OP #1149047
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
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.