Forum: Mikrocontroller und Digitale Elektronik GSM-GPS Auswertung gleichzeitig


von Matthias S. (mat-sche)


Lesenswert?

Hallo liebe Gemeinde,

hänge nun schon zu lange in meinem Projekt fest und bräuchte mal nen 
paar Tips von Euch Profis!

Bin gerade dabei mir mit einem GSM/GPS Modul eine Motorradalarmanlage 
aufzubauen. Beide Geräte benötigen einen Uartport für die 
Datenauswertung. Ich progge in Bascom einen ATmega644p.

Beide Module habe ich am Laufen, auch gemeinsam funktioniert alles gut. 
Jedenfalls wenn ich Daten nach der GPS-Auswertung per SMS sende habe ich 
alles wie ich es will.Nun wollte ich mich mit dem Empfang von Daten über 
GSM beschäftigt und da fängt mein Problem an!

Bisher habe ich einen comport vom Mega für die Programmierung über einen 
Bootloader genutzt, den 2. hängt mein GSM dran. Den GPS-String lese ich 
per Interrupt und Softuart ein.

Mein Problem ist, dass ich den GPS-String dauernd über den Interrupt 
einlese und auswerte. Rufe ich nun mein GSM an, werden nicht die 
gesamten GSM-Daten eingelesen. Die Ursache ist der interrupbasierende 
GPS-Datenempfang.

Nun zu meiner Frage:

wie würdet Ihr mein Problem lösen?
Ich möchte den GPS-String immer einlesen aber auch dabei gleichzeitig 
einen Datenstring über den anderen Com-Port empfangen wollen.

MAT

von Weingut P. (weinbauer)


Lesenswert?

Ohne den Quellcode kann man praktisch nix sagen.

Prinzipiell kannst Du beide UARTs per Interrupt RXC lesen
und auch Sendebuffer per TXC realisieren ...
kann mir fast nicht vorstellen das da bei "normalen"
Baudraten Timingprobleme auftauchen sollten.

von Thomas (Gast)


Lesenswert?

Matthias S. schrieb:
> Mein Problem ist, dass ich den GPS-String dauernd über den Interrupt
> einlese und auswerte. Rufe ich nun mein GSM an, werden nicht die
> gesamten GSM-Daten eingelesen. Die Ursache ist der interrupbasierende
> GPS-Datenempfang.

Zur Not könntest du vielleicht auf die Aktualisierung der GPS Daten 
verzichten, während du gerade dein GSM anrufst. Oder bist du 
Dauertelefonierter, so dass die GPS Daten dann hoffnungslos veralten 
würden? Mit welcher Datenrate kommunizierst du denn mit dem GSM?

von Matthias S. (mat-sche)


Lesenswert?

Hi!
DAnke für Eure Antworten!

Das GPS läuft mit 4800 und GSM mit 19600. Die Sache in der ich ein 
Problem sehe ist, was passiert mit den Daten vom GSM Uart wenn gerade 
ein GPS-String eingelesen wird? Das GPS Modul sendet 7 verschiedene 
Strings von max. 70 Zeichen. Aus diesen Strings muss ich mir 2 
raussuchen, in der meine benötigten Daten liegen.

Ich will aus Bascom die Routinen mit dem gepufferten Empfang nutzen.

=> jetzt funktioniert schon einmal der gepufferte Empfang vom 
GPS-String:
1
Do
2
3
If Z = 1 Then
4
   If _rs_bufcountr1 > 50 And _rs232inbuf1(_rs_bufcountr1) = 13 Then
5
         Disable Urxc1
6
         Print "nmea " ; Nmea
7
         Gosub Gps_auswertung
8
9
   End If
10
End If
11
12
Loop
13
Close #1
14
Close #2
15
16
End
17
18
19
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ GPS-Stringauswertung
20
Gps_auswertung:
21
    Nmea_name = Mid(nmea , 1 , 5)
22
    Print "Nmea_name = " ; Nmea_name                                                                                                                  'Left(nmea , 5)                                                                                                                        ' NMEA - Messagestring erkennen
23
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "GPRMC" ~~~~~~~~~~~~~~~~~~
24
    If Nmea_name = "GPRMC" Then
25
       Nmea_time = Mid(nmea , 7 , 2) + ":" + Mid(nmea , 9 , 2) + ":" + Mid(nmea , 11 , 2)
26
       Nmea_valid = Mid(nmea , 14 , 1)
27
       Nmea_latitude_grad = Mid(nmea , 16 , 2)
28
       Nmea_latitude_min_sec = Mid(nmea , 18 , 7)
29
       Nmea_n_s = Mid(nmea , 26 , 1)
30
       Nmea_longitude_grad = Mid(nmea , 28 , 3)
31
       Nmea_longitude_min_sec = Mid(nmea , 31 , 7)
32
       Nmea_e_w = Mid(nmea , 39 , 1)
33
       Nmea_speed = Mid(nmea , 41 , 5)
34
       Nmea_date = Mid(nmea , 51 , 2) + "." + Mid(nmea , 53 , 2) + "." + Mid(nmea , 55 , 2)
35
       Latitude_singl = Val(nmea_latitude_min_sec)
36
       Longitude_singl = Val(nmea_longitude_min_sec)
37
38
39
40
'~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ "GPGGA" ~~~~~~~~~~~~~~~~~~
41
    Elseif Nmea_name = "GPGGA" Then
42
       Nmea_time = Mid(nmea , 7 , 2) + ":" + Mid(nmea , 9 , 2) + ":" + Mid(nmea , 11 , 2)
43
       Nmea_latitude_grad = Mid(nmea , 14 , 2)
44
       Nmea_latitude_min_sec = Mid(nmea , 16 , 7)
45
       Nmea_n_s = Mid(nmea , 24 , 1)
46
       Nmea_longitude_grad = Mid(nmea , 26 , 3)
47
       Nmea_longitude_min_sec = Mid(nmea , 29 , 7)
48
       Nmea_e_w = Mid(nmea , 37 , 1)
49
       Latitude_singl = Val(nmea_latitude_min_sec)
50
       Longitude_singl = Val(nmea_longitude_min_sec)
51
52
   End If
53
       If Print_debug = 1 Then
54
         Print "time= " ; Nmea_time ; "," ; Nmea_date
55
         Print "Latitude= " ; Nmea_latitude_grad ; " " ; Nmea_n_s ; " " ; Nmea_latitude_min_sec
56
         Print "Longitude= " ; Nmea_longitude_grad ; " " ; Nmea_e_w ; " " ; Nmea_longitude_min_sec
57
         Print "Speed= " ; Nmea_speed
58
         Print "Valid= " ; Nmea_valid
59
   End If
60
   'Rs232_dummy = Memcopy(mem_dummy , _rs232inbuf1(1) , _rs_bufcountr1 , 2)
61
   Nmea = ""
62
   First_str = 0
63
   Nmea_count = 0
64
   Enable Urxc1
65
   Reset Z
66
Return
67
68
'++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Uart ISR
69
'Uart Interrupt bei jedem eingehenden Zeichen zur Nutzung Erkennung Ende einer Übertragung
70
'wird Timer Count nicht mehr genullt, dann in der Alarmmain auslesen des RS232 Buffer
71
Serial1charmatch:
72
Clear Serialin1
73
Set Z
74
75
Return

nun will ich mal schauen wie sich die Auswertung auswirkt wenn ich den 2 
uart in betrieb nehme....

Danke schon einmal bis dahin

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.