$regfile = "m32def.dat" ' specify the used micro $crystal = 1000000 ' used crystal frequency $baud = 4800 ' use baud rate $hwstack = 100 ' default use 32 for the hardware stack $swstack = 100 ' default use 10 for the SW stack $framesize = 60 Waitms 500 'Alles fuer den EEPROM Const E_ctlw = &B1010_0000 Const E_ctlr = &B1010_0001 Config Scl = Portc.0 Config Sda = Portc.1 Dim E_ah As Byte Dim E_al As Byte dim Sbyte_single(4) as byte dim single_wert as single at SByte_single overlay dim Sbyte_int(2) as byte dim Int_wert as integer at SByte_Int overlay dim s1 as byte dim s2 as byte dim s3 as byte dim s4 as byte Declare Sub E_write(byval Speicherzelle_pos As Word , Dat As Byte) Declare Sub E_read(byval Speicherzelle_pos As Word , E_dat As Byte) declare Sub Intspeicher(byval Start_Speicherzelle As Word , Intueber As Integer) declare Sub Intlese(byval Start_Speicherzelle As Word , Intueber As Integer) declare Sub Singlespeicher(byval Start_Speicherzelle As Word , Singleueber As Single) declare Sub Singlelese(byval Start_Speicherzelle As Word , Singleueber As Single) 'Enable Interrupts Config Lcdbus = 4 Config Lcdpin = Pin , Db4 = Portb.0 , Db5 = Portb.1 , Db6 = Portb.2 , Db7 = Portb.3 , E = Portb.4 , Rs = Portb.5 Config Lcd = 16 * 2 'configure lcd screen config portb.6 = output LED alias portb.6 config porta.2 = output RXGPS alias porta.2 config porta.1 = output TXGPS alias porta.1 config portd.7 = output RXPC alias portd.7 config porta.3 = output TXPC alias porta.3 'config porta.2 = output 'GPS_Schalter alias porta.2 config pina.0=input Schalter alias pina.0 Dim Eingabestring as string*80 Dim Eingabestring2 as string*80 dim sucher as string *6 dim sucher2 as string *1 dim suchergros1 as string *10 dim suchergros2 as string *10 dim position as byte dim position1 as byte dim position2 as byte dim komma1 as byte dim komma2 as byte dim komma3 as byte dim komma4 as byte dim komma5 as byte dim komma6 as byte dim komma7 as byte dim komma8 as byte dim komma9 as byte dim komma10 as byte dim nordwert as single dim nordwert_i as integer dim nordwert2 as single dim nordwert3 as single dim ostwert as single dim ostwert2 as single dim ostwert3 as single dim ostwert_i as integer dim uhrzeit as single dim Hoehe as integer dim orts_versatz as single dim orts_versatz_i as integer dim orts_versatz_alt as single dim real_versatz as Single dim vorgabe_versatz as single dim laengenminute as single dim zwischenspeicher as single dim zwischenspeicher2 as single dim genauigkeit as single Dim Uhrzeit_ar(120)as integer Dim Hoehe_ar(120)as integer Dim Norden_ar(120)as single Dim Osten_ar(120)as single dim abgefragt as Bit dim wertschreiben as bit dim eingestellt as bit dim zahler as integer dim zahler2 as byte dim zahler3 as integer dim zahler5 as Integer dim ortszahler as integer dim arrayzahler as integer, arrayzahlerx as eram integer dim zahler4 as byte dim scrolldisplay as byte Dim Startzahler As long , Startzahlerx As Eram long Dim Speicherzelle As Byte , Speicherzellex As Eram Byte Dim Speicherzelle_pos As word , Speicherzellex_pos As Eram word dim zurueckgelegte_Strecke as long,zurueckgelegte_Streckex as eram long dim zurueckgelegte_Strecke2 as long dim speicherzelle_pos2 as word dim EEPROM_GROESSE as long, EEPROM_GROESSE_x as eram long dim zusatzinformationx As Eram String*40 dim vorgabe_versatzx as eram Single dim vorgabe_genauigkeit as single dim vorgabe_genauigkeitx as eram single dim Test_ok as byte Dim E_dat As Byte Dim Dat As Byte Dim E_addr As Word cursor off 'Lesen aus dem Eeprom Startzahler = Startzahlerx Speicherzelle=Speicherzellex Speicherzelle_pos=Speicherzellex_pos zurueckgelegte_Strecke=zurueckgelegte_Streckex arrayzahler=arrayzahlerx EEPROM_GROESSE=EEPROM_GROESSE_x if Startzahler<=0 then 'Erster Start nach Beschreiben EEPROM_GROESSE=5333 EEPROM_GROESSE_x=EEPROM_GROESSE arrayzahler=1 arrayzahlerx=arrayzahler Startzahler = Startzahler + 1 Startzahlerx = Startzahler 'Festlegen der Grundeinstellungen zurueckgelegte_Strecke=0 zurueckgelegte_Streckex=zurueckgelegte_Strecke 'Speicherzellenposition nullen Speicherzelle_pos=&H0010 Speicherzellex_pos=Speicherzelle_pos 'Speicherzelle, auf der Daten abgelegt werden 'EEPROM=1, Intern=2 Speicherzelle=1 Speicherzellex=Speicherzelle 'vorgabe_versatz in Meter, ab dem augelöst wird vorgabe_versatz=30 vorgabe_versatzx=vorgabe_versatz vorgabe_genauigkeit=3 vorgabe_genauigkeitx=vorgabe_genauigkeit 'Zusatzinformation Eingabestring="********Platz fuer Verewigungen********" zusatzinformationx=Eingabestring end IF 'EEPROM-TEST test_ok=1 Dat = 0 while E_addr < &H0010 Call E_write(e_addr , Dat) Call E_read(e_addr , E_dat) if E_dat=Dat then else Test_ok=0 end IF Dat=Dat+1 incr E_addr wend locate 1,1 if test_ok=1 then lcd "EEPROM OK!" else lcd "EEPROM FEHLER!" EEPROM_GROESSE=0 waitms 2000 end if locate 1,1 Lcd "POSLOG 0.2|" ; Startzahler Startzahler = Startzahler + 1 Startzahlerx = Startzahler Deflcdchar 0 , 31 , 23 , 19 , 17 , 17 , 19 , 23 , 31 'Pfeil vorgabe_versatz=vorgabe_versatzx vorgabe_genauigkeit=vorgabe_genauigkeitx if Schalter=0 then RXGPS=1 TXGPS=1 RXPC=0 TXPC=0 'GPS_Schalter=1 abgefragt=0 else RXGPS=0 TXGPS=0 RXPC=1 TXPC=1 'GPS_Schalter=0 end if For zahler4 = 1 To 16 Locate 2 , zahler4 Lcd Chr(0) Waitms 150 Next zahler4 wertschreiben=0 scrolldisplay=1 do if Schalter=0 then 'GPS_Schalter=1 if abgefragt=1 then RXGPS=1 TXGPS=1 RXPC=0 TXPC=0 abgefragt=0 waitms 500 end if input Eingabestring noecho toggle LED abgefragt=0 sucher="$GPGGA" Position = Instr(Eingabestring , sucher) if Position>0 then zahler=79 zahler2=0 while zahler >1 sucher2="" Position1=zahler Eingabestring2=right(Eingabestring,Position1) sucher2=left(Eingabestring2,1) if sucher2 = "," then incr zahler2 'Zahler2-Zustände '1=Uhrzeit '2=Norden '3=N '4=Osten '5=E '6=Position Fix Indicator (0=not available|1-3=valid) '7=Satelittenanzahl '8=Genauigkeit '9=Höhe if zahler2=1 then komma1=Position1-1 end if if zahler2=2 then komma2=Position1-1 end if if zahler2=3 then komma3=Position1-1 end if if zahler2=4 then komma4=Position1-1 end if if zahler2=5 then komma5=Position1-1 end if if zahler2=6 then komma6=Position1-1 end if if zahler2=7 then komma7=Position1-1 end if if zahler2=8 then komma8=Position1-1 end if if zahler2=9 then komma9=Position1-1 end if if zahler2=10 then komma10=Position1-1 end if end if zahler=zahler-1 wend if scrolldisplay=1 or scrolldisplay=2 then locate 1,1 lcd " " locate 2,1 lcd " " end if zahler4=komma8-komma9 zahler4=zahler4-1 Position1=komma8 Eingabestring2=right(Eingabestring,Position1) suchergros1=left(Eingabestring2,zahler4) genauigkeit=val(suchergros1) zahler4=komma2-komma3 zahler4=zahler4-1 Position1=komma2 Eingabestring2=right(Eingabestring,Position1) suchergros1=left(Eingabestring2,zahler4) nordwert=val(suchergros1) nordwert=nordwert/100 nordwert_i=int(nordwert) nordwert=nordwert-nordwert_i nordwert=nordwert*100 nordwert=nordwert/60 nordwert=nordwert+nordwert_i if scrolldisplay =1 then locate 1,1 lcd "N:" locate 1,3 lcd "";nordwert end IF zahler4=komma4-komma5 zahler4=zahler4-1 Position1=komma4 Eingabestring2=right(Eingabestring,Position1) suchergros1=left(Eingabestring2,zahler4) ostwert=val(suchergros1) ostwert=ostwert/100 ostwert_i=int(ostwert) ostwert=ostwert-ostwert_i ostwert=ostwert*100 ostwert=ostwert/60 ostwert=ostwert+ostwert_i if scrolldisplay =1 then locate 2,1 lcd "E:" locate 2,3 lcd "";ostwert end if if genauigkeit1 then Speicherzelle_pos2=Speicherzelle_pos-6 call Singlelese(Speicherzelle_pos2 ,ostwert2) ostwert2=ostwert- ostwert2 Speicherzelle_pos2=Speicherzelle_pos-10 call Singlelese(Speicherzelle_pos2 ,nordwert2) nordwert2=nordwert- nordwert2 'Längen in Metern zwischenspeicher=deg2rad(nordwert) laengenminute=1852*cos(zwischenspeicher) ostwert2=ostwert2*laengenminute 'Umrechnen in Breitenminuten ostwert2=ostwert2*60 real_versatz=ostwert2*ostwert2 nordwert2=nordwert2*1852 nordwert2=nordwert2*60 zwischenspeicher=nordwert2*nordwert2 zwischenspeicher=zwischenspeicher+real_versatz real_versatz=sqr(zwischenspeicher) if real_versatz>vorgabe_versatz then wertschreiben=1 zurueckgelegte_Strecke2=round(real_versatz) zurueckgelegte_Strecke=zurueckgelegte_Strecke+zurueckgelegte_Strecke2 end IF end IF end if 'Uhrzeit zahler4=6 Position1=komma1 Eingabestring2=right(Eingabestring,Position1) suchergros1=left(Eingabestring2,zahler4) uhrzeit=val(suchergros1) 'auf MEZ GMT+1 (Winter) oder GMT +2 (Sommer) einstellen uhrzeit=uhrzeit+20000 if scrolldisplay =1 then locate 1,13 lcd" " locate 1,13 lcd "";uhrzeit end if if scrolldisplay =1 then zahler4=4 Position1=komma9 Eingabestring2=right(Eingabestring,Position1) suchergros1=left(Eingabestring2,zahler4) locate 2,13 lcd "";suchergros1 end IF 'Ausgabe der zurückgelegten Strecke if scrolldisplay =2 then locate 1,10 lcd "A:";arrayzahler if arrayzahler>1 then locate 2,1 if zurueckgelegte_Strecke>10000 then orts_versatz=zurueckgelegte_Strecke/1000 orts_versatz_i=orts_versatz lcd "Strecke ";orts_versatz_i;"km :" else orts_versatz_i=zurueckgelegte_Strecke lcd "Strecke ";orts_versatz_i;"m" end IF 'Vergangene Zeit berechnen zwischenspeicher2= uhrzeit/10000 orts_versatz_i=fix(zwischenspeicher2) ostwert3=orts_versatz_i*60 zwischenspeicher2= uhrzeit/100 zwischenspeicher2=round(zwischenspeicher2) orts_versatz_i=orts_versatz_i*100 zwischenspeicher2=zwischenspeicher2-orts_versatz_i ostwert3=zwischenspeicher2+ostwert3 Speicherzelle_pos2=&H0010 call Intlese(Speicherzelle_pos2 ,Uhrzeit_ar(1)) zwischenspeicher2=Uhrzeit_ar(1) zwischenspeicher2=zwischenspeicher2/100 orts_versatz_i=fix(zwischenspeicher2) nordwert3=orts_versatz_i*60 zwischenspeicher2= Uhrzeit_ar(1) zwischenspeicher2=round(zwischenspeicher2) orts_versatz_i=orts_versatz_i*100 zwischenspeicher2=zwischenspeicher2-orts_versatz_i nordwert3=zwischenspeicher2+nordwert3 orts_versatz_i=ostwert3-nordwert3 locate 1,1 lcd "T:";orts_versatz_i;"min" end if end IF if scrolldisplay =1 then locate 1,12 lcd "|" locate 2,12 lcd "|" end IF if scrolldisplay =2 then locate 1,9 lcd "|" end IF 'Der 24C512 hat insgesamt 65.536 Speicherstellen 'Diese gehen von &H0000 bis &HFFFF 'Beim Logger werden Zeit und Hoehe als Integer (je 2 Byte) und die Koordinaten als Single (je 4Byte) gespeichert 'Insgesamt sind dies 4+8 Bytes = 12 Bytes pro Aufnahme. Es können daher 5333 Aufnahmen gemacht werden - bei 100km sind dies alle 50 Meter ein Punkt if arrayzahler<=EEPROM_GROESSE then if wertschreiben = 1 then 'Umstellen auf PC-Verbindung waitms 250 RXGPS=0 TXGPS=0 RXPC=1 TXPC=1 waitms 250 print "PC-Datenausgabe" print "---------------" print " " 'Uhrzeit uhrzeit=uhrzeit/100 Uhrzeit_ar(1)=round(uhrzeit) print"Zeit: ";uhrzeit if Speicherzelle=1 then call Intspeicher(Speicherzelle_pos,Uhrzeit_ar(1)) incr Speicherzelle_pos incr Speicherzelle_pos end if 'Norden Norden_ar(1)=nordwert print"Nord_dez: ";nordwert if Speicherzelle=1 then call singlespeicher(Speicherzelle_pos,nordwert) incr Speicherzelle_pos incr Speicherzelle_pos incr Speicherzelle_pos incr Speicherzelle_pos end if 'Osten Osten_ar(1)=ostwert print"Ost: ";ostwert if Speicherzelle=1 then call singlespeicher(Speicherzelle_pos,ostwert) incr Speicherzelle_pos incr Speicherzelle_pos incr Speicherzelle_pos incr Speicherzelle_pos end if 'Hoehe zahler4=komma9-komma10 zahler4=zahler4-1 Position1=komma9 Eingabestring2=right(Eingabestring,Position1) suchergros1=left(Eingabestring2,zahler4) hoehe=val(suchergros1) Hoehe_ar(1)=hoehe print"Hoehe: ";hoehe if Speicherzelle=1 then call Intspeicher(Speicherzelle_pos,hoehe) incr Speicherzelle_pos incr Speicherzelle_pos end if incr arrayzahler wertschreiben=0 if Speicherzelle=1 then Speicherzellex_pos=Speicherzelle_pos zurueckgelegte_Streckex=zurueckgelegte_Strecke arrayzahlerx=arrayzahler end if print " " print "ENDE DATAOUT" print "---------------" waitms 500 end if else if EEPROM_GROESSE>0 then locate 1,1 lcd "*Speicher voll *" end if end if 'Anzeige des nächstgelegenen Orts if scrolldisplay =3 or scrolldisplay =4 then ortszahler=1 orts_versatz_alt=1000000000 zahler3=1 zahler5=1 while zahler3<=240 zahler5=1 restore Nordkoordinate while zahler5<=zahler3 read nordwert3 incr zahler5 wend zahler5=1 restore Ostkoordinate while zahler5<=zahler3 read ostwert3 incr zahler5 wend ostwert2=ostwert- ostwert3 nordwert2=nordwert- nordwert3 'Längen in Metern zwischenspeicher=deg2rad(nordwert) laengenminute=1852*cos(zwischenspeicher) ostwert2=ostwert2*laengenminute 'Umrechnen in Breitenminuten ostwert2=ostwert2*60 real_versatz=ostwert2*ostwert2 nordwert2=nordwert2*1852 nordwert2=nordwert2*60 zwischenspeicher=nordwert2*nordwert2 zwischenspeicher=zwischenspeicher+real_versatz real_versatz=sqr(zwischenspeicher) if real_versatz10000 then orts_versatz=orts_versatz/1000 orts_versatz_i=orts_versatz lcd "Ort in ";orts_versatz_i;"km :" else orts_versatz_i=orts_versatz lcd "Ort in ";orts_versatz_i;"m :" end IF locate 2,1 lcd "";Eingabestring waitms 1000 ' Da es sonst gleich wieder weg ist end IF 'Einstellen des aktuellen Displayinhalts Scrolldisplays eingestellt=0 if scrolldisplay =1 then scrolldisplay=2 eingestellt=1 end IF if scrolldisplay =2 and eingestellt=0 then scrolldisplay=3 eingestellt=1 end IF if scrolldisplay =3 and eingestellt=0 then scrolldisplay=4 eingestellt=1 end IF if scrolldisplay =4 and eingestellt=0 then scrolldisplay=1 eingestellt=1 end IF if EEPROM_GROESSE=0 then scrolldisplay=1 eingestellt=1 end IF end if end IF if Schalter=0 then RXGPS=1 TXGPS=1 RXPC=0 TXPC=0 'GPS_Schalter=1 else RXGPS=0 TXGPS=0 RXPC=1 TXPC=1 'GPS_Schalter=0 waitms 2000 locate 1,1 lcd " " locate 2,1 lcd " " locate 2,1 lcd "****PC-Modus****" Print "**********Konfigurationsmenue**********" Print "* ------------------- *" print "* *" Print "* 1 - Entwickler *" Print "* 2 - Datenausgabe *" print "* 3 - Kalibrierung *" Print "* 4 - Softwarestand *" Print "* 5 - GPS-Maus durchschalten *" Print "* 6 - Hilfsprogramme *" Print "* 7 - Menue verlassen *" print "* *" print "*Nummer eingeben mit ENTER bestaetigen*" print "***************************************" input Eingabestring noecho If Eingabestring = "1" Then Print "* 1 - Entwickler *" Print "* -------------- *" Print "* Board entwickelt von Niels Keller *" Print "* Keine Garantie/ Gewährleistung *" print "* Experimentalstadium *" Print "* Zusaetzliche Anmerkungen *" Print "* *" Eingabestring=zusatzinformationx print "";Eingabestring Print "* *" print "* Diesen Text aendern? (1 = ja) *" input Eingabestring2 noecho if Eingabestring2="1" then print "*Neuen Text eingeben (max. 40 Zeichen)*" input Eingabestring2 noecho zusatzinformationx=Eingabestring2 print "* Zusatztext wurde geaendert *" end IF Print "* *" End If If Eingabestring = "2" Then if arrayzahler=1 then Print "Keine Daten vorhanden. Einstellen der Genauigkeit kann das Problem beheben." end if if abgefragt=0 then abgefragt=1 zahler=1 Speicherzelle_pos=&H0010 while zahler>**" Print "***Integer-Wert?***" input Eingabestring2 noecho testinteger=val(Eingabestring2) 'Schreiben Speicherzelle_pos = &H0010 call Intspeicher(Speicherzelle_pos,testinteger) Print "Geschrieben: ";testinteger 'Lesen Speicherzelle_pos = &H0010 call Intlese(Speicherzelle_pos ,testinteger2) Print "Gelesen: ";testinteger2 if testinteger=testinteger2 then else Test_ok=0 end if Print "**Test <>**" Print "***Single-Wert?***" input Eingabestring2 noecho testsingle=val(Eingabestring2) 'Schreiben Speicherzelle_pos = &H0010 call singlespeicher(Speicherzelle_pos,testsingle) Print "Geschrieben: ";testsingle 'Lesen Speicherzelle_pos = &H0010 call Singlelese(Speicherzelle_pos ,testsingle2) Print "Gelesen: ";testsingle2 if testsingle=testsingle2 then else Test_ok=0 end if if Test_ok=1 then Print "***EEPROM OK***" else Print "**Fehlfunktion**" end IF Print "**Test beendet**" end if end if If Eingabestring = "7" Then Print "* Zur Positionsanzeige GPS aktivieren*" end if waitms 500 end if loop end Sub E_write(byval E_addr As Word , Dat As Byte) E_ah = High(e_addr) E_al = Low(e_addr) I2cstart I2cwbyte E_ctlw I2cwbyte E_ah I2cwbyte E_al I2cwbyte Dat I2cstop Waitms 10 End Sub ' Routine to read the 24LC256 ' Sub E_read(byval E_addr As Word , E_dat As Byte) E_ah = High(e_addr) E_al = Low(e_addr) I2cstart I2cwbyte E_ctlw I2cwbyte E_ah I2cwbyte E_al I2cstart I2cwbyte E_ctlr I2crbyte E_dat , Nack I2cstop ' End Sub Sub Intspeicher(byval Start_Speicherzelle As Word , Intueber As Integer) Int_wert=intueber s1=Sbyte_Int(1) s2=Sbyte_Int(2) E_addr = Start_Speicherzelle Dat=s1 Call E_write(e_addr , Dat) incr E_addr Dat=s2 Call E_write(e_addr , Dat) End Sub Sub Intlese(byval Start_Speicherzelle As Word , Intueber As Integer) E_addr = Start_Speicherzelle Call E_read( E_addr, E_dat) S1=E_Dat Sbyte_int(1)=s1 incr E_addr Call E_read( E_addr, E_dat) S2=E_Dat Sbyte_int(2)=s2 Intueber=int_wert end sub Sub Singlespeicher(byval Start_Speicherzelle As Word , Singleueber As Single) Single_wert=Singleueber s1=Sbyte_single(1) s2=Sbyte_single(2) s3=Sbyte_single(3) s4=Sbyte_single(4) E_addr = Start_Speicherzelle Dat=s1 Call E_write(e_addr , Dat) incr E_addr Dat=s2 Call E_write(e_addr , Dat) incr E_addr Dat=s3 Call E_write(e_addr , Dat) incr E_addr Dat=s4 Call E_write(e_addr , Dat) End Sub Sub Singlelese(byval Start_Speicherzelle As Word , Singleueber As Single) E_addr = Start_Speicherzelle Call E_read( E_addr, E_dat) S1=E_Dat Sbyte_single(1)=s1 incr E_addr Call E_read( E_addr, E_dat) S2=E_Dat Sbyte_single(2)=s2 incr E_addr Call E_read( E_addr, E_dat) S3=E_Dat Sbyte_single(3)=s3 incr E_addr Call E_read( E_addr, E_dat) S4=E_Dat Sbyte_single(4)=s4 Singleueber=single_wert end sub Hier ergänzen Ortsname: Data "Helgoland" , "Rottweil" Nordkoordinate: Data 54.181676!, 48.162401! Ostkoordinate: Data 7.886306! , 8.611038!