-
Im Prinzip ja, aber es wird kein Schrott heraus kommen, da ja der Pointer beim Speichern weiter läuft und der Interrupt die Programmausführung unterbricht.
Ausserdem macht es Sinn das Array nicht ständig zu prüfen sondern n Flag im URXC-Interrupt zu setzen und erst bei gesetztem Flag den Eingang zu prüfen in der Mainloop.
Wenn tatsächlich Datenmüll dabei raus kommt macht das garnix, weil ja die Prüfsumme nicht stimmt.
-
Du hast mich auf eine tolle Idee gebracht. Ich weiss ja aus wieviel bytes ein Datensatrz besteht. Durch den Flag aus dem URXC lasse ich eine anderes Byte hochzählen, bis die Anzahl der empfangenen Bytes eine Datensatzlänge entspricht.
Erst dann lese ich aus.
super, danke.
-
im prinzip kannst du das so machen, aber irgendwann wird mal der Datenbereich der Bytefolge "snp" entsprechen und die Geschichte kommt aus dem Tritt.
ich fürchte Du wirst schlussendlich nicht um die komplette prüfung herum kommen
-
kann mir jemand sagen wie die beiden Chk Bits errechnet werden?
Die Summe aller Bytes ohne den beiden Chk Bytes?
Wie ist der Inhalt der beinden Chk Bytes aufgeteilt?
Werden die chk Bytes addiert?
-
Achtung.
Bei der neuen Firmwareversion ist ein Kalman Filter vorhanden. Erst dann können Pich und Roll ausgelesen werden.!!!
Datenblatt wurde auch geändert!!!!
-
Mit der Imu Software zeigt mir der roll Wert bei liegender Platine (IC´s oben) einen Winkelwert von um die 200 an. Bei einer Nick Bewegung an einer bestimmten Stelle zwichen ein paar Grad, haut der Wert auf 40. Icht meine Platine defekt? Habe daraufhin das Firmwareupdate 2.0 installiert. Feher ist der Gleiche geblieben.Auch wenn ich die 200 als Null Wert nehme, ist die Veränderung zur Lage nicht richtig.
Der nick Wert liegt um die Null und zeigt recht genau die Winkelposition an. So sollte es auch sein. Kann ich in diesem Programm den roll Wert auch auf null setzen ?
Bin am verzweifeln.
-
Habe einen neuen Thread im Senor Bereich aufgemacht, da das jetzige Problem ja nichts mit Bascom zu tun hat.
-
Jetzt habe ich mal ein Mini Programm geschrieben, das mir die über UART empfangenen Daten rx über meinen ATMEGA über tx an ein Terminalprogramm weitergibt.
Code:
$regfile = "m168def.dat"
$crystal = 18432000
$baud = 115200
Dim Rxdflag As Bit
On Urxc Onrxd 'Interrupt auslösen, wenn volsändiges Zeichen geladen.
Enable Urxc
Enable Interrupts
Do
If Rxdflag = 1 Then 'flagauswertung bei empfangenen USART Byte
Rxdflag = 0
Print Udr
End If
Loop
Onrxd:
Rxdflag = 1
Return
End
Bekomme gerade aus meinem Atmega werte, die so nicht im CHR Datenblatt stehen.
Wenn ich meine Werte aus der udr einfach über die uart wieder ausgebe mit allen aktivierten achsen dann kommt das hier bei mir raus.
112
115
110
112
202
112
115
110
112
185
112
115
110
112
253
112
115
110
112
247
112
115
110
112
57
112
115
110
112
183
112
115
110
112
192
112
115
110
112
209
112
115
112, 115,110 ist laut Dateblatt "snp" der Datensatzanfang.
Danach kommen aber nur 2 Werte,dann wieder der neue Datensatzanfang.
Laut Datenblatt müsste snp, PT,N,alle Achsen also 8,und 2 Check Bytes gesendet werden.
merkwürdig...
Was mache ich falsch ?
-
kann mir keiner einen Tipp geben?
-
habe jetzt ein neues Programm mit overlay.
Wie suche ich im array jetzt den Datensatzanfang s n p ?
Schift funktioniert nicht.
Wenn ich den dsz verändere, veränder ich auch die Speicherstelle des neu empangenen Bytes.
Wie kann ich also meine overlay Maske auf dem String verschieben?
Code:
$regfile = "m168def.dat"
$crystal = 18432000
$baud = 115200
Dim Z As Byte
Dim I As Byte
Dim S As String * 24
Dim B(25) As Byte At S Overlay
Dim Dsz As Byte
Dim Check As Integer
Dim Ss As Byte At S(1) Overlay
Dim Nn As Byte At S(1) + 1 Overlay
Dim Pp As Byte At S(1) + 2 Overlay
Dim Pt As Byte At S(1) + 3 Overlay
Dim Num As Byte At S(1) + 4 Overlay
Dim Pitch As Integer At S(2) + 5 Overlay
Dim Roll As Integer At S(2) + 7 Overlay
Dim Gyroz As Integer At S(2) + 9 Overlay
Dim Chk As Integer At S(2) + 11 Overlay
On Urxc Onrxd 'Interrupt auslösen, wenn volsändiges Zeichen geladen.
Enable Urxc
Enable Interrupts
Config Lcd = 16 * 3 , Chipset = Dogm163v5
Config Lcdbus = 4 'configure lcd screen
Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portd.7 , Db6 = Portd.6 , Db7 = Portd.5 , E = Portd.2 , Rs = Portd.3
Waitms 100
Initlcd
Waitms 100
Display On
Cursor Off Noblink
Cls
Do
'Check = Ss
'Check = Check + Nn
'Check = Check + Pp
'Check = Pt
'Check = Check + Num
'Check = Check + Pitch
'Check = Check + Roll
'Check = Check + Gyroz
If Dsz > 23 Then
'If Ss = 115 And Nn = 110 And Pp = 112 And Chk = Check Then
If Ss = 115 And Nn = 110 And Pp = 112 Then
Dsz = 0
Gosub Werteschreiben
Else
Shift S , Right ,1
End If
End If
Loop
Onrxd:
Incr Dsz
B(dsz) = Udr
Return
Werteschreiben:
Cls
Locate 1 , 1 : Lcd "gyroz= " ; Gyroz
Locate 2 , 1 : Lcd "Pitch= " ; Pitch
Locate 3 , 1 : Lcd "roll= " ; Roll
Return
End