PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : source zu stoppuhr, brauche hilfe!



xxrider
01.08.2006, 21: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

xxrider
02.08.2006, 21:00
also es klappt nun.
hab einiges verändert und nun funtioniert mein programm.

schöne grüße
holger