Forum: Mikrocontroller und Digitale Elektronik USART effizient verwenden


von Bastler07 (Gast)


Lesenswert?

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

von spess53 (Gast)


Lesenswert?

Hi

Welchen Grund gibt es, zwei Controller zu verwenden?

MfG Spess

von Bastler07 (Gast)


Lesenswert?

zwei Orte mit einer kleinen Entfernung
Darstellung an beiden Orten
möchte Uart integrieren (zum lernen)

von Thomas E. (thomase)


Lesenswert?

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
Noch kein Account? Hier anmelden.