PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : DS1307 einige Fragen



Accenter
10.10.2007, 22:55
Mein erstes Programm mit dem DS1307 läuft soweit ganz gut. Die Anzeige bei einstelligen Uhrzeiten sieht aber nicht wirklich nach Uhr aus.

z.B. Uhrzeit "13:03:09" wird mir so dargestellt "13:3:9"

Wie kann ich die 0 vor einstelligen Zahlen erzwingen?

Dieses Uhrenprogramm möchte ich dann später (sobald alles einwandfrei läuft) in meine Haussteuerung integrieren. Es sollten dann z.B. alle verpassten Türklingelversuche protokolliert werden... oder halt zumindest die letzten 10. Allerdings weiß ich noch nicht so ganz wie ich das bewerkstelligen soll. Bin für jeden Tip dankbar.

Hier mein Code:

$regfile = "m8def.dat"
$framesize = 32
$swstack = 32
$hwstack = 32
$crystal = 400000

Config Lcd = 20 * 4
Config Lcdpin = Pin , Rs = Portc.5 , E = Portc.4 , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0
Config Lcdbus = 4
Waitms 20

'+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++
' Uhrdemo für DS1307 1007
'+++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++

Cls
Config Sda = Portd.1
Config Scl = Portd.0

Dim _weekday As Byte
Dim _day As Byte
Dim _month As Byte
Dim _year As Byte
Dim _sec As Byte
Dim _min As Byte
Dim _hour As Byte
Dim Monat As String * 3

Dim Ds1307w As Byte
Dim Ds1307r As Byte

Ds1307w = &B11010000
Ds1307r = &B11010001

_day = 10
_month = 10
_year = 07
_sec = 30
_min = 13
_hour = 15

_sec = Makebcd(_sec)
_min = Makebcd(_min)
_hour = Makebcd(_hour)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cwbyte _sec
I2cwbyte _min
I2cwbyte _hour
I2cstop

_day = Makebcd(_day)
_month = Makebcd(_month)
_year = Makebcd(_year)
I2cstart
I2cwbyte Ds1307w
I2cwbyte 3
I2cwbyte _weekday
I2cwbyte _day
I2cwbyte _month
I2cwbyte _year
I2cstop

Losgehts:
Do

I2cstart
I2cwbyte Ds1307w
I2cwbyte 0
I2cstart
I2cwbyte Ds1307r
I2crbyte _sec , Ack
I2crbyte _min , Ack
I2crbyte _hour , Ack
I2crbyte _weekday , Ack
I2crbyte _day , Ack
I2crbyte _month , Ack
I2crbyte _year , Nack
I2cstop
_sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
_day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)


If _month = 1 Then
Monat = "Jan"
End If
If _month = 2 Then
Monat = "Feb"
End If
If _month = 3 Then
Monat = "Mar"
End If
If _month = 4 Then
Monat = "Apr"
End If
If _month = 5 Then
Monat = "Mai"
End If
If _month = 6 Then
Monat = "Jun"
End If
If _month = 7 Then
Monat = "Jul"
End If
If _month = 8 Then
Monat = "Aug"
End If
If _month = 9 Then
Monat = "Sep"
End If
If _month = 10 Then
Monat = "Okt"
End If
If _month = 11 Then
Monat = "Nov"
End If
If _month = 12 Then
Monat = "Dez"
End If

Cls
Locate 1 , 2
Lcd _hour ; ":" ; _min ; ":" ; _sec ; " " ; _day ; "-" ; Monat ; "-" ; _year
Cursor Off

Waitms 500
Loop

Dirk
10.10.2007, 23:41
Hallo Accenter,

Wie kann ich die 0 vor einstelligen Zahlen erzwingen?

In Bascom am einfachsten durch: Lcd Time$ und Lcd Date$.
Wenn du mit _hour, _sec ... arbeiten willst: If _hour < 10 then Lcd "0"

Gruß Dirk

Accenter
11.10.2007, 00:22
Danke für den Tip! Ich hab allerding keine Ahung wie ich in meinem Beispiel Date$ und Time$ anwende. Hat jemand einige Zeilen Programmcode für mich als Beispiel?

Dirk
11.10.2007, 10:54
Ich hab allerding keine Ahung wie ich in meinem Beispiel Date$ und Time$ anwende.
Probier doch einfach 'mal "Lcd Time$" anstelle von "Lcd _hour ; ":" ; _min ; ":" ; _sec" aus!

Gruß Dirk

Accenter
11.10.2007, 12:15
Hab ich soeben probiert, das klappt so leider nicht.

Dirk
11.10.2007, 14:02
Hallo Accenter,

sorry, habe nicht gesehen, dass du _sec, _min usw. selbst definiert hast!

Dann kann das mit Time$ nicht klappen. Dafür müßtest du mit CONFIG CLOCK = xyz (siehe Bascom-Hilfe!) die Uhr aktiviert haben. Danach gibt es dann die selben Variablen (_sec, usw).

Da du aber die Variablen selbst definiert hast, gibt es 2 Möglichkeiten:
1. If _hour < 10 Then Lcd "0";
Lcd _hour; usw.
2. Dim Hour_str As String * 2. Mit der Funktion Hour_str = str(_hour) die Stunde in einen String umwandeln.
Diesen String dann formatiert zweistellig ausgeben:
Hour_str = Format(Hour_str , "00")
Lcd Hour_str

Sieh dir die Hilfe unter str und format an!

Gruß Dirk

Accenter
12.10.2007, 02:56
Danke Dirk für deine tolle Hilfe!!
Ich hab jetzt fast alles am laufen so wie es sein soll jedoch tritt ein merkwürdiges Phänomen auf sobald ich die variable "hour_str" im spiel habe.

Es werden mir dann nur noch die Sekunden und der Doppelpunkt davor dargestellt (minuten und stunden werden komplett verschluckt). Wenn ich in der Zeile bei der LCD Ausgabe die Stunden weglasse (hour_str) sehe ich die Minuten und auch die Sekunden wieder. Ich kann mir das nicht erklären.

Hier mein Code:

Dim Sec_str As String * 2
Dim Min_str As String * 2
Dim Hour_str As String * 2

Sec_str = Str(_sec)
Sec_str = Format(sec_str , "00")
Min_str = Str(_min)
Min_str = Format(min_str , "00")
Hour_str = Str(_hour)
Hour_str = Format(hour_str , "00")
Year_str = Str(_year)
Year_str = Format(year_str , "00")


Cls
Locate 1 , 1
Lcd " " ; Hour_str ; ":" ; Min_str ; ":" ; Sec_str
Cursor Off

Accenter
12.10.2007, 13:05
Wenn ich ein "INITLCD" einbaue wird alles korrekt dargestellt. Die Anzeige flackert dann jedoch leicht, das sich das Display im Loop immer wieder initialisiert. Es ist also ein Anzeigeproblem. Hat dieses Problem schonmal jemand gehabt?

Dirk
12.10.2007, 16:16
Hallo Accenter,

drei Maßnahmen helfen gegen Flackern:

1. LCD nur neu beschreiben, wenn sich der Inhalt ändert. Bei einer Uhr kann man die letzte ausgegebene Sekunde speichern und mit der aktuell aus der RTC gelesenen Sekunde vergleichen. Sind beide noch gleich, kann die LCD-Ausgabe übersprungen werden.

2. Kein CLS verwenden, sondern Inhalte an der selben Stelle überschreiben.

3. Nicht zu schnell auf das LCD schreiben.

Gruß Dirk

Accenter
12.10.2007, 16:49
Danke Dirk, du hast mir extrem weitergeholfen! Es läuft nun alles wie es soll. Ich hab das CLS entfernt.

Eine letzte Frage hätte ich noch.

Wie kann ich die komplette Zeit und das Datum in eine Variable bekommen um das dann abspeichern zu können?

Speichern ist vielleicht in diesem Zusammenhang das falsche Wort. Ich möchte einfach protokollieren wann jemand in meiner Abwesenheit an der Tür geklingelt hat.