Hallo!
Ich habe ein Navilock-GPS Modul (NL-504ETT), bei dem ich lediglich die
Höhe benötige (ATmega8/Bascom).
Der unten genannte Code läuft nicht. Werden die GPS-Signale/NMEA-Daten
auf den Hardware-UART-Eingang gesendet und mit Inkey() ausgwertet, so
läuft alles...
Nehme ich für die eingehenden Signale den Software-UART, überliefert das
"Inkey(#2)" nichts...
Ich weiß nicht mehr weiter, ich würde mich über Hilfestellungen freuen!
hier der Code:
Das Wait 1 ist für Software UART absolut fehl am Platz. Soft UART kennt
meines Erachtens kein Echo. Die "Schnittstelle" wird ja auch nur für
Input geöffnet.
Hier wie ich es anfangen würde (ungetestet):
@peterfido
ich suche schon ne ganze weile nach einem grundgerüst um mein projekt
voranzutreiben....allerdings finde ich nicht viel....und bin auch recht
unerfahren was die programmierung betrifft.
nach diesem thread zu urteilen, kennst du dich aus mit gps daten über
uart einzulesen...
deswegen würde ich dich bitten mal nen blick auf meinen thread zu
werfen:
Beitrag "Re: GPS Daten über RS232 in Atmega8 einlesen, Code gesucht!"
danke im vorraus
lg
Ich habe keinerlei Erfahrungen mit GPS Auswertung. Wenn der uC ständig
mit Daten beliefert wird, rate ich zu Hardware UART. Da geht auch bei
umfangreichem Code nichts verloren. Es gibt auch Atmels mit mehreren
Hardware UARTs, falls Du mehr als eine Schnittstelle benötigst.
Kommen immer gleich lange Strings rein, würde ich mit Overlay arbeiten,
variieren diese z.B. durch mal 1 und dann wieder 2 stellige Zahlen, dann
jeweils am Trennzeichen in ein Array schieben. Dieses würde ich dann
schon beim Empfang erledigen.
Auch einen schönen Trick gibt es mit den externen Interrupts.
Wenn ich die Softuart verwende lege ich den Pin auf einen
Interrupt-Pin und konfiguriere den auf falling.
Dann in der Interruptroutine frage ich per Inkey ab, so geht
mir kein Zeichen durch die Lappen.
Noch was ... du springst aus einer Subroutine in eine Subroutine.
Kann man machen wird aber bei größeren Programmen zum Einen irgendwann
sehr unübersichtlich, zum Andern läuft irgendwann der Stack über ->
Quelle für sehr dubiose Fehlfunktionen ...
Besser, du setzt ein Flag und springst dann bei gesetztem Flag aus der
Mainloop in die Auswerte-Sub.
Ach so, einen Tip hab ich noch ...
Die Abfrage ob ein Zeichen eingegangen ist kann man besser in der
Mainloop vornehmen und erst bei Zeichenempfang in die Subroutine
springen.
Der Vorteil ist, es spart Rechenzeit, weil das Stackschreiben etc.
wegfällt wenn nix zu machen ist.
Bei dem kurzen Programm noch kein Problem, kann aber bei längeren
timingkritischen Geschichten ordentlich was aus machen.
Ja, das kann man machen. Die Register werden ja eh gesichert, da macht
es dann nichts, wenn man weiter springt. Allerdings schalte ich am
Anfang den INT aus und aktiviere ihn erst am Ende wieder.
Ich springe allerdings schon seit Jahren aus der Empfangsroutine in die
Auswertung. Das klappt auch bei bei Soft-UART per INT, wenn man diesen
dann auch solange deaktiviert. Das hat bei mir den Vorteil, dass sich
während der Abarbeitung das Byte nicht ändert.
Bei kleineren Atmegas kann dann aber das RAM bei verschachtelten
Sprüngen schonmal knapp werden, wie Du bereits erwähnt hast. Bei meinen
Projekten hat dieser bisher immer gereicht. Wichtig ist, dass man immer
sauber zurückspringt.