-
Hier etwas neues.
Ich lasse erst nach Aufforderung senden.
Die Werte sehen auf meinem Display schon gut aus.
nur wenn der negative Wert zum ositiven Wert umschlägt ist er plötzlich sehr groß, kippe ich die Platine weiter sieht es wieder besser aus.
Mache ich da noch was mit den zusammengeführten einzelstrings was falsch?
Es soll einen complement Integer ergeben.
Hier mein Code:
Code:
$regfile = "m168def.dat"
$crystal = 18432000
$baud = 115200
$hwstack = 32 ' default use 32 for the hardware stack
$swstack = 10 ' default use 10 for the SW stack
$framesize = 40 ' default use 40 for the frame space
Dim Z As Byte
Dim I As Byte
Dim Empfang As String * 14
Dim Nick As Integer
Dim Nicka As String * 1
Dim Nickb As String * 1
Dim Roll As Integer
Dim Rolla As String * 1
Dim Rollb As String * 1
Dim Gyro As Integer
Dim Gyroa As String * 1
Dim Gyrob As String * 1
'Dim Gyroc As String * 1
'Dim Roll As Integer
'Dim Gyro_z As Integer
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
Waitms 150
Printbin 115 ; 110 ; 112 ; 1 ; 0 ; 1 ; 82 'get data gesendet 115,110,112,176,1 =data complete
' Printbin 115 ; 110 ; 112 ; 3 ; 0 ; 1 ; 84 'GET_ACCEL_BIAS
If Len(empfang) > 13 Then
Cls
Nickb = Mid(empfang , 7 , 1)
Nicka = Mid(empfang , 8 , 1)
Nick = Makeint(nicka , Nickb) 'Aus beiden Strings ein Integer machen
Locate 1 , 1 : Lcd "Nick= " ; Nick
Rollb = Mid(empfang , 9 , 1)
Rolla = Mid(empfang , 10 , 1)
Roll = Makeint(rolla , Rollb)
Locate 2 , 1 : Lcd "Roll= " ; Roll
Gyrob = Mid(empfang , 11 , 1)
Gyroa = Mid(empfang , 12 , 1)
Gyro = Makeint(gyroa , Gyrob )
Locate 3 , 1 : Lcd "Gyro= " ; Gyro
Empfang = ""
End If
Loop
Onrxd:
Empfang = Empfang + Chr(udr)
Return
End
-
probier mal das:
Dim Empfang As String * 14
dim Nick as integer at Empfang+7 overlay
dim Roll as integer at Empfang+9 overlay
dim Gyro as integer at Empfang+11 overlay
und dann:
Cls
Locate 1 , 1 : Lcd "Nick= " ; Nick
Locate 2 , 1 : Lcd "Roll= " ; Roll
Locate 3 , 1 : Lcd "Gyro= " ; Gyro
ohne die makeint-geschichte dazwischen ... sollte aufs gleiche ergebnis heraus kommen nur praktisch ohne Rechenzeit und stringkopiererei
der Gag bei Overlayvariablen ist, dass sie auf die gleiche Speicheradresse verweisen, auf die bereits eine Variable verweist.
Warum das von Vorteil ist? Der Code wird kleiner und daher auch schneller.
In Deinem Beispiel bremst das LCD die Geschichte noch aus, aber Du wirst das Ding ja auch für was Anderes verwenden wollen und da können dann µs an Ausführungszeit schon entscheidend werden.
Beispiel:
dim irgendeinstring as string * 5
dim eine_byte_variable as byte at irgendeinstring+3 overlay
an der dritten Stelle des Strings kann ich nun auch per eine_byte_variable direkt auf das Byte zugreifen. Damit ändert sich natürlich der String an der Stelle. Andersherum aber auch, wenn der String sich ändert wird auch das byte geändert.
irgendeinstring="xx1xx"
dann steht in eine_byte_variable das ASCII-Zeichen "1", also der Bytewert 49
schreiben wir nun
eine_byte_variable=50
dann steht in dem String nun "xx2xx"
Die Oberlayvariablen sind so ziemlich das Genialste an Bascom überhaupt.
Wie man in Deinem Beispiel sieht. Man kann den String einfach aneinanderreihen
und dann die beliebigen Elemente herauspicken praktisch ohne Code.
Anderes Beispiel.
Ich verwende in einer Anwendung einen externen AD-Wandler mit 16 Bit.
Diese 16 Bit überträgt er als 2 Bytes.
Ich gehe nun hin und schreibe die 2 Bytes ins S-RAM und lege eine Word-Variable
als Overlay drüber.
Nun kann ich an jeder Programmstelle direkt mit der Word-Variable arbeiten
ohne vorher jedes mal die Bytes zusammen zu setzen.
-
Hi Vitis, okay jetzt habe ich die overlay Geschichte richtig verstanden.
Jetzt, wo ich den Datensatzanfang immer an gleicher Stelle habe, ist es ja auch so zu verwenden.
Nur zum weiteren Verständnis als der Datensatz im doppelt so großen Array irgendwo stand und ich
dim Nick as integer at Empfang+7 overlay +korrektur
berechnen musste, würde denn der Korrekturwert trotzdem richtig übernommen, da er sich ja pro Datensatzanfangsuche ändert und nur am Anfang des Programmes einmal der Speicher dimensioniert wird?
Ich habe mir nen Wolf gesucht, wie ich das Integer am besten befülle.
Werden im Integer die Bytes komplementär in richtiger reihenfolge geschrieben? Wäre ja blöd wenn nicht. Ich werde es auf jeden Fall morgen ausprobieren.
Danke, dachte du hättest mich als hoffnungslos abgeschrieben, nach der Kauf dir nen Buch Aufforderung von dir.
-
mit dem doppelten array war der Empfangspuffer gemeint.
Meine Intension war, die Zeichenfolge zu suchen und bei korrekter Syntax die Message kopieren in ein zweites Array. Daraus ergibt sich dann, dass die entsprechenden Nutz-Werte immer an der gleichen stelle stehen. So kannst Du mit den Overlays die Werte direkt verarbeiten.
Zur Buchempfehlung ... naja, das Programm oben war einfach Murks, sorry.
Wenn ich in 5 Zeilen Code nen goto sehr gehn bei mir die Lichter aus.
-
Morgen Vitis,
habe jetzt das Programm mit overlay geschrieben.
Ich habe große Sprünge in der Ausgabe, deren Abhängigkeit ich nicht zuweisen kann. Ich vermute das Die Bytes falsch herum in das Integer geschrieben werden. Ich habe testweise aus dem Integer ein byte gemacht, um mir den Einzelnen Wert in Abhängikeit des Winkels anzusehen.
Das 7. Byte ist das Hibye, das 8. das lowbyte. Das Lowbyte wird mir am Display in Abhängikeit des Winkels schön angezeigt.
Da muss ich nochmal schauen.
Gibt es da einen Trick, die Bytes zu drehen?
Ich werde heute Abend mal versuchen in 2 Bytes zu schreiben und das
Highbyte *1000+lowbyte in ein integer schreiben.
-
Ihr müsst ziemlich genau die 3,3 Volt einhalten, sonst haut es nicht hin.
Auch die 115000baud sind sehr kritisch.
Vielleicht lässt sich am Gerät die baudweite runterregeln per software.
-
3,3 Volt sind per Spannungsregler und 4 Kondensatorern gegen schwingen bei mir verbaut. Der Mega 168 läuft auf 5 Volt. Die CHR Platine soll 5 Volt kompatibel sein. Ich benutze einen externen Quarz 18, xxxMhz mit 0% Error Rate für diese hohe Baud Rate. Meinst du der Mega schafft es nicht fehlerfrei durch den Interrupt ausgelöste Berechnungen bis zum nächsten Interrupt abzuschließen?
-
Veruch mal eine weile mit normalen Printbefehlen in dieser Geschwindigkeit (115000)TextDaten zu übertragen/einzulesen um zu sehen, wie die aussehen.
-
...Das Lowbyte wird mir am Display in Abhängikeit des Winkels schön angezeigt....
und wenn du 343 Grad hast, wo bleibt der Rest?
-
Die Printbefehle sehen normal aus. Es Ist ja nur snp zu lesen und dann kommen irgendwelche Zeichen (weil ASCII). Die Zeichenlänge ist annähernd gleich.
Der Filter kann nur bis unter 90 " verwendet werden.
Die Einzelbytes habe ich mir angeschaut, um zu sehen, ob sich der Wert wenn auch nur eingeschränkt richtig sichtbar ist. Und das ist er, man kann ihn schön bis 255 hochzählen lassen. Somit gibt es kein Array Speicherprobblem wegen zu hoher datenrate/zu langsame Verarbeitung.