PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] DS1302 RealTimeClock - 1 Bit fehlt



dj_cyborg
14.02.2014, 09:25
Hallo,

ich versuche gerade den DS1302 ein paar Sekunden zu entlocken.27496


Befehle schreibe ich so (funktioniert):


Settime:

Config Rtc_in = Output
Set Rtc_rst
Waitms 1

Rtc_cmd = &H8E
Rtc_data = &B00000000

Shiftout Rtc_out , Rtc_clk , Rtc_cmd , 3 , 8 , 200
Shiftout Rtc_out , Rtc_clk , Rtc_data , 3 , 8 , 200

Waitms 1
Reset Rtc_rst

.
.
.

Return



Auslesen so (funktioniert nicht ganz):



Gettime:
Rtc_cmd = &H81 ' read seconds

Config Rtc_in = Output
Set Rtc_rst
Waitms 1

Shiftout Rtc_out , Rtc_clk , Rtc_cmd , 3 , 8 , 500

Config Rtc_in = Input
Shiftin Rtc_in , Rtc_clk , Rtc_bytes , 2 , 8 , 500
Config Rtc_in = Output

Waitms 1
Reset Rtc_rst

Return



Settime funktioniert.
Das Problem ist nun das beim schreiben des Befehls mittels Shiftout das erste BIT für den folgenden Shiftin schon mit ausgegeben wird der mir dann in meinen rtc_bytes fehlt. 27497

Folge ist, das nur alle 2 Sekunden gezählt wird und bei 5 schon eine 10er Stelle gezählt wird.

Wie könnte ich mit Bascom die letzte fallende Flanke vom Shiftout im Shiftin mit berücksichtigen?

Diese Lösung hat bei mir nicht funktioniert. (Habs aber auch nicht verstanden, warum es so funktionieren sollte)
http://www.mikrocontroller.net/topic/249885

Vielen Dank für Eure Hilfe.

mfG
Mario

dj_cyborg
14.02.2014, 19:10
Hallo,

ok ich habe es jetzt wie folgt gemacht.



'************************************************* ******************************
'************************************************* ******************************
'************************ DS1302 RealTimeClock V1.0 ****************************
'************************************************* ******************************
'************************** 14.02.2014 by CYBORG *******************************
'************************************************* ******************************
'************************************************* ******************************

'****************************** Allgemein **************************************

$regfile = "m88def.dat"
$crystal = 8000000
$hwstack = 48
$swstack = 48
$framesize = 48
$baud = 19200

'************************* I2C - DISPLAY 1602 **********************************

$lib "YwRobot_Lcd_i2c.lib" 'I2C LCD

Const Pcf8574_lcd = &H4E 'LCD Adresse
Dim Lcd_backlight As Byte
Lcd_backlight = 1 'Hintergrundbeleuchtung einschalten (1/0)

Config Scl = Portc.5 'i2c SCL
Config Sda = Portc.4 'i2c SDA
Config Lcd = 16 * 2 'nicht unbedingt nötig
Config I2cdelay = 1

Waitms 300 'warte bis Kondensator bei Ta0 geladen, auch für LCD-Init!
Cls
Waitms 300

'************************ DS1302 RealTimeClock *********************************

Declare Function Rtc_get(byval Rtc_cmd As Byte ) As String * 2
Declare Sub Rtc_set(byval Rtc_cmd As Byte , Byval Rtc_data As Byte)


Rtc_rst Alias Portd.6
Config Pind.6 = Output

Rtc_clk Alias Portb.0
Config Pinb.0 = Output

Rtc_in Alias Pind.7
Rtc_out Alias Portd.7
Config Rtc_in = Output


Const Rtc_sec = &H80
Const Rtc_min = &H82
Const Rtc_hour = &H84
Const Rtc_day = &H86
Const Rtc_month = &H88
Const Rtc_wday = &H8A
Const Rtc_year = &H8C
Const Rtc_wp = &H8E
Const Rtc_tcs = &H90


'Uhr konfigurieren
Rtc_set Rtc_wp , &B00000000 'Schreibschutz / WP=BIT7 / &B00000000=aus / &B10000000=an
Rtc_set Rtc_tcs , &B10100101 'Batterieladung einstellen / 1 Diode, 2kOhm ~ 2,2mA

Rtc_set Rtc_sec , &B00000000 'Sekunden einstellen / CH=BIT7 / 0,1=an,aus
Rtc_set Rtc_min , &B01011001 'Minuten einstellen
Rtc_set Rtc_hour , &B00100011 'Stunden einstellen

Rtc_set Rtc_day , &B00010100 'Tag einstellen
Rtc_set Rtc_month , &B00000010 'Monat einstellen
Rtc_set Rtc_year , &B00010100 'Jahr einstellen

Rtc_set Rtc_wday , &B00000101 'Wochentag einstellen

Wait 1
'***************************** HAUPTSCHLEIFE ***********************************

Do

'Zeit
Locate 1 , 1
Lcd Rtc_get(rtc_hour) ; ":" ; Rtc_get(rtc_min) ; ":" ; Rtc_get(rtc_sec)

'Datum
Locate 2 , 1
Lcd Rtc_get(rtc_day) ; "/" ; Rtc_get(rtc_month) ; "/" ; Rtc_get(rtc_year)

'Wochentag
Locate 2 , 12
Lcd "WT:" ; Rtc_get(rtc_wday)

Waitms 300
Loop

End


'***************************** RTC-FUNCTIONS ***********************************
'******************************** RTC-SET **************************************
Sub Rtc_set(byval Rtc_cmd As Byte , Rtc_data As Byte)

Config Rtc_in = Output
Set Rtc_rst
Waitms 1

Shiftout Rtc_out , Rtc_clk , Rtc_cmd , 3 , 8 , 200
Shiftout Rtc_out , Rtc_clk , Rtc_data , 3 , 8 , 200

Waitms 1
Reset Rtc_rst

End Sub

'******************************** RTC-GET **************************************
Function Rtc_get(byval Rtc_cmd As Byte ) As Byte

Rtc_cmd = Rtc_cmd + 1

Config Rtc_in = Output
Set Rtc_rst
Waitms 1

Shiftout Rtc_out , Rtc_clk , Rtc_cmd , 3 , 7 , 500

Config Rtc_in = Input
Shiftin Rtc_in , Rtc_clk , Rtc_cmd , 2 , 8 , 500
Config Rtc_in = Output

Waitms 1
Reset Rtc_rst

Rtc_get = Bcd(rtc_cmd)

End Function


mfG
Mario