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???
> 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.
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.
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?
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.
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.