Archiv verlassen und diese Seite im Standarddesign anzeigen : I²C Speicher, Uhr
Hallo,
hab meinen m16 über i²c mit einem pcf8583 und einem eeprom 24c256 verbunden, die hab ich auch schon erfolgreich adressiert. nun meine frage:
ist es generell möglich bei einem ereigniss,z.b taster, variablen werte mit dem dazugehörigem datum evtl uhrzeit, tabellarisch im eeprom abzulegen. Und diese mit hilfe des uart zu einem späteren zeitpunkt am pc auszulesen?
mfg
xeus
Also ein Logfile, das die Tastendrücke aufnimmt?
Ja, geht. die Variablen Zeit und Datum einfach in den EEPROM schreiben. Die belegen dann ja immer die gleiche Anzahl von Adressen. Sagen wir mal 4 Adressen.
Dann brauchst du einen Zähler, der sich merkt, wieviele Datenblöcke schon geschrieben wurden.
Save_timer:
A = 1
Do
C = A * 5
B = C + 5
Writeeeprom Ptimer(a) , B
C = B + 1
Writeeeprom Ptimerstd(a) , C
Incr C
Writeeeprom Ptimermin(a) , C
Incr C
Writeeeprom Ptimertag(a) , C
Incr C
Writeeeprom Ptimermon(a) , C
Incr A
Loop Until A = 17
Goto Menü
Ein Beispiel wie ich es mit der Adressierung gemacht habe. Allerdings mit fünf Werten. Aber die kannst du ja einfach anpassen.
PS: Wie der Befehl beim I²C-EEPROM ist um was abzuspeichern weiss ich nicht, aber das Prinzip sollte so klar werden. Auslesen geht genau so.
Danke, hab gerade mal versucht meinen PCF8583 in mein prog mit einzubinden, doch beim compelieren tritt der Fehler "Adress already occupied", an was könnte das liegen?
gruß
xeus
Total vergessen: hier der code
Hallo,
wie ich sehe, benutzt Du:
$lib "mcsbyte.lbx"
verwendest aber auch Words. In diesem Fall wäre:
mcsbyteint.lbx
die passende Codeoptimierung. Sonst kann der Complier die Variablen nicht korrekt zuordnen und es kommt zu Überschneidungen.
Grüße
Henrik
Was ist das denn für ein Quarz, den du verwendest??? 19,999998 MHz???
Und damit bekommst du keinen Fehler bei 19200Baud?
Und:
$regfile = "m16def.dat"
$regfile = "8515def.dat"
Du musst dich schon entscheiden ;)
Aufpassen, das JTAG ausgeschaltet ist, wenn der Controller das hat und du die Pins brauchst.
Word mit mscbytes wurde ja schon gesagt. Am besten die Zeile erstmal auskommentieren und wenn alles läuft ausprobieren, welche LIB sich da am besten eignet.
If Pind.2 = 1 Then
End If
Bringt was???
Das ganze sieht aus wie ein Copy&Paste-Code :D
"Adress already occupied"
Das ist die ganze Fehlermeldung? Steht da nix von Line?
erstmal danke, marco der eindruck täuscht nicht dass meiste ist copy&paste. aber dadurch lern ich auch schön langsam dazu.
das mit dem 8515 hab ich einfach übersehen. mcsbyte hab ich auch getauscht. der fehler bezieht sich auf 'Dim Tm1(5) as Byte at &h60'.
wäre schön wenn mir jemand helfen könnte, weil allein glaub ich wird das sonst nichts.
gruß
xeus
marco der eindruck täuscht nicht dass meiste ist copy&paste. aber dadurch lern ich auch schön langsam dazu.
Es spricht ja auch nichts dagegen. Man sieht es nur.
der fehler bezieht sich auf 'Dim Tm1(5) as Byte at &h60'.
Lass das at &H60 mal weg und probier es nochmal.
Stimmt der rest denn so?
werds mal ausprobieren.
schon mal danke
das funzt leider nicht, dann krieg ich nichts zurück!
das funzt leider nicht, dann krieg ich nichts zurück!hier der aktuelle code
hier der aktuelle code
Wo???
Stimmt der rest denn so?
Ist schwer zu sagen. Das Programm ist sehr unübersichtlich finde ich. Am besten lädst du die .BAS hoch. Dann sind evtl mehr bereit, den Code mal selbst laufen zu lassen.
Hier der Code.
Ziel ist es:
1)
ein mc frägt sequenziell 12 geräte ab, sollte das 2.byte das er als antwort bekommt <>006 sein, soll er das datum,die zeit,dessen adresse und den status tabellarisch im 24c256 ablegen.
2)
ein zweiter mc liest nur die daten aus dem eeprom und gibt sie seriell an einen pc weiter.
Problem:
es scheint als würde es bei &H60 einen Adressenkonflikt gibt.
lasse ich die adresse weg kommt im terminal nur 1:0 nicht ein mal der text Print "PCF8583 ..." zeigt er mir an.
Komisch mit der clock.bas funzt es einwandfrei
'Mikrocontroller Setup
$lib "mcsbyteint.lbx"
$regfile = "m16def.dat"
$crystal = 19999998
$baud = 19200
'Display Setup
Config Lcdpin = Pin , Db4 = Porta.6 , Db5 = Porta.5 , Db6 = Porta.4 , Db7 = Porta.3 , E = Porta.7 , Rs = Porta.2 ' Natürlich so wie es wirklich angeschlossen ist (4-Bit-Modus)
Config Lcd = 20 * 4
Config Pind.2 = Input
Config Pind.4 = Input
'Variablen
'Checksum Variablen
Dim Crc_l As Integer
Dim Crc_h As Integer
Dim New As Byte
Dim Tmp As Byte
Dim Bcclo As Byte
Dim Bcchi As Byte
Dim X As String * 10
Dim Crce As Word
Dim Crcs As Word
'Sende & Empfangs Variablen
Dim Packets(10) As Byte
Dim Packete(8) As Byte
'WR Variablen
Dim Wradr As Byte
'Display & Line Variablen
Dim Line1 As String * 20
Dim Line2 As String * 20
Dim Line3 As String * 20
Dim Line4 As String * 20
'Sendepaket Variablen
Dim Adr As Byte
Dim Command As Byte
Dim Par1 As Byte
Dim Par2 As Byte
Dim Par3 As Byte
Dim Par4 As Byte
Dim Par5 As Byte
Dim Par6 As Byte
'Empfangspaket Variablen
Dim State As Byte
'Speicher Constanten
Const Ff = &H0C 'Steuerzeichen Formfeed
Const Lf = &H0A 'Steuerzeichen Linefeed
Const Pu = &H2E 'Punkt
Const Dp = &H3A 'Doppelpunkt
Const Le = &H20 'Leerzeichen
Const Ko = &H2C 'Komma
Const Adre = &HA2 'Adresse EEPROM
Dim Adrcount As Word 'Zähler Speicherplatz EEPROM
'Paket Variablen
Declare Sub Paketinit
'Subroutines
Declare Sub Sendewr
Declare Sub Empfangewr
Declare Sub Crc
Declare Sub Lcdout
Declare Sub Status
Declare Sub Abfrageroutine
'WR Statusabfragen
Declare Sub Adr2
Declare Sub Adr3
Declare Sub Adr4
Declare Sub Adr5
Declare Sub Adr6
Declare Sub Adr7
Declare Sub Adr8
Declare Sub Adr9
Declare Sub Adr10
Declare Sub Adr11
Declare Sub Adr12
Declare Sub Adr13
'Speicher
Declare Sub Speichern
Declare Sub Auslesen
'Clock
Declare Sub Settime(byval S1 As Byte , Byval M1 As Byte , Byval H1 As Byte , Byval D1 As Byte , Byval Month1 As Byte)
Declare Sub Gettime()
'Declare variables
Dim Tm1(5) As Byte At &H60
Dim I As Byte , Temp As Byte
'These are pointers to tm() for simple handling.
Dim S As Byte At &H60 Overlay
Dim M As Byte At &H61 Overlay
Dim H As Byte At &H62 Overlay
Dim D As Byte At &H63 Overlay
Dim Month As Byte At &H64 Overlay
'configure the used port pin for I2C
Config I2cdelay = 5 ' default slow mode
Config Sda = Portc.1
Config Scl = Portc.0
'power LED
Portd.5 = 1
'Setup Comports
'Serial 1 Configuration
Config Serialin = Buffered , Size = 8
Config Serialout = Buffered , Size = 10
Config Pinb.7 = Output
'LCD init
Initlcd
Line1 = "control rel.1.0"
Line2 = " boot"
Line3 = " "
Line4 = ""
Gosub Lcdout
Locate 2 , 1
'Hauptprogramm
Call Settime(56 , 1 , 1 , 29 , 11) 'set time
Print Chr(27) ; "[2J"; 'clear screen
Print "PCF8583 Clock Sample"
Do
Call Gettime
Print Chr(27) ; "[2;2f";
Print Hex(h) ; ":" ; Hex(m) ; ":" ; Hex(s) ; " Err:" ; Err
Wait 1
If Pind.2 = 1 Then
End If
If Pind.4 = 1 Then
Gosub Abfrageroutine
End If
Loop
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'SUBs
'Anfrage an WR stellen
Sub Sendewr
Gosub Crc
Line2 = " Status "
Line3 = " sende Anfrage"
Gosub Lcdout
Printbin Packets(1) ; 10
Return
End Sub Sendewr
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'Status vom WR empfangen
Sub Empfangewr
Inputbin Packete(1) , 8
State = Packete(2)
Gosub Status
Return
End Sub Empfangewr
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'Werte tabellarisch im EEPROM speichern
Sub Speichern
Gosub Gettime
I2cstart
I2cwbyte 10100000
I2cwbyte &HA3 'Speicherstelle im EEPROM
I2cwbyte &HA2
I2cwbyte D 'Tag
I2cwbyte Pu
I2cwbyte Month 'Monat
I2cwbyte Le
I2cwbyte H 'Stunde
I2cwbyte Dp
I2cwbyte M 'Minute
I2cwbyte Dp
I2cwbyte Adr 'Wechselrichteradresse
I2cwbyte Ko
I2cwbyte State 'Wechselrichter Status (2.Paketbyte)
I2cwbyte Ff 'Cursor zurück auf Anfang
I2cwbyte Lf 'und Zeilenvorschub
I2cstop
If Adrcount < &H7FEB Then Adrcount = Adrcount + 13 Else Adrcount = 0
End Sub Speichern
'Checksumme berechnen
Sub Crc
Bcclo = &HFF
Bcchi = &HFF
New = Packets(1)
New = New Xor Bcclo
Tmp = New
Shift Tmp , Left , 4
New = Tmp Xor New
Tmp = New
Shift Tmp , Right , 5
Bcclo = Bcchi
Bcchi = New Xor Tmp
Tmp = New
Shift Tmp , Left , 3
Bcclo = Bcclo Xor Tmp
Shift Tmp , Right , 4
Bcclo = Bcclo Xor Tmp
New = Packets(2)
New = New Xor Bcclo
Tmp = New
Shift Tmp , Left , 4
New = Tmp Xor New
Tmp = New
Shift Tmp , Right , 5
Bcclo = Bcchi
Bcchi = New Xor Tmp
Tmp = New
Shift Tmp , Left , 3
Bcclo = Bcclo Xor Tmp
Shift Tmp , Right , 4
Bcclo = Bcclo Xor Tmp
New = Packets(3)
New = New Xor Bcclo
Tmp = New
Shift Tmp , Left , 4
New = Tmp Xor New
Tmp = New
Shift Tmp , Right , 5
Bcclo = Bcchi
Bcchi = New Xor Tmp
Tmp = New
Shift Tmp , Left , 3
Bcclo = Bcclo Xor Tmp
Shift Tmp , Right , 4
Bcclo = Bcclo Xor Tmp
New = Packets(4)
New = New Xor Bcclo
Tmp = New
Shift Tmp , Left , 4
New = Tmp Xor New
Tmp = New
Shift Tmp , Right , 5
Bcclo = Bcchi
Bcchi = New Xor Tmp
Tmp = New
Shift Tmp , Left , 3
Bcclo = Bcclo Xor Tmp
Shift Tmp , Right , 4
Bcclo = Bcclo Xor Tmp
New = Packets(5)
New = New Xor Bcclo
Tmp = New
Shift Tmp , Left , 4
New = Tmp Xor New
Tmp = New
Shift Tmp , Right , 5
Bcclo = Bcchi
Bcchi = New Xor Tmp
Tmp = New
Shift Tmp , Left , 3
Bcclo = Bcclo Xor Tmp
Shift Tmp , Right , 4
Bcclo = Bcclo Xor Tmp
New = Packets(6)
New = New Xor Bcclo
Tmp = New
Shift Tmp , Left , 4
New = Tmp Xor New
Tmp = New
Shift Tmp , Right , 5
Bcclo = Bcchi
Bcchi = New Xor Tmp
Tmp = New
Shift Tmp , Left , 3
Bcclo = Bcclo Xor Tmp
Shift Tmp , Right , 4
Bcclo = Bcclo Xor Tmp
New = Packets(7)
New = New Xor Bcclo
Tmp = New
Shift Tmp , Left , 4
New = Tmp Xor New
Tmp = New
Shift Tmp , Right , 5
Bcclo = Bcchi
Bcchi = New Xor Tmp
Tmp = New
Shift Tmp , Left , 3
Bcclo = Bcclo Xor Tmp
Shift Tmp , Right , 4
Bcclo = Bcclo Xor Tmp
New = Packets(8)
New = New Xor Bcclo
Tmp = New
Shift Tmp , Left , 4
New = Tmp Xor New
Tmp = New
Shift Tmp , Right , 5
Bcclo = Bcchi
Bcchi = New Xor Tmp
Tmp = New
Shift Tmp , Left , 3
Bcclo = Bcclo Xor Tmp
Shift Tmp , Right , 4
Bcclo = Bcclo Xor Tmp
Crc_l = Bcclo Xor &HFF
Crc_h = Bcchi Xor &HFF
Return
End Sub Clc
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'LCD Ausgabe
Sub Lcdout
Cls
Locate 1 , 1 '1. Zeile
Lcd Line1
Locate 2 , 1 '2. Zeile
Lcd Line2
Locate 3 , 1 '3. Zeile
Lcd Line3
Locate 4 , 1 '4. Zeile
Lcd Line4
Return
End Sub Lcdout
'- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'Status Auswertung
Sub Status
If State = 006 Then
Line3 = Str(adr) + " ok"
Else
Line3 = Str(adr) + " Fehler"
Gosub Speichern
End If
Gosub Lcdout
Return
End Sub Status
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
'Abfrageroutine sequenziell
Sub Abfrageroutine
Command = 050
Gosub Adr2
Gosub Sendewr
Gosub Empfangewr
Wait 2
Gosub Adr3
Gosub Sendewr
Gosub Empfangewr
Wait 2
Gosub Adr4
Gosub Sendewr
Gosub Empfangewr
Wait 2
Gosub Adr5
Gosub Sendewr
Gosub Empfangewr
Wait 2
Gosub Adr6
Gosub Sendewr
Gosub Empfangewr
Wait 2
Gosub Adr7
Gosub Sendewr
Gosub Empfangewr
Wait 2
Gosub Adr8
Gosub Sendewr
Gosub Empfangewr
Wait 2
Gosub Adr9
Gosub Sendewr
Gosub Empfangewr
Wait 2
Gosub Adr10
Gosub Sendewr
Gosub Empfangewr
Wait 2
Gosub Adr11
Gosub Sendewr
Gosub Empfangewr
Wait 2
Gosub Adr12
Gosub Sendewr
Gosub Empfangewr
Wait 2
Gosub Adr13
Gosub Sendewr
Gosub Empfangewr
Wait 2
Return
End Sub Abfrageroutine
'Paketinitialisierung
Sub Paketinit
'Init Packets
Packets(1) = Adr 'Adr
Packets(2) = Command 'command
Packets(3) = Par1 'Par1
Packets(4) = Par2 'Par2
Packets(5) = Par3 'Par3
Packets(6) = Par4 'Par4
Packets(7) = Par5 'Par5
Packets(8) = Par6 'Par6
Packets(9) = Crc_l
Packets(10) = Crc_h
Return
End Sub Paketinit
'WR Subs Status
Sub Adr2
Adr = 002
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 037
Crc_h = 135
Gosub Paketinit
Return
End Sub Adr2
Sub Adr3
Adr = 003
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 154
Crc_h = 006
Gosub Paketinit
Return
End Sub Adr3
Sub Adr4
Adr = 004
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 148
Crc_h = 154
Gosub Paketinit
Return
End Sub Adr4
Sub Adr5
Adr = 005
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 043
Crc_h = 027
Gosub Paketinit
Return
End Sub Adr5
Sub Adr6
Adr = 006
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 251
Crc_h = 145
Gosub Paketinit
Return
End Sub Adr6
Sub Adr7
Adr = 007
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 068
Crc_h = 016
Gosub Paketinit
Return
End Sub Adr7
Sub Adr8
Adr = 008
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 246
Crc_h = 161
Gosub Paketinit
Return
End Sub Adr8
Sub Adr9
Adr = 009
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 073
Crc_h = 032
Gosub Paketinit
Return
End Sub Adr9
Sub Adr10
Adr = 010
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 153
Crc_h = 170
Gosub Paketinit
Return
End Sub Adr10
Sub Adr11
Adr = 011
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 038
Crc_h = 043
Gosub Paketinit
Return
End Sub Adr11
Sub Adr12
Adr = 012
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 040
Crc_h = 183
Gosub Paketinit
Return
End Sub Adr12
Sub Adr13
Adr = 013
Command = Command
Par1 = 000
Par2 = 032
Par3 = 032
Par4 = 032
Par5 = 032
Par6 = 032
Crc_l = 151
Crc_h = 054
Gosub Paketinit
Return
End Sub Adr13
' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Sub Gettime()
'there are 2 ways to get the time. With low level i2c calls or with a high level call
'first the high level call
Tm1(1) = 2 ' point to second register
I2creceive &HA0 , Tm1(1) , 1 , 5 ' write the second address and get 5 bytes back
'i2creceive will first write 1 byte from tm(1) which is 2, and then will read 5 bytes and store it onto tm(1)-tm(5)
'and optional with low level calls
'For I = 1 To 5
' Temp = I + 1
' I2cstart
' I2cwbyte &HA0 'write addres of PCF8583
' I2cwbyte Temp 'select register
' I2cstart 'repeated start
' I2cwbyte &HA1 'write address for reading info
' I2crbyte Tm(i) , Nack 'read data
' Next
' I2cstop
End Sub
Sub Settime(s1 As Byte , M1 As Byte , H1 As Byte , D1 As Byte , Month1 As Byte)
'values are stored as BCD values so convert the values first
'seconds
Tm1(2) = Makebcd(m1) 'minutes
Tm1(3) = Makebcd(h1) 'hours
Tm1(4) = Makebcd(d1) 'days
Tm1(5) = Makebcd(month1) 'months
I2cstart 'generate start
I2cwbyte &HA0 'write address
I2cwbyte &H00 'select control register
I2cwbyte &H08 'set year and day bit for masking
I2cstart 'repeated start
I2cwbyte &HA0 'write mode
I2cwbyte 2 'select seconds Register
For I = 1 To 5
I2cwbyte Tm1(i)
Next 'write seconds
I2cstop
End Sub
End
'end program
Dim Tm1(5) as Byte at &h60
belegt die Adresse 60 (Hexadezimal) im Speicher fünf mal. Ich glaube wohl, das das so nicht geht.
Ich komm grade von der Arbeit und hab jetzt echt kein Nerv mir den Code noch anzuschauen, Sorry.
Falls ich morgen zeitig Feierabend habe schau ich mal drüber sofern keiner schneller war. Ich will aber auch niemanden abhalten den Code selbst zu testen.
@Marco,
>>belegt die Adresse 60 (Hexadezimal) im Speicher fünf mal.
Nein, belegt den Speicher ab &H60 mit 5 Bytes in Folge. Mit den
Overlay Dim's danach kann man auf diese 5 Bytes direkt zu-
greifen (alternativzu Tm1(x)).
Gruß: - Reinhard -
@Xeus,
Du kannst vermutlich die mit Tm1(5) deklarierten Bytes nicht ab
Adresse &H60 ablegen, weil der Platz dafür nicht ausreichend ist.
Ich bekomme da sofort 'nen Fehler beim Compilerlauf.
Deklarier die mit &H200 und die Overlay-Dim's dann mit &H200,
&H201 etc. Sollte dann mit den Var's funktionieren. Über den
Rest des Codes kann ich nichts sagen.
Schau auch mal mit den Button "Show Compile result" und dann
unter Variable und Address bzgl. Speicherbelegung.
HTH: - Reinhard -
Danke, habs hinbekommen. bin gerade dabei variablen mit zeit und datum in einem 24c256 abzusichern. der code folgt in kürze.
danke,
xeus
Hi,
ich würde meine uhr gerne über den pc stellen, dazu will ich in delphi ein prog schreiben, dass mir die 5 werte sendet.
der mc muss diese dann einlesen und als value für die zeitwerte setzen.
der bisherige settime code
Sub Settime
S = Makebcd(s) 'Sek
M = Makebcd(m) 'Min
H = Makebcd(h) 'Std
D = Makebcd(d) 'Tag
Month = Makebcd(month) 'Monat
'Setzen der vorgebenen Werte
I2cstart
I2cwbyte &HA0 'Schreibmodus
I2cwbyte 0 'select control register
I2cwbyte 8 'set year and day bit for masking
I2cstart
I2cwbyte &HA0 'Schreibmodus
I2cwbyte 2 'Sekundenregister auswählen
I2cwbyte S 'Sek schreiben
I2cwbyte M 'min schreiben
I2cwbyte H 'std schreiben
I2cwbyte D 'tag schreiben
I2cwbyte Month 'monat schreiben
I2cstop
End Sub Settime
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.