mikrocontroller.net

Forum: Compiler & IDEs UART senden / empfangen / synchronisieren


Autor: Max  • (ueps)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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:
void doSync(){

  // aktuellen Status senden
  if(cStatus <= iMaxStat){
    sendChar(cStatus);
  }
  else
    stdError();
  
  // Watchdog  zurück setzen um keinen Alarm beim Warten auf Statusantwort zu schlagen
  wdt_reset();
  
  _delay_loop_2(4000);
  
  TCNT2 = 0;
  OCR2A = iDelayMs;              // Lädt das Vergleichsregister
  TCCR2A = (1<<CS20)|(1<<CS22)|(1<<WGM21);  // Initialisiert den Timer und startet ihn
  
  // Schleife zur überprüfung ob Synchronisation stattgefunden hat
  while (!(UCSRA & (1<<RXC)));        // Prüfe ob Daten empfangen wurden    
  
  
  
  cReceived = UDR;
  
  if(cReceived != cStatus){              // Wenn Daten empfangen mit aktuellem Status vergleichen
    syncError();              // Bei ungleichheit Sychronitätsverlust melden
  }  
    
  TCCR2A &= ~((1<<CS20)|(1<<CS22));      // Timer anhalten
}

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

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.