Hallo zusammen
Habe ein Problem in BASCOM mit der HW UART und der Funktion Bytematch.
Mein Programm läuft auf einem ATmega328, und liest in der main loop
verschiedene Sensorwerte ein und verarbeitet diese entsprechend weiter.
Zusätzlich soll der AVR Daten von einem GPS verarbeiten, die über die HW
UART rein kommen. Ein GPS-Datensatz beginnt mit '$' und endet mit CRLF.
Um das ende zu erkennen habe ich die funktion Bytematch verwendet.
Soweit funktioniert auch alles, jedoch nach ca. 500 empfangenen
Datensätzen wird irgendwie das RAM oder der Stack durcheinander
gebracht, und der AVR macht dann irgend welchen komischen sachen.
Ohne GPS, also ohne empfangenen UART Daten, läuft der AVR stundenlang
ohne Probleme, der Fehler muss also irgendwo in der Empfangsroutine der
HW UART liegen.
Um mal die ganze GPS Datenverarbeitung auszuschliessen sende ich zum
testen '$TEST' an den AVR, und der soll dann mit '1234' antworten. Dies
funktioniert die ersten 500 mal, und irgendwann gerät im RAM oder Stack
etwas durcheinander...
Also hier mal ein Code Ausschnitt mit den UART relevanten Teilen (anbei
der ganze Code):
1 | 'Serialport config
|
2 | Config Com1 = 38400 , Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
|
3 | Config Serialin = Buffered , Size = 100 , Bytematch = 13
|
4 | Config Serialout = Buffered , Size = 20
|
5 | Open "com1:" For Binary As #10
|
6 |
|
7 | Enable Interrupts
|
8 |
|
9 | 'main loop
|
10 | do
|
11 | ....
|
12 | Call Read_serial()
|
13 | loop
|
14 |
|
15 | end
|
16 |
|
17 |
|
18 | Serial0charmatch:
|
19 | Input Serial_txt Noecho
|
20 | Return
|
21 |
|
22 |
|
23 | Sub Read_serial()
|
24 | Local X As Byte
|
25 |
|
26 | Disable Interrupts
|
27 | Tmp_serial_txt = Serial_txt
|
28 | Serial_txt = ""
|
29 | Enable Interrupts
|
30 |
|
31 | X = Instr(tmp_serial_txt , "$")
|
32 | X = Len(tmp_serial_txt) - X
|
33 | Incr X
|
34 | Tmp_serial_txt = Right(tmp_serial_txt , X)
|
35 |
|
36 | Select Case Tmp_serial_txt
|
37 | Case "$TEST"
|
38 | Print #10 , "1234"
|
39 | End Select
|
40 | End Sub
|
in der Bascom Hilfe steht, dass man bei Verwendung von Bytematch die
register selber sichern muss, habe ich bereits mit Pushall/popall
versucht, hat aber auch nichts genützt.
Hat jemand Erfahrungen mit dem Bytematch ? gibt es irgendwelche
speziellen eigenheit von Bascom die man berücksichtigen muss ?