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