Hi,
zumindest wird das Programm die einzelnen Strings nicht durcheinander. Aber einige Zuordnungen werden entweder garnicht gespeichert bzw. in der Reihenfolge durcheinander gebracht. Meist nur einer oder zwei.
Code:
$regfile = "m8def.dat"
$crystal = 10000000
$lib "i2c.lib"
Ddrb = &B111
Ddrd = &B00000001
Portd.1 = 1
Portd.2 = 1
Portd.3 = 1
Portb.0 = 1
Config Lcd = 16 * 2
Config Lcdbus = 4
Config Lcdpin = Pin , Db4 = Portc.0 , Db5 = Portc.1 , Db6 = Portc.2 , Db7 = Portc.3 , E = Portb.1 , Rs = Portb.2
Cursor Off
Config Timer1 = Timer , Prescale = 1 , Capture Edge = Rising , Noise Cancel = 1
Config Aci = On , Compare = On , Trigger = Rising
On Timer0 Ontimer0
Config Timer0 = Counter , Edge = Falling
Enable Timer0
On Icp1 Oncapture
Enable Icp1
On Int0 Taster1
Config Int0 = Falling
On Int1 Taster2
Config Int1 = Falling
Enable Interrupts
Config Sda = Portc.4
Config Scl = Portc.5
I2cinit
Dim Zaehler As Word
Dim Icr_neu As Word
Dim Icr_alt As Word
Dim Frequlong As Long
Dim Frequenz As Word
Dim A(10) As Word
Dim Frequsumme As Word
Dim Adizaehler As Integer
Dim Durchschnitt As Word
Dim Grenzeo As Word
Dim Grenzeu As Word
Dim Ton As String * 1
Dim Tonalt As String * 1
Dim Tonalt2 As String * 1
Dim Folge As String * 5
Dim Timeout As Word
Dim Folgeto As Word
Dim Ausgabe As String * 16
Dim Folgealt As String * 16
Dim Eepointer As Eram Byte
Dim Pointer As Byte
Dim Codestring As String * 13
Dim Ecodestring(30) As Eram String * 13
Dim Zeitlcd As String * 11
Dim Folgelcd As String * 16
Dim Codedat As String * 4
Dim Codetime As String * 4
Dim Codeuhr As String * 8
Dim Richtung As Bit
Dim Position As Byte
Dim Stelle As Integer
Dim Sprung As Integer
'Variablen f�r RTC
Dim S As Byte , M As Byte , H As Byte , Day As Byte , Month As Byte
Dim Wm As Byte , Yd As Byte
Dim Zeit As Byte
Dim Zeitstring As String * 8
Dim Rtcstellen As Bit
Dim Zeitstellen As Byte
Declare Sub Zuordnung
Declare Sub Anzeige
Declare Sub Settime
Declare Sub Gettime
Declare Sub Zeitanzeigen
Timer0 = 196
Cls
Lcd " 5Ton-Decoder "
Lowerline
Lcd " Bitte warten.. "
Wait 1
Cls
Call Zeitanzeigen
Lowerline
Lcd "Uhr einstellen?"
For Zeitstellen = 1 To 50
If Pind.1 = 0 Then
Zeitstellen = 51
Call Settime
End If
Waitms 100
Next
Cls
Call Zeitanzeigen
Enable Int0
Enable Int1
Main:
Waitms 1
If Pind.1 = 0 Then
Enable Timer0
Cls
Call Zeitanzeigen
Waitms 100
End If
Frequlong = 10000000 / Icr_neu
Icr_neu = 1
Frequenz = Frequlong
Incr Timeout
If Timeout > 80 Then
Folge = ""
Tonalt = ""
Timeout = 0
End If
Incr Folgeto
If Folgeto > 6000 Then
Folgealt = ""
Folgeto = 0
End If
A(10) = A(9)
A(9) = A(8)
A(8) = A(7)
A(7) = A(6)
A(6) = A(5)
A(5) = A(4)
A(4) = A(3)
A(3) = A(2)
A(2) = A(1)
A(1) = Frequenz
Frequsumme = 0
For Adizaehler = 1 To 10
Frequsumme = Frequsumme + A(adizaehler)
Next
Durchschnitt = Frequsumme / 10
Grenzeo = A(1) + 10
Grenzeu = A(1) - 10
If Durchschnitt > Grenzeu And Durchschnitt < Grenzeo Then
Select Case Durchschnitt
Case 1050 To 1070 : Ton = "1"
Case 1150 To 1170 : Ton = "2"
Case 1260 To 1280 : Ton = "3"
Case 1390 To 1410 : Ton = "4"
Case 1520 To 1540 : Ton = "5"
Case 1660 To 1680 : Ton = "6"
Case 1820 To 1840 : Ton = "7"
Case 1990 To 2010 : Ton = "8"
Case 2190 To 2210 : Ton = "9"
Case 2390 To 2410 : Ton = "0"
Case 2590 To 2610 : Ton = "w"
Case Else : Goto Main
End Select
Else : Goto Main
End If
If Ton = Tonalt Then Goto Main
Tonalt = Ton
If Ton = "w" Then Ton = Tonalt2
Tonalt2 = Ton
Folge = Folge + Ton
Timeout = 0
If Len(folge) = 5 Then
If Folge = Folgealt Then
Folgealt = ""
Goto Main
Else
Folgealt = Folge
Folgeto = 0
Goto Folgeerkannt
End If
Folge = ""
End If
Goto Main
Folgeerkannt:
Disable Timer0
Pointer = Eepointer
If Pointer = 31 Then Pointer = 0
Incr Pointer
Eepointer = Pointer
Call Gettime
Codestring = Folge + Bcd(day) + Bcd(month) + Bcd(h) + Bcd(m)
Ecodestring(pointer) = Codestring
Call Zeitanzeigen
Call Zuordnung
Locate 2 , 1
Lcd " "
Locate 2 , 1
Lcd Folgelcd
If Folge = "12345" Then
Portd.0 = 1
Waitms 500
Portd.0 = 0
End If
Enable Timer0
Goto Main
Sub Anzeige
If Richtung = 0 Then Incr Position
If Richtung = 1 Then Decr Position
If Position = 31 Then Position = 1
If Position = 0 Then Position = 30
If Position = 255 Then Position = 30
Pointer = Eepointer
Sprung = Pointer - Position
Sprung = Sprung + 1
If Sprung >= 0 Then
Stelle = Pointer
Stelle = Stelle - Position
Stelle = Stelle + 1
Else
Stelle = Pointer
Stelle = Stelle - Position
Stelle = Stelle + 31
End If
Codestring = Ecodestring(stelle)
Codeuhr = Right(codestring , 8)
Codedat = Left(codeuhr , 4)
Codetime = Right(codeuhr , 4)
Zeitlcd = Left(codedat , 2) + "/" + Right(codedat , 2) + " " + Left(codetime , 2) + ":" + Right(codetime , 2)
Folge = Left(codestring , 5)
Call Zuordnung
Cls
Upperline
Lcd Position
Lcd " "
Lcd Zeitlcd
Lowerline
Lcd Folgelcd
'Lcd Codestring
End Sub
Sub Zuordnung
Select Case Folge
Case "12345" : Ausgabe = "Eins"
Case "54321" : Ausgabe = "Zwei"
Case Else : Ausgabe = Folge
End Select
Folgelcd = ""
Folgelcd = Folge + " " + Ausgabe
End Sub
Taster1:
If Rtcstellen = 1 Then
Decr Zeit
Lowerline
Locate 2 , 1
Lcd " "
Locate 2 , 1
Lcd Zeit
Else
Disable Timer0
Richtung = 1
Call Anzeige
End If
Waitms 100
Return
Taster2:
If Rtcstellen = 1 Then
Incr Zeit
Lowerline
Locate 2 , 1
Lcd " "
Locate 2 , 1
Lcd Zeit
Else
Disable Timer0
Richtung = 0
Call Anzeige
End If
Waitms 100
Return
Ontimer0:
Timer0 = 196
Locate 1 , 1
Call Zeitanzeigen
Return
Oncapture:
Zaehler = Timer1
Icr_neu = Zaehler - Icr_alt
Icr_alt = Zaehler
Return
Sub Settime
Rtcstellen = 1
Enable Int0
Enable Int1
Call Gettime
Waitms 200
Cls
Lcd "Monat:"
Zeit = Makedec(month)
Lowerline
Lcd Zeit
Do
Loop Until Pind.1 = 0
Waitms 200
Month = Zeit
Cls
Lcd "Tag:"
Zeit = Makedec(day)
Lowerline
Lcd Zeit
Do
Loop Until Pind.1 = 0
Waitms 200
Day = Zeit
Cls
Lcd "Stunden:"
Zeit = Makedec(h)
Lowerline
Lcd Zeit
Do
Loop Until Pind.1 = 0
Waitms 200
H = Zeit
Cls
Lcd "Minuten:"
Zeit = Makedec(m)
Lowerline
Lcd Zeit
Do
Loop Until Pind.1 = 0
Waitms 200
M = Zeit
'values are stored as BCD values so convert the values first
S = Makebcd(s) 'seconds
M = Makebcd(m) 'minuts
H = Makebcd(h) 'hours
Day = Makebcd(day) 'days
Month = Makebcd(month) 'months
I2cstart 'generate start
I2cwbyte &HA0 'write address
I2cwbyte 0 'select control register
I2cwbyte 8 'set year and day bit for masking
I2cstop 'generate stop
I2cstart 'generate start
I2cwbyte &HA0 'write mode
I2cwbyte 2 'select seconds Register
I2cwbyte S 'write seconds
I2cwbyte M 'write minuts
I2cwbyte H 'write hours
I2cwbyte Day 'write days
I2cwbyte Month 'write months
I2cstop
Rtcstellen = 0
End Sub
Sub Gettime
Dim Dum As Byte
I2cstart 'generate start
I2cwbyte &HA0 'write addres of PCF8583
I2cwbyte 2 'select second register
I2cstart 'generate repeated start
I2cwbyte &HA1 'write address for reading info
I2crbyte S , Ack 'read seconds
I2crbyte M , Ack 'read minuts
I2crbyte H , Ack 'read hours
I2crbyte Day , Ack 'read year and days
I2crbyte Month , Nack 'read weekday and month
I2cstop 'generate stop
Rem You Could Also Use The Lcd Statement For Displaying The
Rem Time On The Lcd Display
End Sub
Sub Zeitanzeigen
Call Gettime
Locate 1 , 1
Lcd " "
Locate 1 , 1
Lcd Bcd(day) ; "/" ; Bcd(month)
Lcd " " ; Bcd(h) ; ":" ; Bcd(m) ;
End Sub
Mich verwirren gerade total die Zurordnungen der einzelnen Einträge im ERAM und die ganze Pointergeschichte. [schild=2 fontcolor=000000 shadowcolor=C0C0C0 shieldshadow=1]Hilfe![/schild]
Dein Eintrag "Stelle = EEPointer * 14 'Stringlänge 13 + Ende 0" funktioniert bei mir gar nicht, sondern erzeugt eine Fehlermeldung: "Source variable does not match the target variable"
Lesezeichen