schaue Dir einmal den INSTR Befehl an.
Gruß Richard
Druckbare Version
schaue Dir einmal den INSTR Befehl an.
Gruß Richard
schaue Dir einmal den INSTR Befehl an.
Gruß Richard
Hallo Richard,
habe den befehl eingebunden.
Funktioniert aber leider so nicht.
Vitis hat mir noch den Tipp gegeben ein 2. overlay array einzubinden, um den gefundenen Datensatz komplett im 2. overlay zu zertrennen.
Das habe ich nicht hinbekommen.
Hier mal der neue Code:
Kann den code mal jemand für mich berichtigen?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 Pos As Byte
Dim C As Byte
Dim D As Byte
Dim E As Byte
Dim F As Byte
'Dim Pitch As Integer At S(2) + C Overlay
'Dim Roll As Integer At S(2) + D Overlay
'Dim Gyroz As Integer At S(2) + E Overlay
'Dim Chk As Integer At S(2) + F 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
Zurueck:
If Dsz > 23 Then
Cls
Dsz = 0
Pos = Instr(s , "snp")
C = Pos + 6
D = Pos + 8
E = Pos + 10
F = Pos + 12
Dim Pitch As Integer At S(2) + C Overlay
Dim Roll As Integer At S(2) + D Overlay
Dim Gyroz As Integer At S(2) + E Overlay
Gosub Werteschreiben
End If
Loop
Onrxd:
Incr Dsz
B(dsz) = Udr
Return
Werteschreiben:
If Pos = 0 Then 'wenn pos =0 dann wurde snp nicht gefunden
Goto Zurueck
End If
Cls
Locate 1 , 1 : Lcd "Pitch= " ; Pitch
Locate 2 , 1 : Lcd "roll= " ; Roll
Locate 3 , 1 : Lcd "gyroz= " ; Gyroz
'Lcd "pos= " ; Pos
Return
End
So gibt mir das Display für alle 3 Werte 28275 aus mit ein paar Störungen zwischendurch.
Dim in der Programmschleife ist ja auch nicht so prickelnd oder?
Ich hätte nicht gedacht, das ich an dieser Sache so hängen bleibe.
das wird schon nix werden wegen dem Goto Zurueck da läuft Dir der Stack über weil Du ja per Gosub in die Subroutine springst.
Verbanne Goto aus dem Sprachschatz, das ist wirklich nur in ganz ganz wenigen Ausnahmen sinnig gebrauchbar.
Die DIM's gehören an den Anfang des Programms, das wird vom Compiler nur einmal gemacht, die IF davor wird niemals was ergeben zur Redimmensionierung der Variablen. Das ginge nur, wenn Du direkt auf das S-RAM per adressierung zugreifst.
Den Code berichtigen liefe auf das Schreiben eines neuen Codes hinaus ... mir persönlich zu viel Arbeit.
Mein Tip: geh nochmal ganz zum Anfang, besorge Dir ein gutes Buch über Bascom Programmierung und arbeite Dich dort Schritt für Schritt durch Programmstrukturen und Programmabläufe. Sorry, klingt hart, ist aber herzlich gemeint. Programmieren ist kein Rätselraten, sondern harte Arbeit vor allem am Anfang.
Goto sollte man verbieten, Gosub /return oder Call/return ist
allemal besser.Zuweisungen wie config oder Dim u.s.w. gehören immer ganz am Anfang, der Compieler reserviert da einfach nur Speicherplatz für die Variablen. Wenn Du diesen Speicherplatz später veränderst (wenn das überhaupt geht), überschreibst du vorher zugeordnete Adressen b.z.w. deren Inhalt!!!
Gruß Richard
Hi Vitis / Richard, okay goto streiche ich von meinem Befehlssatz.
Ich habe das Bascom AVR Buch von Roland Walter. Über sein Beispiel habe ich auch das Overlay Array aufgebaut. Ich habe das Buch bestimmt schon 4 x gelesen und auch fast alles verstanden. Ist sozudagen meine Bettlektüre bei jedem neuen Projekt, das ich starte.
Die geringe Beteiligung in diesem Thread durch andere Forumsmitglieder zeigt mir, das entweder dieses Thema (Overlay und bytes aus Strings in andere Variablen, Maskierung) bei vielen noch nicht so klar ist / nicht verstanden wurde (wie bei mir) oder
die Leute keine Lust haben zu antworten (Das ich mir nicht vorstellen kann)
Wenn ich fertig bin, werde ich auf jeden Fall den funktionierenden Code hier reinstellen, damit andere auch was davon haben.
Einfach nur die komplette Lösung bekomen behindert bei den meisten Leuten den Lernprozess. Ich selber will es ja auch verstehen.
Deshalb bin ich für jeden Tip dankbar.
Diese ganze STR "Sch****" ist auch zum Mäusemelken. :-(
Mit den Overlay habe ich mich auch noch nicht richtig befasst, ist auch irgendwie dämlich beschrieben. Ich teste neues immer möglichst klein gehalten bis ich den Sinn (hoffentlich) verstanden habe. Erst danach setze ich das zu einem Programm zusammen, ist übersichtlicher. :-)
Gruß Richard
ich hänge heute auch schon 4 studen dran und habe es ohne overlay zu Fuss nochmal versucht mir die einzelnen strings in bytes auf mein Display auszugeben.
nur mal ein auszug:
aus dem array "empfang" den Anfang des Datensatzes finden, dann in einen neuen kleineren String "datensatz"übernehmen.Code:Pos = Instr(empfang , "snp")
Datensatz = Mid(empfang , Pos , 15) 'snp Datensatz 15er Länge komplett in einem String
Cls
astring = Mid(datensatz , 1 , 1)
Bb = astring
Locate 1 , 1 : Lcd Bb
dann mit MID ein Byte in Astring übernehmen.
Astring in ein Byte umwandeln und ausgeben.
Ich habe so per Hand 8 werte auf mein Display gegeben, die sich aber nicht merklich ändern bei Bewegung der Platine.
Der 10. Wert ändert sich von 81 auf was anderem im Sekundentakt, das wars.
Ist es richtig das ich mit makeint aus 2 Bytes ein Integer zur anzeige machen kann?
So endlich gute Neuigkeiten. \:D/
Ich habe den Modus von Dauersenden (Broadcast mode) auf senden bei Nachfrage (Silent Mode) geändert.
Jetzt zeigt mit das Terminalprogramm auch alle bytes wie beschrieben an.
@Richard klein anfangen war ein guter Tipp.
Das Get_Data Packet, das geschickt werden muss, schicke ich mit printbin und sieht so aus:
115,110,112,1,0,1,82
s,n,p,PT,N,chksum,chksum
Im Datenblatt steht PT=0x01 (Mit dem Windows Rechner von Hex 01 nach Dez)
Die Checksum wird so errechnet: alle Werte addieren, die letzten(linken) 8 bit sind das 1. Checksum Byte und die anderen 8 Bit das 2. checksum Byte.
In diesem Fall 115+110+112+1=338
Zur Verdeutlichung:
338 sind Binär 1 01010010 = Letzte Byte 00000001 also 1= Dez 1 und
in das erste Byte 01010010 also 1010010 =Dez 82
Jetzt weiss ich wenigstens schonmal was da ankommt. Der Datensatz unterscheidet sich um 2 Bytes von der größeren chr6dm Platine!!!
Es muss ein Terminalprogramm verwendet werden, das auch dezimal ausgeben kann, sonst sieht man nur snp und danach Hyroglyphen.
Ich nehme das von Robotikhardware, war auf einer CD beim Funkboard dabei.
Hier meine Befehlsliste mit den Befehlen, die ich benötige.