xxrider
01.08.2006, 22:16
hallo, ich möchte eine stoppuhr programmieren, die von 0 bis wenige minuten zählen kann. während der zählung will ich per taster zeitwerte ins eeprom im word - format speichern. diese möchte ich dann wieder auslesen können (zwischenzeiten).
hier mein source, der leider nicht klappt:
Declare Function Read_eeprom(byval Dev As Byte , Byref Address As Word)as Byte
Declare Function Read_eeprom_word(byref Address As Word)as Word
Declare Sub Write_eeprom(byval Dev As Byte , Byref Address As Word , Byval Wert_
As Byte)
Declare Sub Write_eeprom_word(byref Address As Word , Byref Value As Word)
Dim Address_low As Byte 'Address ist hier überlappend
Dim Address_high As Byte 'dimensioniert, um High- und Low-
Dim Address As Word At Address_low Overlay 'Byte einfach ansprechen zu können.
Dim Value_low As Byte 'Dito mit Value
Dim Value_high As Byte
Dim Value As Word At Value_low Overlay
Dim Wert As Byte
Dim Temp_w As Word
Dim I As Word
Dim Z As Word
Dim Zeit As String * 10
'-------------------------------timer---------------------------------------
'Hier wird der Timer und der Teiler festgelegt
Config Timer1 = Timer , Prescale = 64
'Hier wird das Unterprogramm festgelegt, das
'in dem von ihnen eingestellten Intervall aufgerufen wird
On Timer1 Timer_irq
'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
Const Timervorgabe = 64285
Dim Hundertstelsekunden As Word
'Hier werden die Timer aktiviert
'------------------------------ Programm ----------------------------------
Cls
Lcd " zum Auslesen:"
Locate 2 , 1
Lcd " hold pin 5"
Wait 5
If Pind.5 = 0 Then
Goto Auslesen
End If
Cls
Lcd "for eeprom reset:"
Locate 2 , 1
Lcd "hold 5 + 6"
Wait 3
Cls
'-----------------------------eeprom löschen------------------------------------
If Pind.5 = 0 And Pind.6 = 0 Then
Lcd "<-eeprom reset->"
For Address = 0 To 8190
Value = 0
Call Write_eeprom_word(address , Value)
Next
End If
'----------------------1. freien eepromplatz ermitteln--------------------------
Address = 0
'--------------------Stoppuhr ----------------------------
Cls
Lcd "Stoppuhrstart "
Locate 2 , 1
Lcd "mit Taste 6"
Hundertstelsekunden = 0
If Pind.6 = 1 Then 'weiter mit 6
Do
Loop Until Pind.6 = 0
End If
Enable Timer1
Enable Interrupts
Timer1 = Timervorgabe
Waitms 500
Cls
Lcd "Stop:5 Lesen:6"
Stoppuhr:
Do
If Pind.5 = 0 Then
Goto Speichern
End If
If Pind.6 = 0 Then
Goto Auslesen
End If 'Hier könnte Ihr Hauptprogramm stehen
Zeit = Str(hundertstelsekunden)
Zeit = Format(zeit , "+0.00")
Cls
Lcd "Stop:5 " ; "Lesen: 6"
Locate 2 , 1
Lcd "Zeit " ; Zeit
Waitms 10
Loop
Timer_irq:
Timer1 = Timervorgabe
Incr Hundertstelsekunden
Print Hundertstelsekunden
Return
Speichern:
Value = Hundertstelsekunden
Call Write_eeprom_word(address , Value) 'value ins EEprom schreiben.
Address = Address + 1
Waitms 500
Goto Stoppuhr
'-----------------------------Speicher auslesen------------------------------------
Auslesen:
Cls
Lcd " LESE"
If Pind.5 = 1 Then 'Anhalten
Do
Loop Until Pind.5 = 0
End If
Waitms 500
For Address = 1 To 8190 'die Werte wieder auslesen
Temp_w = Read_eeprom_word(address)
Cls
Locate 2 , 1
Lcd "A: " ; Address ; " " ; "W: " ; Temp_w ; " "
Waitms 10
If Pind.5 = 1 Then
Do
Loop Until Pind.5 = 0
Waitms 200
End If
Next
'------------------------ Ende Demodurchlauf -----------------------------------
End
'------------------------ Funktionen und Subs ----------------------------------
'-------------------------------------------------------------------------------
'- Word (value) auf 2 aufeinander folgende EEprom Adressen schreiben
Sub Write_eeprom_word(byref Address As Word , Byref Value As Word)
Call Write_eeprom(eeprom1 , Address , Value_low)
Incr Address
Call Write_eeprom(eeprom1 , Address , Value_high)
End Sub
'-------------------------------------------------------------------------------
'- Word von 2 aufeinanderfolgenden EEprom Adressen lesen
'- Der gelesene Wert ist der Rückgabewert der Funktion
Function Read_eeprom_word(byref Address As Word)as Word
Value_low = Read_eeprom(eeprom1 , Address)
Incr Address
Value_high = Read_eeprom(eeprom1 , Address)
Read_eeprom_word = Value
End Function
'-------------------------------------------------------------------------------
'- Byte (wert) auf EEprom Adresse (address) speichern
Sub Write_eeprom(byval Dev As Byte , Byref Address As Word , Byval Wert As Byte)
I2cstart
I2cwbyte Dev
I2cwbyte Address_high
I2cwbyte Address_low
I2cwbyte Wert
I2cstop
Waitms 10
End Sub
'--------------------------------------------------------
'- Byte von EEprom Adresse (address) lesen
'- Der gelesene Wert ist der Rückgabewert der Funktion
Function Read_eeprom(byval Dev As Byte , Byref Address As Word)
Dim Devread As Byte
Devread = Dev + 1
I2cstart
I2cwbyte Dev
I2cwbyte Address_high
I2cwbyte Address_low
I2cstop
I2cstart
I2cwbyte Devread
I2crbyte Read_eeprom , Nack
I2cstop
End Function
Die Speicherung von word-daten ins eeprom habe ich von rage empire überommen. das klapp auch bei meinem anderen programm doch hier irgendwie nicht.
beim auslesen erscheinen nichtmal die adressen in 2erstufen aufwärts im display sondern wild ducheinander. auch die ausgelsenen werte sind nicht richtig.
was ist da falsch?
vielleicht kanns ja einer von euch mal ausprobieren...
holger
hier mein source, der leider nicht klappt:
Declare Function Read_eeprom(byval Dev As Byte , Byref Address As Word)as Byte
Declare Function Read_eeprom_word(byref Address As Word)as Word
Declare Sub Write_eeprom(byval Dev As Byte , Byref Address As Word , Byval Wert_
As Byte)
Declare Sub Write_eeprom_word(byref Address As Word , Byref Value As Word)
Dim Address_low As Byte 'Address ist hier überlappend
Dim Address_high As Byte 'dimensioniert, um High- und Low-
Dim Address As Word At Address_low Overlay 'Byte einfach ansprechen zu können.
Dim Value_low As Byte 'Dito mit Value
Dim Value_high As Byte
Dim Value As Word At Value_low Overlay
Dim Wert As Byte
Dim Temp_w As Word
Dim I As Word
Dim Z As Word
Dim Zeit As String * 10
'-------------------------------timer---------------------------------------
'Hier wird der Timer und der Teiler festgelegt
Config Timer1 = Timer , Prescale = 64
'Hier wird das Unterprogramm festgelegt, das
'in dem von ihnen eingestellten Intervall aufgerufen wird
On Timer1 Timer_irq
'Diese Vorgabe wurde berechnet um die genaue Intervallfrequenz zu erreichen
Const Timervorgabe = 64285
Dim Hundertstelsekunden As Word
'Hier werden die Timer aktiviert
'------------------------------ Programm ----------------------------------
Cls
Lcd " zum Auslesen:"
Locate 2 , 1
Lcd " hold pin 5"
Wait 5
If Pind.5 = 0 Then
Goto Auslesen
End If
Cls
Lcd "for eeprom reset:"
Locate 2 , 1
Lcd "hold 5 + 6"
Wait 3
Cls
'-----------------------------eeprom löschen------------------------------------
If Pind.5 = 0 And Pind.6 = 0 Then
Lcd "<-eeprom reset->"
For Address = 0 To 8190
Value = 0
Call Write_eeprom_word(address , Value)
Next
End If
'----------------------1. freien eepromplatz ermitteln--------------------------
Address = 0
'--------------------Stoppuhr ----------------------------
Cls
Lcd "Stoppuhrstart "
Locate 2 , 1
Lcd "mit Taste 6"
Hundertstelsekunden = 0
If Pind.6 = 1 Then 'weiter mit 6
Do
Loop Until Pind.6 = 0
End If
Enable Timer1
Enable Interrupts
Timer1 = Timervorgabe
Waitms 500
Cls
Lcd "Stop:5 Lesen:6"
Stoppuhr:
Do
If Pind.5 = 0 Then
Goto Speichern
End If
If Pind.6 = 0 Then
Goto Auslesen
End If 'Hier könnte Ihr Hauptprogramm stehen
Zeit = Str(hundertstelsekunden)
Zeit = Format(zeit , "+0.00")
Cls
Lcd "Stop:5 " ; "Lesen: 6"
Locate 2 , 1
Lcd "Zeit " ; Zeit
Waitms 10
Loop
Timer_irq:
Timer1 = Timervorgabe
Incr Hundertstelsekunden
Print Hundertstelsekunden
Return
Speichern:
Value = Hundertstelsekunden
Call Write_eeprom_word(address , Value) 'value ins EEprom schreiben.
Address = Address + 1
Waitms 500
Goto Stoppuhr
'-----------------------------Speicher auslesen------------------------------------
Auslesen:
Cls
Lcd " LESE"
If Pind.5 = 1 Then 'Anhalten
Do
Loop Until Pind.5 = 0
End If
Waitms 500
For Address = 1 To 8190 'die Werte wieder auslesen
Temp_w = Read_eeprom_word(address)
Cls
Locate 2 , 1
Lcd "A: " ; Address ; " " ; "W: " ; Temp_w ; " "
Waitms 10
If Pind.5 = 1 Then
Do
Loop Until Pind.5 = 0
Waitms 200
End If
Next
'------------------------ Ende Demodurchlauf -----------------------------------
End
'------------------------ Funktionen und Subs ----------------------------------
'-------------------------------------------------------------------------------
'- Word (value) auf 2 aufeinander folgende EEprom Adressen schreiben
Sub Write_eeprom_word(byref Address As Word , Byref Value As Word)
Call Write_eeprom(eeprom1 , Address , Value_low)
Incr Address
Call Write_eeprom(eeprom1 , Address , Value_high)
End Sub
'-------------------------------------------------------------------------------
'- Word von 2 aufeinanderfolgenden EEprom Adressen lesen
'- Der gelesene Wert ist der Rückgabewert der Funktion
Function Read_eeprom_word(byref Address As Word)as Word
Value_low = Read_eeprom(eeprom1 , Address)
Incr Address
Value_high = Read_eeprom(eeprom1 , Address)
Read_eeprom_word = Value
End Function
'-------------------------------------------------------------------------------
'- Byte (wert) auf EEprom Adresse (address) speichern
Sub Write_eeprom(byval Dev As Byte , Byref Address As Word , Byval Wert As Byte)
I2cstart
I2cwbyte Dev
I2cwbyte Address_high
I2cwbyte Address_low
I2cwbyte Wert
I2cstop
Waitms 10
End Sub
'--------------------------------------------------------
'- Byte von EEprom Adresse (address) lesen
'- Der gelesene Wert ist der Rückgabewert der Funktion
Function Read_eeprom(byval Dev As Byte , Byref Address As Word)
Dim Devread As Byte
Devread = Dev + 1
I2cstart
I2cwbyte Dev
I2cwbyte Address_high
I2cwbyte Address_low
I2cstop
I2cstart
I2cwbyte Devread
I2crbyte Read_eeprom , Nack
I2cstop
End Function
Die Speicherung von word-daten ins eeprom habe ich von rage empire überommen. das klapp auch bei meinem anderen programm doch hier irgendwie nicht.
beim auslesen erscheinen nichtmal die adressen in 2erstufen aufwärts im display sondern wild ducheinander. auch die ausgelsenen werte sind nicht richtig.
was ist da falsch?
vielleicht kanns ja einer von euch mal ausprobieren...
holger