Forum: Mikrocontroller und Digitale Elektronik UART Interrupt im Logger - Logik


von Filth _. (filth)


Lesenswert?

Hallo,

an einem Atmega644 hängt ein GPS Sensor, der mit 5Hz Daten per UART 
sendet.
Das Programm auf dem µC soll ebenfalls mit etwa 5Hz laufen. Pro 
Durchlauf werden noch ADC-Werte und eine Frequenz per Timer gemessen.

Frage:
Wie sichere ich nun am besten die ankommenden Werte vom GPS Sensor? 
Einfach 1x per Durchlauf den Interrupt auslösen und die Daten in einer 
Variablen sichern?

Danke!

von spess53 (Gast)


Lesenswert?

Hi

>Das Programm auf dem µC soll ebenfalls mit etwa 5Hz laufen.

Ich würde ein paar MHz nehmen.

>Wie sichere ich nun am besten die ankommenden Werte vom GPS Sensor?
>Einfach 1x per Durchlauf den Interrupt auslösen und die Daten in einer
>Variablen sichern?

Was soll da einen Interrupt auslösen?
Üblicherweise sendet der GPS-Empfänger die Daten in einem NMEA-String. 
Diesen String solltest du in einen Puffer einlesen und dann decodieren.

MfG Spess

von Filth _. (filth)


Lesenswert?

Also wenn die Daten am RX anliegen löst ein Interrupt aus. In der 
aufgerufenen Methode wird der Empfangspuffer in eine Variable 
geschrieben, die dann im Hauptprogramm verfügbar ist.

Würdest du das ganze schneller laufen lassen? Ich wollte an den 5 Hz 
festhalten, da die GPS Daten in der Frequenz kommen. Ok man könnte die 
Frequenz mit Faktor 10 multiplizieren und die GPS Daten dazwischen 
interpolieren.

von spess53 (Gast)


Lesenswert?

Hi

>Also wenn die Daten am RX anliegen löst ein Interrupt aus. In der
>aufgerufenen Methode wird der Empfangspuffer in eine Variable
>geschrieben, die dann im Hauptprogramm verfügbar ist.

Also du bekommst die Daten z.B. in folgender Form:

$GPGGA,161229.487,3723.2475,N,12158.3416,W,1,07,1.0,9.0,M, , , 
,0000*18<CR><LF>

In diesem String sind z.B. UTC Time, Latitude, N/S Indicator, Longitude,
E/W Indicator, ... enthalten. NMEA-Strings fangen alle mit einem '$' an. 
Das
must du erkennen und dann die Zeichen bis <CR><LF> speichern. Der 
Rx-Complete-Interrupt wird aber bei jedem Zeichen ausgelöst. In dem 
Interrupt kannst du die Anfang-, Ende-Erkennung und das Abspeichern 
erledigen.

>Würdest du das ganze schneller laufen lassen? Ich wollte an den 5 Hz
>festhalten, da die GPS Daten in der Frequenz kommen. Ok man könnte die
>Frequenz mit Faktor 10 multiplizieren und die GPS Daten dazwischen
>interpolieren.

Das war mehr auf den Controller gemünzt. Eigentlich braucht dein 
Programm keinen 'Takt'. Der wird ja schon vom GPS-Empfänger vorgegeben.

MfG Spess

von Filth _. (filth)


Lesenswert?

Hi,

der Empfang von dem String ist eigentlich kein Problem - ich erkenne das 
<cr> und speichere dann den String.
Was mir etwas Sorgen macht ist folgendes:

Der Sensor liefert ja alle 250ms einen Datensatz. Ich weiß aber nicht 
von "wann" der Wert im Buffer ist. Das Hauptprogramm sammelt jetzt also 
die Werte der weiteren Sensoren und liest dann einmal den 
Empfangsbuffer. In dem Moment ist dann aber unbekannt, ob der GPS Wert 
249ms alt ist oder eben nur 2ms.

Ein weiteres Problem bzw Frage:
Der Interrupt kann ja jederzeit ausgelöst werden, ich glaube das ist 
aber nicht zulässig, wenn gerade ADC gelesen wird, oder?
Ich messe noch mit PB0 (Capture1) eine angelegte Taktfrequenz. Gibt es 
ein Problem mit den beiden Interrupts, wenn die sich in die Quere 
kommen?

Das sind alles Anfängerfragen - sorry!

von spess53 (Gast)


Lesenswert?

Hi

>der Empfang von dem String ist eigentlich kein Problem - ich erkenne das
><cr> und speichere dann den String.

Dann sollte er schon gepeichert sein. Die UART kann nur einzelne Zeichen 
puffern.

>Das Hauptprogramm sammelt jetzt also die Werte der weiteren Sensoren und
>liest dann einmal den Empfangsbuffer. In dem Moment ist dann aber >unbekannt, ob 
der GPS Wert 249ms alt ist oder eben nur 2ms.

Dann starte doch die Messungen nach Empfang der Strings. Eine 
ADC_Messung (First Conversation) dauert ca. 200µs.

>Ich messe noch mit PB0 (Capture1) eine angelegte Taktfrequenz. Gibt es
>ein Problem mit den beiden Interrupts, wenn die sich in die Quere
>kommen?

Ein laufender Interrupt wird nicht unterbrochen und andere Interrupts 
werden in der Zeit gespeichert. Bei hinreichend kurzen Interruptroutinen 
kein Problem.

MfG Spess

von Alex (Gast)


Lesenswert?

Stimmt, das ist eine gute Idee - dann wäre der Rest mit dem GPS 
synchronisiert. Danke für die Anregung!

Wie würdest du es lösen, fallst das Hauptprogramm doch mit einem höheren 
Takt als der GPS-Sensoren laufen soll? Auf Anhieb fällt mir ein einfach 
den GPS-Buffer jedes mal mit zu schreiben und später in der Auswertung 
zu prüfen, ob die Werte gleich sind - falls es der Fall ist, werden die 
dann verworfen.

Der ganze Vorgang würde sich dann am ersten GPS String synchronisieren.

von spess53 (Gast)


Lesenswert?

Hi

>Wie würdest du es lösen, fallst das Hauptprogramm doch mit einem höheren
>Takt als der GPS-Sensoren laufen soll?

So richtig verstehe ich nicht, was du mit 'Takt' meinst. Ein Programm 
führt Befehle mit der vom Controller-Takt vorgegebenen Geschwindigkeit 
aus.

MfG Spess

von Alex (Gast)


Lesenswert?

Also die Logik ist folgende:
Das Programm läuft in einer Endlosschleife.
In jedem Durchlauf werden die Sensorwerte gelesen und dann auf einen USB 
Stick geschrieben.

Um nicht unnötigen Overhead zu generieren, würde ich dann nach jedem 
Durchlauf eine künstliche Verzögerung a la waitms 125 einbauen. Dieser 
Wait ist dann den Takt, von dem ich spreche :)

Grüße
Alex

von spess53 (Gast)


Lesenswert?

Hi

Vielleicht sollte mal die Programmiersprache geklärt werden.

>Um nicht unnötigen Overhead zu generieren, würde ich dann nach jedem
>Durchlauf eine künstliche Verzögerung a la waitms 125 einbauen. Dieser
>Wait ist dann den Takt, von dem ich spreche :)

Warum 'wait'. Z.B. kann der ADC des ATMega von einem Timer getriggert 
werden (ADC Auto Trigger Source:  Timer/Counter0 Overflow,Timer/Counter1 
Compare Match B, Timer/Counter1 Overflow, Timer/Counter1 Capture Event).
Das wäre auch für andere Aktivitäten die sinnvollere Methode.

MfG Spess

von Alex (Gast)


Lesenswert?

Hallo Spess,

also zu meiner Schande - ich programmiere in Bascom.
Klar - man könnte das ganze mit einem Timer triggern, aber hat das 
Vorteile gegenüber einem Aufbau wie:

do
sammle werte
speichere werte
waitms x
loop

?

Grüße
Alex

PS. Gut dass ich nicht der einzige bin, der heute am PC hängt ;)

von spess53 (Gast)


Lesenswert?

Hi

>also zu meiner Schande - ich programmiere in Bascom.

Als notorischer Assemblerprogrammierer bin ich Naserümpfen gewöhnt.

>In jedem Durchlauf werden die Sensorwerte gelesen und dann auf einen USB
>Stick geschrieben.

Hast du das schon Hard- und Softwaremäßig abgeklärt?

>Klar - man könnte das ganze mit einem Timer triggern, aber hat das
>Vorteile gegenüber einem Aufbau wie:

Ich persönlich lasse den Controller, das was er allein kann auch allein 
machen. Du solltest auch bedenken, das die Verwaltung des USB-Sticks 
einige Rechenzeit in Anspruch nehmen kann.

MfG Spess

von Filth _. (filth)


Lesenswert?

spess53 schrieb:

>
> Hast du das schon Hard- und Softwaremäßig abgeklärt?
>

Ja, ih benutze das STI100 Interface. Der Atmega644P-20 hat ja 2 UARTs. 
An UART 0 hängt das STI, an UART 1 der GPS Sensor.

>
> Ich persönlich lasse den Controller, das was er allein kann auch allein
> machen. Du solltest auch bedenken, das die Verwaltung des USB-Sticks
> einige Rechenzeit in Anspruch nehmen kann.
>

Stimmt an die Verwaltung habe ich nicht gedacht, wobei es eigentlich 
relativ schnell gehen sollte. Ich habe jetzt in der Spec. vom STI zwar 
keine Timings gefunden, Controllerseitig muss ich aber eigentlich nur 
die zu schreibenden Daten per UART an das Interface senden.

Also die ideale Vorgehensweise wäre per Timer eine Methode aufzurufen, 
die die Sensordaten einliest und am Ende auf den Stick schreibt?

Grüße
Alex

von spess53 (Gast)


Lesenswert?

Hi

>Also die ideale Vorgehensweise wäre per Timer eine Methode aufzurufen,
>die die Sensordaten einliest und am Ende auf den Stick schreibt?

Ich würde es so machen. Ist aber meine persönliche Meinung.

>Ja, ih benutze das STI100 Interface. Der Atmega644P-20 hat ja 2 UARTs.
>An UART 0 hängt das STI, an UART 1 der GPS Sensor.

Hast du es wirklich schon benutzt?

MfG Spess

von Filth _. (filth)


Lesenswert?

Jap, zwar ausserhalb von der aktuellen Platine, aber ich habe das Ding 
probehalber in einem Testaufbau ausprobiert.

Warum fragst du? Kennst du das Teil? Hab ich da Probleme zu erwarten?

Gruß
Alex

von spess53 (Gast)


Lesenswert?

Hi

>Warum fragst du?
Weil die mitgelieferten Sourcen in C sind.

>Kennst du das Teil?
Nur vom ELV-Magazin.

>Hab ich da Probleme zu erwarten?
Kann ich nicht sagen

MfG Spess

von Filth _. (filth)


Lesenswert?

Jap das stimmt, aber die Doku ist recht gut, so dass das Teil sich 
relativ Problemlos auch aus Bascom heraus ansprechen lies. Zumindest in 
meinen Versuchen war ich ziemlich zufrieden damit!

Gruß
Alex

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.