schaue Dir einmal den INSTR Befehl an.
Gruß Richard
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.
Vor den Erfolg haben die Götter den Schweiß gesetzt
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. \/
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.
Lesezeichen