Forum: Compiler & IDEs Problem mit MEGA 128 UND UART


von SvenP (Gast)


Lesenswert?

Hallo

Habe mich von Bascom Verabschiedet und schreibe gerade ein kleines GPS
Programm was die Daten auf ein Display dastellen soll.

Mein Problem ist das Buffern und Verarbeiten der Daten.

Ich benutze UART RECEIVE Interrupt.

darunter werden die GPS Daten in einen Buffer geschrieben und
ausgewertet nur kommt jetzt mein 128 nicht mehr nach die daten kommen
zu schnell rein.

Habe gelesen das man in Interuppt routinen nur sehr wenig machen sollte
(Verarbeitungstechnisch) ist das richtig.

Sollte ich den Code aus der Interrupt Routine auslagen in die Main???

Wie mache ich es dann mit der Bufferung.

kann ich den Interrupt anhalten wenn ein Datensatz kommplett ist und
diesen in der main verarbeite danach wieder Interrupt einschalten und
Datensatz wieder empfangen.

in Bascomm gab es einen Buffer den man setzten konnte da brauchte man
sich um nicht zu kümmern.

Buffer auf 240 und in der main loop buffer durchegehn und nach start
zeichen und ende zeichen suchen und auswerten.


aber in c habe ich nichts gefunden.

es wäre schön wenn es möglich wäre den interrupt der UART so zu
konfigurieren das er nach 240 empfangen zeichen den Interupt auslösst
und ich die Daten verarbeiten kann.

Ich wäre sehr dankbar wenn mir einer eine Tip geben könnte wie man das
lösen kann???

von Rolf Magnus (Gast)


Lesenswert?

> Habe gelesen das man in Interuppt routinen nur sehr wenig machen
> sollte (Verarbeitungstechnisch) ist das richtig.

In der Regel ja.

> Sollte ich den Code aus der Interrupt Routine auslagen in die
> Main???

Ja.

> kann ich den Interrupt anhalten wenn ein Datensatz kommplett ist
> und diesen in der main verarbeite danach wieder Interrupt
> einschalten und Datensatz wieder empfangen.

Im Prinzip ja. Du mußt halt auf das nächste Zeilenende warten, damit du
den Datensatz auch bekommst. Aber bist du sicher, daß du das brauchst?
GPS-Empfänger senden in der Regel ihre Daten einmal pro Sekunde. Was
für aufwendige Berechnungen machst du denn, daß die in einer Sekunde
nicht fertig werden?

> aber in c habe ich nichts gefunden.

Du wirst selbst was programmieren müssen. Ist aber nicht sehr schwer.

> es wäre schön wenn es möglich wäre den interrupt der UART so zu
> konfigurieren das er nach 240 empfangen zeichen den Interupt
> auslösst und ich die Daten verarbeiten kann.

Das geht nicht. Außerdem willst du das ja auch nicht, denn wer soll die
ersten 239 Zeichen in den Puffer schreiben, wenn nicht die
Interrupt-Routine?

> Ich wäre sehr dankbar wenn mir einer eine Tip geben könnte wie man
> das lösen kann???

Was sollen die Fragezeichen? Das ist keine Frage.
Du kannst in der Interrupt-Routine ein Flag setzen. Im Hauptrogramm
wird in einer Schleife auf dieses Flag gewartet. Wenn das Flag kommt,
wird die Auswertung gestartet. Allerdings wirst du sowas wie double
buffering brauchen, also z.B. schon nach dem halben Puffer das Flag
setzen, denn sonst überschreibt dein UART-Interrupt schon wieder die
Daten, die dein Hauptprogramm grade auswertet.

von SvenP (Gast)


Lesenswert?

Also mein GPS Empfänger sendet alle 1 Secunde neu Daten innerhalb der
Wekunde werden 4 Protokolle Übertragen mit jeweils midestens 30
Zeichen. Das ist allerhand in einer Sekunde innerhalb dieser Zeit muß
ich die Protokolle auswerten.

ich habe jetz mal versucht in der Interrupt Routine des UART Empfängers
schon den Datensatz zusammenzusetzen.

dh es wird gewartet bis das Startzeichen "$" kommt wenn ja dann
schreibe denn Buffer solange bis endezeichen "\r" kommt danach wird
flag gestezt und in der hauptroutine (main) das flag ausgewertet und
der Datensatz aufgesplittet (Position,Höhe usw)
in der zwischenzeit wird ja der Interrupt wieder ausgelösst aber der
buffer nicht geschrieben erst wenn in der main ein fertig Flag gesetzt
wird  fängt das Spiel von vorne an in der Interrupt routine.

Ich finde es ist niocht elegant und die Darstellungen sind verzögert.

Aber momentan weiß ich keine andere lösung.

von Rolf Magnus (Gast)


Lesenswert?

4 * 30 Zeichen = 120 Zeichen. Wenn du deinen AVR mit 16 Mhz taktest,
hast du in einer Sekunde 16000000 Taktzyklen Zeit. Das macht
rechnerisch 133333 Taktzyklen pro Zeichen. Das reicht nicht? Selbst bei
1Mhz Takt hättest du noch über 8000 Taktzyklen pro Zeichen Zeit. Etwas
davon geht natürlich für die Interrupt-Routine ab, aber das ist fast
nichts.
Dein Problem, daß die Interrupt-Routine immer warten muß, bis das
Hauptprogramm fertig ist, kannst du mit dem Double-Buffering lösen.
Mache zwei Puffer, so daß die Interrupt-Routine einen beschreiben und
die Hauptroutine gleichzeitig den anderen auslesen kann. Wenn beide
fertig sind, vertausche die Puffer.

Was meinst du mit "die Darstellungen sind verzögert"? Warum sind die
verzögert?

von Axel R. (Gast)


Angehängte Dateien:

Lesenswert?

habe ich auch mal mit rumgespielt, aber - wie immer nicht fertig
geworden - Hier werden GGA+RMC eingelesen, analysiert und wenn beide OK
sind, wird die UART abgeschaltet, die notwendigen Berechnungen werden
durchgeführt (Entfernung und Kurs zum Start/Ziel) und dann gehts von
vorne los.
Das Grundgerüst stammt von N4TXI aus dem APRS Projekt "WhereAVR".
Vlt kannst Du ja so schon was mit anfangen.
Der Quelltext ist nicht fertig und nur unzureichend dokumentiert. Bin
kein C-Profi


AxelR.

von SvenP (Gast)


Lesenswert?

OK werde ich mal versuchen.


Danke

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.