Hi, ich arbeite schon länger mit AVRs, allerdings habe ich noch nichts mit UART gemacht. Vom Prinzip ist mir das schon klar, allerdings weiß ich nicht recht, wie ich die Schnittstelle für mein Projekt am besten nutze. Ich habe 2 Atmega 32 die jeweils Senden und Empfangen müssen. Ablauf Hauptschleife µC A 1. liesst Sensor aus 2. empfängt Sensordaten von µC B 3. Berechnung neuer Daten aus empf. Daten und Sensordaten 4. schickt berechnete Daten an µC B 5. Zeichnet Daten auf Display 6. Abbruchbed. prüfen Hauptschleife µC B 1. liesst Sensor aus 2. Senden an µC A 3. empfängt berechnete Daten von µC A 4. Zeichnet Daten auf Display Man sieht schon, dass µC A der Hauptcontroller mit den Berechnungen ist und µC B eigentlich schneller einen Schleifendurchgang beendet. Im Prinzp müssen beide Sensordaten von verschiedenen Orten auf einen µC berechnet werden und dann auf beiden die Ergebnisse ausgegeben werden. (Sensoren sidn nicht gleich und brauchen wahrscheinlich unterschiedlich lang zum auslesen, aber dennoch sehr schnell) Allerdings ist es somit wichtig, dass die Reihenfolge auch eingehalten wird. Gleichzeitig sollen beide Senden und Empfangen. Da sehe ich dann die Probleme mit Interrupts. Wenn ich es allerdings ohne Interrupts mache, muss ich ständig auf die Daten warten und ein gutes Timing einbauen. ( µC B sendet kontinierlich und muss gleichzeitig auf die Empfangsbestätigung von µC A warten, weil er ja nicht weiß, wann µC A soweit ist) Wie kann ich das am besten realisieren? Vielen Dank
zwei Orte mit einer kleinen Entfernung Darstellung an beiden Orten möchte Uart integrieren (zum lernen)
Das ist ein typischer Ping-Pong-Betrieb.
Beide Anwendungen zusammengefasst:
1. A liest Sensor B liest Sensor
2. A empfängt Daten von B B sendet Daten an A
3. A berechnet Daten B wartet auf Daten von B
4. A sendet Daten an B B empfängt Daten von A
.
.
.
weiter mit 1.
Gleichzeitiges Senden und Empfangen passiert nicht. Darf auch nicht.
Sonst würde der schnellere Controller "B" den armen Controller "A" in
kürzester Zeit dichtsch...
Die mains müssen dann etwa so aussehen:
A:
int main(void)
{
ReadSensor();
while (!AllDataReceived){}
Calculate();
SendData();
.
.
.
}
B:
int main(void)
{
ReadSensor();
SendData();
while (!AllDataReceived){}
.
.
.
}
Die Daten sollten von A "per Interrupt" empfangen werden, damit
unterschiedliche Lesezeiten der Sensoren keine Rolle spielen.
Für B ist das egal. Der macht ja nichts anderes als warten.
Dann muß noch ein vernünftiges Protokoll eingebaut werden:
- Checksumme, d.h. mindestens ein XOR über die Daten
- Timeouts, damit sich nicht einer totwartet, falls der andere
abgestürzt ist.
Man muss das Kabel während der Übertragung ziehen können...
Das Timing ergibt sich aus diesem Daten-Ping-Pong von selber. Der
Nachteil ist natürlich, solange die Controller nicht noch was anderes zu
tun haben, daß der schnelle immmer auf den langsamen warten muß. Man
kann das evtl. allerdings ein bisschen effektiver gestalten, indem man
z.B. den Sensor ausliest, die Daten sendet und während der andere
rechnet, die Daten der vorherigen Berechnung ausgibt, anstatt nur
wartend auf der Stelle zu treten. Dann müssen die Daten aber auch hier
"per Interrupt" empfangen werden.
mfg.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.