PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Auswertung Uhrzeit



martin66119
31.10.2007, 08:29
Guten Morgen an alle hier!

Vor paar Tagen hatte ich wegen der Auswertung des Wochentages (RTC 1307) hier eine Frage gestellt und auch eine Lösung bekommen, die auch teilweise funktioniert. Eins geht jedoch nicht. Da ich nicht weiß ob ich einen Fehler gemacht habe, hier meine Frage.

Ich verwende im Prinzip folgenden Code für die RTC. Abhängig vom Wochentag mochte ich etwas bestimmtes starten. z.B.

if _weekday = 7 then
Print Bcd(_day) ; "/" ; Bcd(_month) ; "/" ; Bcd(_year)
LCD _weekday[/color]
endif

Diese If-Schleife habe ich in meinen Code eingebaut (zwichen "****").
Mache ich da was falsch bei der If-Abfrage da ich beim bei mDatum setzen "_weekday = Makebcd(_weekday" verwendet habe?


$regfile = "m8def.dat"
$crystal = 8000000
$baud = 9600

Config Sda = Portc.4
Config Scl = Portc.5

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 Ds1307w As Byte
Dim Ds1307r As Byte

Ds1307w = &B11010000
Ds1307r = &B11010001

_day = 23
_month = 6
_year = 05
_sec = 10
_min = 10
_hour = 13
_weekday = 1

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

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


Do

Rem Datum und Zeit holen
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


Print Bcd(_hour) ; "/" ; Bcd(_min) ; "/" ; Bcd(_sec)
Print "---------------------------------------"

Waitms 1000
'**************************************
if _weekday = 7 then
Print Bcd(_day) ; "/" ; Bcd(_month) ; "/" ; Bcd(_year)
LCD _weekday[/color]
endif
'*****************************************
Loop

Dirk
31.10.2007, 18:36
Hallo Martin,

für _weekday brauchst du keine BCD-Umwandlung, weil der Wochentag nicht mehr als 4 Bit belegt. Du kannst _weekday also ohne Umwandlung in die RTC schreiben oder aus ihr lesen.

Gruß Dirk

martin66119
31.10.2007, 21:16
Hallo Dirk,

irgendwie klappt das nicht. Ich habe folgendes gemacht. Wenn ich _hour auf dem Display anzeigen lasse, steht auf dem Display 33. Warum 33 wenn es beim Test 21 "Uhr" war. Hat das irgendwas mit BCD zu tun?

$regfile = "m8def.dat"
$crystal = 3686400
$hwstack = 256
$swstack = 256
$framesize = 256
'*************Config RTC*************************************
Config Sda = Portc.4
Config Scl = Portc.5

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 Ds1307w As Byte
Dim Ds1307r As Byte

Ds1307w = &B11010000
Ds1307r = &B11010001

_day = 31
_month = 10
_year = 07
_sec = 10
_min = 05
_hour = 21
_weekday = 1

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

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

'************Funktionen LCD-Display****************************

Config Lcd = 40 * 4
Config Lcdpin = Pin , Rs = Portb.0 , Db4 = Portd.5 , Db5 = Portd.4 , Db6 = Portd.3 , Db7 = Portd.2 , E = Portd.6 , E2 = Portd.7
Config Lcdbus = 4
Config Lcdmode = Port

Dim ___lcdno As Byte

___lcdno = 0
Initlcd
Cursor Off
Cls
___lcdno = 1
Initlcd
Cursor Off
Cls

Do
Gosub Datum_zeit_einlesen
Waitms 1000
___lcdno = 1
Locate 1 , 1
Lcd Bcd(_hour) ; "/" ; Bcd(_min) ; "/" ; Bcd(_sec)
Locate 2 , 15
lcd _hour ' hier wird 33 ausgegeben und nicht 21 (es war beim Test 21
If _hour = 21 Then
Lcd _weekday
End If
Loop


Datum_zeit_einlesen:
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
Return

martin66119
31.10.2007, 21:51
Ich habs!

Ich muss _hour wieder in Dec. umwandeln mit

Uhrzeit= MAKEDEC(_hour)
Danke für die Hilfe Dirk

Dirk
31.10.2007, 22:28
Ich muss _hour wieder in Dec. umwandeln mit ...

Genau! Ich würde das BCD-Umwandeln dann aber nicht bei der LCD-Ausgabe, sondern im Unterprogramm "Datum_zeit_einlesen:" machen. Dann hast du im ganzen Programm die Zeit in Dezimalform vorliegen (falls du Zeitabfragen auch für andere Steuerungszwecke brauchst, z.B. jede Stunde ...).
Das "_weekday = Makebcd(_weekday)" brauchst du nicht. Da ist eh DEZ und BCD identisch.

Gruß Dirk