PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Temperaturwert vom DS1821 in ein eeprom 24C64A



Timo_AVR
15.07.2007, 17:09
Einen schönen guten Tag,

ich beschäftige mich seit 2 Wochen mit Bascom, der Demoversion, also ich kenne mich so gut wie gar nicht aus. Ich benutze zur Zeit Programmschnipsel und füge Sie zu einem Progamm zusammen. Was bis jetzt auch gut funktioniert.
Das auslesen des DS1821 Temperatursensor funktioniert auf dem Display und ich kann die Werte auch auf ein Terminal Programm ausgeben.
Nun würde ich gerne den Temperaturwert in einem 24C64A Seriell EEPROM alle halbe Stunde speichern und nach einer gewiesen Zeit per Knopfdruck auf den PC spielen.
Mein Problem ist nun, vermutlich ganz einfach, ich möchte 12 Stunden lang alle 30 Minuten einen Wert speichern.

************************************************** ************
$regfile = "m32def.dat" 'definieren des verwendeten Chips
$crystal = 8000000 'Quarz 8MHz
$baud = 9600

Config 1wire = Portd.7 'DS1821 DQ an PD6


Dim Ar As Byte 'Variablenname und Typ festlegen
Dim Temperatur As Byte
Dim Temperatur_lesen As Byte
Dim A As Byte
Dim B As Byte


Do 'Beginn der Schleife
1wreset 'Reset DS1821
1wwrite &HEE 'starte Temperaturkonvertierung
Waitms 100 'warte 100 Millisekunden
1wreset 'Reset DS1821
1wwrite &HAA 'DS1821 sende Daten an Atmel
Ar = 1wread() 'lesen die empfangenen Daten
1wwrite &H22 'stop Temperaturkonvertierung
Temperatur = Ar 'Temperatur übergeben

'---- schreibe in EEprom ----
For A = 1 To 24 '12 Stunden alle 30 minuten
'Adresse hochzählen
I2cstart 'Start I2C
I2cwbyte &HA0 'Sende Slave Adresse
I2cwbyte 1 'Sende Speicheradresse High
I2cwbyte A 'Sende Speicheradresse LOw
I2cwbyte Temperatur 'Sende Wert
I2cstop 'Stop I2C
' Waitms 500
Next A

'--- lesen vom EEprom ----
For B = 1 To 24

I2cstart 'Start I2C
I2cwbyte &HA0 'sende Slave Adresse
I2cwbyte 1 'sende Speicheradresse High
I2cwbyte B 'sende Speicheradresse Low

I2cstart 'Start I2C
I2cwbyte &HA1 ' sende Slave Adresse +1 für schreiben
I2crbyte Temperatur_lesen , Nack 'lese Adresse vom EEprom
I2cstop 'Stop I2C
Print "Temperatur: " ; Temperatur_lesen ; Chr(13)
' Waitms 500
Next B

Loop
End

************************************************** *****
Die For Schleife für die 30 minuten und den Taster zur übertragung habe ich noch nicht implementiert.

Bei der Simulation bekomme ich immer den Wert 0 auch wenn ich z.B. der Temperatur einen Wert vorgebe z.B 30.
Was mache ich falsch?


Ich würde mich freuen wenn mir jemand weiter helfen könnte...
Im voraus besten dank

Timo

Timo_AVR
20.07.2007, 14:59
Hallo,
könnte mir vielleicht jemand helfen?!
Wenn ich auslesen möchte, also Datenübertragen bekomme ich immer den wert 255 würde mich sehr freuen wenn mir jemand helfen würde.
Mit freundlichen Grüßen




$regfile = "m32def.dat" 'definieren des verwendeten Chips
$crystal = 8000000 'Quarz 8MHz
$baud = 9600


'--------- Eeprom Anschlüße ------
Config Sda = Portc.1 'SDA und SCL definieren
Config Scl = Portc.0

'--------- Temperatursensor DS1821 --------------

Config 1wire = Porta.0 'DS1821 DQ an PD6


'================================================= =============================


Dim Ar As Byte 'Variablenname und Typ festlegen
Dim Temperatur As Integer , Temperatur_lesen As Integer
Dim I As Integer , Z As Integer
Dim Adrcount As Word , H As Byte , L As Byte , Wert As Byte
Dim Adrcount_lesen As Word , H_lesen As Byte , L_lesen As Byte


Do

'---- Temperatur Routine ----

1wreset 'Reset DS1821
1wwrite &HEE 'starte Temperaturkonvertierung
Waitms 100 'warte 100 Millisekunden
1wreset 'Reset DS1821
1wwrite &HAA 'DS1821 sende Daten an Atmel
Ar = 1wread() 'lesen die empfangenen Daten
1wwrite &H22 'stop Temperaturkonvertierung
Temperatur = Ar 'Temperatur übergeben



'---- schreibe in EEprom ----
H = High(adrcount)
L = Adrcount
I2cstart 'Start I2C
I2cwbyte Adr
I2cwbyte H 'Speicherstelle im Eeprom
I2cwbyte L
I2cwbyte Temperatur 'Sende Wert
Print "Schreibe " ; Temperatur ; " Grad ins Eeprom"
I2cstop 'Stop I2C

If Adrcount < &H7FEB Then Adrcount = Adrcount + 1 Else Adrcount = 0 'Prüfen ob Speicher voll ist? Wenn nicht 1 hochzählen oder bei 0 wieder anfangen
Gosub Zeitschleife


Loop



'---- Zeitschleife 30Min ----

Zeitschleife:
'ungefähr 1Min Zeitschleife
For I = 0 To 59
If Pina.1 = 1 Then
Adrcount_lesen = &H0000
Gosub Datenuebertragung 'Über RS232 Daten vom Eeprom ans Terminalprogramm senden
End If
Print "Warte 1 sec."
Wait 1
Next I
Return



'--- lesen vom EEprom bzw. Auslesen über RS232 aufs Teminal Programm ----

Datenuebertragung:
Schleife:
If Adrcount > Adrcount_lesen Then

H_lesen = High(adrcount_lesen)
L_lesen = Adrcount_lesen
I2cstart 'Start I2C
I2cwbyte &HA0 'sende Slave Adresse
I2cwbyte H_lesen 'sende Speicheradresse High
I2cwbyte L_lesen 'sende Speicheradresse Low

I2cstart 'Start I2C
I2cwbyte &HA1 'sende Slave Adresse +1 für schreiben
I2crbyte Temperatur_lesen , Nack 'lese Adresse vom EEprom
I2cstop 'Stop I2C
Waitms 10 'warte 10ms
Print Temperatur_lesen ; " C"
Print Chr(13)

Adrcount_lesen = Adrcount_lesen + 1
Gosub Schleife
Else
Print "Übertragung beendet"
End If

Return
End

Timo_AVR
20.07.2007, 23:47
Nochmal ich.

Fehler gefunden!

](*,)

Bei dem Bausatz war der 24C64A Pin 7 WP (Write Protect) auf 5 V fest verdrahtet. Deshalb konnte ich nichts reinschreiben bzw. ich bekam immer 255 heraus

Schönes Wochenende