DCF77 und RTC mit ATmega unter BASCOM

Hallo Casio,
dein Dimmer gefällt mir gut, da werd ich nochmal genauer hinsehen.

Meine Projekt läuft übrigens schon: mit einem "68HC908QY4 'Open-Midi' von cctools " ohne LM75 und einer nur mit 7Segment LED Anzeige.

Gruß Siggi
 
Hallo Siggi!

Wenn du dir den Dimmer mal etwas genauer angesehen hast wirst du vielleicht bemerkt haben, dass du zum Ansteuern des Triacs für die Schalt- oder Dimmfunktion gar keinen PWM benötigst. ;)

Außerdem leuchten deine blauen LEDs doch nur in der Nacht..... dann sind die Halogenstrahler doch ausgeschaltet, oder?


Mit dem 128er kannst du jedenfalls nichts "falsch" machen und dir noch jede Menge spielereien einfallen lassen.


Wünsche weiterhin gutes Gelingen! :)

Cassio
 
Hi,

wo bekomm ich eigentlich diese lib ds1307clock.lib her? benutze nur die Bascom demo. Gibt es eigentlich einen einzelnen codeschnipsel für den ds1307?

Gruß
Jens
 
Hallo Jens,

Du solltest Dir die Vollversion von BACOM gönnen !

Da ist auch die LIB dabei und ein Beispiel ;)

Code:
'-------------------------------------------------------------------------------
'                           DateTime_test.bas
'   This sample show how to use the Date-Time routines from the DateTime.Lib
'   written by Josef Franz Vögel
'-------------------------------------------------------------------------------

' choose the micro you use
$regfile = "M103DEF.DAT"


Const Clockmode = 1
'use i2c for the clock

#if Clockmode = 1
  Config Clock = Soft                   ' we use build in clock
  disable interrupts
#else
  Config Clock = User                   ' we use I2C for the clock
  'configure the scl and sda pins
  Config Sda = Portd.6
  Config Scl = Portd.5

  'address of ds1307
  Const Ds1307w = &HD0                  ' Addresses of Ds1307 clock
  Const Ds1307r = &HD1
#endif


'configure the date format
Config Date = ymd , Separator = -       ' ANSI-Format
'This sample does not have the clock started so interrupts are not enabled
' Enable Interrupts

'dim the used variables
Dim lVar1 as Long
Dim mDay as Byte
Dim Bweekday As Byte , Strweekday As String * 10
Dim strDate as String * 8
Dim strtime as String * 8
Dim bSec as Byte , bMin as Byte , bHour as Byte
Dim bDay as Byte , bMonth as Byte , bYear as Byte
Dim lSecOfDay as Long
Dim wSysDay as Word
Dim lSysSec as Long
Dim wDayOfYear as Word




' =================== DayOfWeek =============================================
' Example 1 with internal RTC-Clock

_day = 4 : _month = 11 : _year = 2      ' Load RTC-Clock for example - testing
Bweekday = Dayofweek()
strWeekDay = Lookupstr(bWeekDay , WeekDays)
print "Weekday-Number of " ; Date$ ; " is " ; bWeekday ; " = " ; strWeekday


' Example 2 with defined Clock - Bytes (Day / Month / Year)
Bday = 26 : Bmonth = 11 : Byear = 2
Bweekday = Dayofweek(bday)
strWeekDay = Lookupstr(bWeekDay , WeekDays)
Strdate = Date(bday)
print "Weekday-Number of Day=" ; bDay ; " Month=" ; bMonth ; " Year=" ; bYear ; " is " ; bWeekday ; " (" ; date(bDay) ; ") = " ; strWeekday


' Example 3 with System Day
Wsysday = 2000                          ' that is 2005-06-23
Bweekday = Dayofweek(wsysday)
strWeekDay = Lookupstr(bWeekDay , WeekDays)
print "Weekday-Number of System Day " ; wSysDay ; " (" ; date(wSysDay) ; ") is " ; bWeekday ; " = " ; strWeekday



' Example 4 with System Second
Lsyssec = 123456789                     ' that is 2003-11-29 at 21:33:09
Bweekday = Dayofweek(lsyssec)
strWeekDay = Lookupstr(bWeekDay , WeekDays)
print "Weekday-Number of System Second " ; lSysSec ; " (" ; date(lSysSec) ; ") is " ; bWeekday ; " = " ; strWeekday




' Example 5 with Date-String
Strdate = "04-11-02"                    ' we have configured Date in ANSI
Bweekday = Dayofweek(strdate)
strWeekDay = Lookupstr(bWeekDay , WeekDays)
print "Weekday-Number of " ; strDate ; " is " ; bWeekday ; " = " ; strWeekday




' ================= Second of Day =============================================
' Example 1 with internal RTC-Clock
_Sec = 12 : _Min = 30 : _Hour = 18      ' Load RTC-Clock for example - testing

Lsecofday = Secofday()
print "Second of Day of " ; time$ ; " is " ; lSecOfDay


' Example 2 with defined Clock - Bytes (Second / Minute / Hour)
bSec = 20 : bMin = 1 : bHour = 7
Lsecofday = Secofday(bsec)
print "Second of Day of Sec=" ; bsec ; " Min=" ; bmin ; " Hour=" ; bHour ; " (" ; time(bSec) ; ") is " ; lSecOfDay


' Example 3 with System Second
lSysSec = 1234456789
Lsecofday = Secofday(lsyssec)
print "Second of Day of System Second " ; lSysSec ; "(" ; time(lSysSec) ; ") is " ; lSecOfDay


' Example 4 with Time - String
strTime = "04:58:37"
Lsecofday = Secofday(strtime)
print "Second of Day of " ; strTime ; " is " ; lSecOfDay



' ================== System Second ============================================

' Example 1 with internal RTC-Clock
                          ' Load RTC-Clock for example - testing
_Sec = 17 : _Min = 35 : _Hour = 8 : _Day = 16 : _Month = 4 : _Year = 3

Lsyssec = Syssec()
print "System Second of " ; Time$ ; " at " ; Date$ ; " is " ; lSysSec


' Example 2 with with defined Clock - Bytes (Second, Minute, Hour, Day / Month / Year)
Bsec = 20 : Bmin = 1 : Bhour = 7 : Bday = 22 : Bmonth = 12 : Byear = 1
Lsyssec = Syssec(bsec)
Strtime = Time(bsec)
Strdate = Date(bday)
print "System Second of " ; strTime ; " at " ; strDate ; " is " ; lSysSec


' Example 3 with System Day

wSysDay = 2000
Lsyssec = Syssec(wsysday)
print "System Second of System Day " ; wSysDay ; " (" ; date(wSysDay) ; " 00:00:00) is " ; lSysSec


' Example 4 with Time and Date String
strTime = "10:23:50"
strDate = "02-11-29"                    ' ANSI-Date
lSysSec = SysSec(strTime , strDate)
print "System Second of " ; strTime ; " at " ; strDate ; " is " ; lSysSec       ' 91880630




' ==================== Day Of Year =========================================
' Example 1 with internal RTC-Clock
_day = 20 : _month = 11 : _year = 2     ' Load RTC-Clock for example - testing
Wdayofyear = Dayofyear()
print "Day Of Year of " ; Date$ ; " is " ; wDayOfYear


' Example 2 with defined Clock - Bytes (Day / Month / Year)
Bday = 24 : Bmonth = 5 : Byear = 8
Wdayofyear = Dayofyear(bday)
print "Day Of Year of Day=" ; bDay ; " Month=" ; bMonth ; " Year=" ; bYear ; " (" ; date(bDay) ; ") is " ; wDayOfYear



' Example 3 with Date - String
strDate = "04-10-29"                    ' we have configured ANSI Format
Wdayofyear = Dayofyear(strdate)
print "Day Of Year of " ; strDate ; " is " ; wDayOfYear


' Example 4 with System Second

lSysSec = 123456789
Wdayofyear = Dayofyear(lsyssec)
print "Day Of Year of System Second " ; lSysSec ; " (" ; date(lSysSec) ; ") is " ; wDayOfYear


' Example 5 with System Day
Wsysday = 3000
Wdayofyear = Dayofyear(wsysday)
print "Day Of Year of System Day " ; wSysDay ; " (" ; date(wSysDay) ; ") is " ; wDayOfYear





' =================== System Day ======================================
' Example 1 with internal RTC-Clock
_day = 20 : _Month = 11 : _Year = 2     ' Load RTC-Clock for example - testing
Wsysday = Sysday()
print "System Day of " ; Date$ ; " is " ; wSysDay


' Example 2 with defined Clock - Bytes (Day / Month / Year)
bDay = 24 : bMonth = 5 : bYear = 8
Wsysday = Sysday(bday)
print "System Day of Day=" ; bDay ; " Month=" ; bMonth ; " Year=" ; bYear ; " (" ; date(bDay) ; ") is " ; wSysDay


' Example 3 with Date - String
strDate = "04-10-29"
Wsysday = Sysday(strdate)
print "System Day of " ; strDate ; " is " ; wSysDay

' Example 4 with System Second
lSysSec = 123456789
Wsysday = Sysday(lsyssec)
print "System Day of System Second " ; lSysSec ; " (" ; date(lSysSec) ; ") is " ; wSysDay



' =================== Time ================================================
' Example 1: Converting defined Clock - Bytes (Second / Minute / Hour) to Time - String
Bsec = 20 : Bmin = 1 : Bhour = 7
Strtime = Time(bsec)
print "Time values: Sec=" ; bsec ; " Min=" ; bmin ; " Hour=" ; bHour ; " converted to string " ; strTime


' Example 2: Converting System Second  to Time - String
Lsyssec = 123456789
Strtime = Time(lsyssec)
Print "Time of Systemsecond " ; Lsyssec ; " is " ; Strtime


' Example 3: Converting Second of Day to Time - String
 Lsecofday = 12345
Strtime = Time(lsecofday)
Print "Time of Second of Day " ; Lsecofday ; " is " ; Strtime


' Example 4: Converting System Second to defined Clock - Bytes (Second / Minute / Hour)

Lsyssec = 123456789
Bsec = Time(lsyssec)
Print "System Second " ; lSysSec ; " converted to Sec=" ; bsec ; " Min=" ; bmin ; " Hour=" ; bHour ; " (" ; time(lSysSec) ; ")"



' Example 5: Converting Second of Day to defined Clock - Bytes (Second / Minute / Hour)
lSecOfDay = 12345
Bsec = Time(lsecofday)
Print "Second of Day " ; lSecOfDay ; " converted to Sec=" ; bsec ; " Min=" ; bmin ; " Hour=" ; bHour ; " (" ; time(lSecOfDay) ; ")"

' Example 6: Converting Time-string to defined Clock - Bytes (Second / Minute / Hour)
strTime = "07:33:12"
Bsec = Time(strtime)
Print "Time " ; strTime ; " converted to Sec=" ; bsec ; " Min=" ; bmin ; " Hour=" ; bHour



' ============================= Date ==========================================

' Example 1: Converting defined Clock - Bytes (Day / Month / Year) to Date - String
bDay = 29 : bMonth = 4 : bYear = 12
Strdate = Date(bday)
print "Dat values: Day=" ; bDay ; " Month=" ; bMonth ; " Year=" ; bYear ; " converted to string " ; strDate


' Example 2: Converting from System Day to Date - String
wSysDay = 1234
Strdate = Date(wsysday)
Print "System Day " ; wSysDay ; " is " ; strDate


' Example 3: Converting from System Second to Date String
lSysSec = 123456789
Strdate = Date(lsyssec)
Print "System Second " ; lSysSec ; " is " ; strDate


' Example 4: Converting SystemDay to defined Clock - Bytes (Day / Month / Year)

wSysDay = 2000
Bday = Date(wsysday)
print "System Day " ; wSysDay ; " converted to Day=" ; bDay ; " Month=" ; bMonth ; " Year=" ; bYear ; " (" ; date(wSysDay) ; ")"


' Example 5: Converting Date - String to defined Clock - Bytes (Day / Month / Year)
strDate = "04-08-31"
Bday = Date(strdate)
print "Date " ; strDate ; " converted to Day=" ; bDay ; " Month=" ; bMonth ; " Year=" ; bYear


' Example 6: Converting System Second to defined Clock - Bytes (Day / Month / Year)
lSysSec = 123456789
Bday = Date(lsyssec)
print "System Second " ; lSysSec ; " converted to Day=" ; bDay ; " Month=" ; bMonth ; " Year=" ; bYear ; " (" ; date(lSysSec) ; ")"



' ================ Second of Day elapsed

Lsecofday = Secofday()
_Hour = _Hour + 1
lVar1 = SecElapsed(lSecOfDay)
print lVar1

Lsyssec = Syssec()
_Day = _day + 1
Lvar1 = Syssecelapsed(lsyssec)
print lVar1






looptest:

' Initialising for testing
_day = 1
_month = 1
_year = 1
_sec = 12
_min = 13
_hour = 14



do
   if _year > 50 then
      exit do
   end if

  _sec = _sec + 7
  if _sec > 59 then
     incr _min
     _sec = _sec - 60
  end if

  _min = _min + 2
  if _min > 59 then
     incr _hour
     _min = _min - 60
  end if

  _hour = _hour + 1
  if _hour > 23 then
     incr _day
     _hour = _hour - 24
  end if

  _day = _day + 1


  if _day > 28 then
     select case _month
        case 1
           mday = 31
        case 2
           mday = _year and &H03
           if mday = 0 then
              mday = 29
           else
              mday = 28
           end if
        case 3
           mday = 31
        case 4
           mday = 30
        case 5
           mday = 31
        case 6
           mday = 30
        case 7
           mday = 31
        case 8
           mday = 31
        case 9
           mday = 30
        case 10
           mday = 31
        case 11
           mday = 30
        case 12
           mday = 31
     end select
     if _day > mday then
        _day = _day - mday
        incr _month
        if _month > 12 then
           _month = 1
           incr _year
        end if
     end if
  end if
  if _year > 99 then
     exit do
  end if

Lsecofday = Secofday()
Lsyssec = Syssec()
Bweekday = Dayofweek()
Wdayofyear = Dayofyear()
Wsysday = Sysday()


print time$ ; " " ; date$ ; " " ; lSecOfDay ; " " ; lSysSec ; " " ; bWeekDay ; " " ; wDayOfYear ; " " ; wSysDay


loop
End


'only when we use I2C for the clock we need to set the clock date time
#if Clockmode = 0
'called from datetime.lib
Dim Weekday As Byte
Getdatetime:
  I2cstart                              ' Generate start code
  I2cwbyte Ds1307w                      ' send address
  I2cwbyte 0                            ' start address in 1307

  I2cstart                              ' Generate start code
  I2cwbyte Ds1307r                      ' send address
  I2crbyte _sec , Ack
  I2crbyte _min , Ack                   ' MINUTES
  I2crbyte _hour , Ack                  ' Hours
  I2crbyte Weekday , Ack                ' Day of Week
  I2crbyte _day , Ack                   ' Day of Month
  I2crbyte _month , Ack                 ' Month of Year
  I2crbyte _year , Nack                 ' Year
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart                              ' Generate start code
  I2cwbyte Ds1307w                      ' send address
  I2cwbyte 4                            ' starting address in 1307
  I2cwbyte _day                         ' Send Data to SECONDS
  I2cwbyte _month                       ' MINUTES
  I2cwbyte _year                        ' Hours
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart                              ' Generate start code
  I2cwbyte Ds1307w                      ' send address
  I2cwbyte 0                            ' starting address in 1307
  I2cwbyte _sec                         ' Send Data to SECONDS
  I2cwbyte _min                         ' MINUTES
  I2cwbyte _hour                        ' Hours
  I2cstop
Return

#endif


WeekDays:
Data "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" , "Saturday" , "Sunday"

Thomas
 

Anhänge

  • DS1307.zip
    899 Bytes · Aufrufe: 113
hi,

muss die Batterie unbedingt angeschlossen werden oder kann ich die erstmal zum Testen weglassen? Finde nichts passendes im Datenblatt.

Gruß
Jens
 
Die Batterie kann weggelassen werden. Bedeutet aber, wenn Du die Spannung abschaltest dann sind die Daten futsch und Du musst die RTC neu initialisieren. Sie läuft natürlich auch ohne Batterie nicht im Hintergrund weiter bei Spannung aus, versteht sich von selbst!

Grüße,
Ma
 
Hallo,

die Batterie dient als Puffer, damit die Zeit in dem Ding erhalten bleibt. Ich denke, man kann sie zum Testen auch mal weglassen. Ich würde es aber nicht machen, wer weiß, was das Ding sonst macht.

OK; vergeßt den Beitrag. Markus war schneller ;)

Thomas
 
Hi,

danke für die schnellen Antworten. Ich habe von I2c Programmierung mit dem Ds1307 Null Ahnung. Wollte mir das ganze mit diesem Code aneignen. Kann mir da jemand helfen? Ich bekomm das ganze nicht zum laufen.

Code:
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 9600

Ddrd = &HFE
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Config Lcd = 16 * 2

Config Sda = Portc.1                                       
Config Scl = Portc.0
Const Ds1307w = &HD0                          ' Addresse der Ds1307 Uhr
Const Ds1307r = &HD1

Config Clock = User                           ' Interne Time/Date Routinen für Bascom konfigurieren
Config Date = Dmy , Separator = .

' Init
Ddrb.1 = 1
Cls
Cursor Noblink
Cursor Off


' Stellen der Uhr, muss nur einmal ausgeführt werden
Time$ = "11:55:00"
Date$ = "08.01.07"

' Main Loop
Do
 Locate 1 , 1 : Lcd Date$
 Locate 2 , 1 : Lcd Time$
 Gosub Getdatetime
 Gosub Setdate
 Gosub Settime

Loop

' Unterprogramme für die Bascom Date/Time-Funktionen
Dim Weekday As Byte
Getdatetime:
  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)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 4
  I2cwbyte _day
  I2cwbyte _month
  I2cwbyte _year
  I2cstop
Return

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

End
 
Hallo Jens,

Du musst Dich zunächst entscheiden, ob Du das HW-TWI-Interface des Megas verwenden möchtest oder das Software-Interface.
BASCOM bietet die Möglichkeit das TWI-Protokoll auch mittels SW nachzubilden und davon bekommst Du von aussen betrachtet nicht mit.

Wenn Du das HW-TWI-Interface verwenden möchtest wozu ich Dir bei dem Mega32 dringend raten würde so fehlt in Deinem Code zunächst die Anweisung:

$lib"i2c_twi.lbx"

Nachdem Du den SDA auch auf PINC1 und den SCL auf PINC0 festgelegt hast gehe ich davon aus, dass Du die HW benutzen möchtest.
Das macht auch wirklich Sinn den mit einer SW-Lösung belastest Du unnötig den Mega.

Als nächstes fällt mr auf, dass der Befehl "I2cinit" fehlt. Den benötigst Du aber da mittels dieses Befehls das I2C Interface in einen korrekten Ausgangspunkt gebracht wird, auf dem jede weitere Kommunikation aufbaut. Die Pegel von SDA und SCL mussen gemäß I2C Spec auf die richtigen Pegel gebracht werden.

sooooo....

Weiter vermisse ich den befehl "Config TWI" mittels Du dem Controller mitteils, mit welcher Baudrate er den TWI fahren soll. Default sind meiner Meinung nach 400 kBaud.
Meiner Meinung nach arbeitet der DS1307 nur mit 100 kBaud


Ich würde den TWI so initialisieren:
Code:
' ----- Konfiguration für RTC DS1307 -----
Config Sda = Sda_port
Config Scl = Scl_port

I2cinit                                                     ' we need to set the pins in the proper state

' Achtung: gemäß Datenblatt kann der DS1307 nur eine max frequency von 100 kHz
Config Twi = 100000                                         ' Taktfrequenz 100 kBaud

' TWI gleich einschalten, das macht BASCOM ansonsten erst beim I2CStart
Twcr = &B00000100                                           ' nur TWEN setzen

' Optionale Einstellungen für TWI Kommunikation die nicht zwingend erforderliche sind
' Twsr = 0                                                 ' Status und Prescaler Register
' Twbr = 152                                               ' Bit Rate Register, 72 = 100kHz   152 = 50kHz(0 bis 255)
' Config I2cdelay = 40


Nun, weiter bin ich in der Analyse Deines Codes noch nicht gekommen. Ich würde zunächst vorschlage, dass Du Dir die Punkte die ich Dir hier zunächst beschrieben habe mal ansiehst.

Gerne würde mich Dein Feedback interessieren und ob es dann funzt. Wenn nicht führe ich mir Deinen Code zur Gemüte, was hältst Du von dem Vorschlag?
 
Hi Markus,

habe die Lib und deine weiteren Empfehlungen eingebunden. Doch leider ohne Erfolg. Wenn ich Config Click = Soft anstatt User eingebe, steht die feste Zeit auf dem Display. Aber es wird nicht hochgezählt. Mir fehlt irgendwie das Ticken in der Schaltung. Wie schreib Ich dem Ds1307 eigentlich die Uhrzeit rein? Ich kann morgen in der Technikerschule den SQW/OUT Ausgang mal mit dem Oszi nachmessen ob der DS1307 überhaupt ein Zucken von sich gibt. Leider programmieren wir nur die S7 von Siemens und die Lehrer kann man in der hinsicht von Prozessoren in die Tonne treten.

Gruß
Jens
 
Hi Jens,

hast Du an die 10 kOhm-PullUps zwischen Deinem Mega und dem RTC als Busabschluss für den TWI gedacht?

Sei bitte so lieb und hänge Dein aktuelles Programm mal als Anhang an diesen Thread damit ich was aktuelles von Dir habe was auch Deine letzten Änderungen behinhaltet. Das wäre sehr hilfreich!

Bitte hänge auch eine aktuelle Skizze Deiner Beschaltung (Mega + RTC) kurz an damit ich prüfen kann ob das passt.

Grüße,
Markus
 
Hi,

habe zweimal 4,7Kohm als Pullups auf SDA und SCL gesetzt. Denke mal nicht, das dies zu wenig ist, oder? Der Rest kommt heute abend.

Gruß
Jens
 
Hi,

hier ist der Code und als anhang die Verdrahtung. Hab ich noch schnell in Target erledigt.

Code:
$regfile = "m32def.dat"
$crystal = 16000000
$baud = 19600

$lib "i2c_twi.lbx"

Ddrd = &HFE
Config Lcdpin = Pin , Db4 = Portb.2 , Db5 = Portb.3 , Db6 = Portb.4 , Db7 = Portb.5 , E = Portb.1 , Rs = Portb.0
Config Lcd = 16 * 2

Config Sda = Portc.1                                        ' I2C Bus konfigurieren
Config Scl = Portc.0
Const Ds1307w = &HD0                                        ' Addresse der Ds1307 
Const Ds1307r = &HD1
Config Clock = Soft                                         ' InterneTime/DateRoutinen für Bascom konfigurieren
Config Date = Dmy , Separator = .

I2cinit
Config Twi = 100000
Twcr = &B00000100
Twsr = 0
Twbr = 152
Config I2cdelay = 40


' Init
Ddrb.1 = 1
Cls
Cursor Noblink
Cursor Off


' Stellen der Uhr, muss nur einmal ausgeführt werden
Time$ = "11:55:00"
Date$ = "08.01.07"

' Main Loop
Do

 Locate 1 , 1 : Lcd Date$
 Locate 2 , 1 : Lcd Time$
 Waitms 500

Loop

' Unterprogramme für die Bascom Date/Time-Funktionen
Dim Weekday As Byte
Getdatetime:
  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)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 4
  I2cwbyte _day
  I2cwbyte _month
  I2cwbyte _year
  I2cstop
Return

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

Gruß
Jens
 

Anhänge

  • a32ds1307.JPG
    a32ds1307.JPG
    36,1 KB · Aufrufe: 179
Hallo Jens,

bin gerade in Zeitnot, konnte mir aber Deinen Schaltplan schon mal ansehen. Der sieht meiner Meinung nach OK aus und wenn Du es so auch verdrahtet hast dann sollte es auch funktionieren.

Den PullUp mit 4k7 festzulegen ist OK und wird sicher funktionieren. Du bekommst dadurch etwas steilere Signal-Flanken da die leitungsbedingten Kapazitäten schnell "umgeladen" werden können. Du verbrätst damit auch etwas mehr Leistung als notwendig, sollte aber kein tehnischer Hinderungsgrund sein. Bei großen Leitungslängen zwischen Mega und I2C Device geht man eh mit dem PullUp etwas runter.

Lange Rede kurzer Sinn, die HW sieht OK aus.

Als nächstes schau ich mir dann Dein Programm an, könnte aber heute nix mehr werde da ich - Wetterabhängig - heute Abend noch Dienst in der unserer Sternwarte habe.

Grüße,
Markus
 
Hallo Jens,

nun habe ich mir Deinen Code etwas näher angesehen und mir sind folgende Dinge aufgefallen welche ich kurz ansprechen möchte:

1.
Gehe ich richtig in der Annahme, dass Du diesen Code aus der Beispielsammlung DateTime_text.bas von BASCOM selbst entnommen hast?
Kurze Anmerkung dazu: Die Beispielprogramme von BASCOM selbst müssen nicht unbedingt funktionieren :mad: Wenn Du Dich mal im MCS Forum umsiehst so gibt es dort reihenweise Beiträge zu Beispielen die nicht funktionieren können weil sie unsauber und mit der heißen Nadel zusammengestrickt wurden. Etwas mehr Sorgfalt wäre hier wünschenswert!
Ich vermute Du hast Dein Beispiuel dort heraus kopiert und dabei ein paar ganz wichtige Dinge übersehen!

Aber fangen wir von Anfang an an:D

2. Zunächst würde ich nach den ganzen Configs in Deinem Programm mit "Enable Interrupts" sämtliche Interrupts freigeben sofern sie von den Configs benötigt werden. Ich könnte mir vorstellen dass "Config Clock = Soft" die Interrupts benötigt. Aber lese einfach mal weiter denn ich bin mir in dem Beispiel nicht mehr sicher ob wir überhaupt die Soft-Clock brauchen.

3. Das Beispielprogramm auf welchem Du aufsetzt erscheint mir sehr komplex und es bedient sich einem Trick den Du vermutlich übersehen hast. Du musst Dich entscheiden, ob Du die Soft-Clock verwenden möchtest oder die I2C-RTC. Aktuell vermischt Du beides und ich vermute dass dies die Ursache für das nicht funktionierende Programm ist.

Im originalen Beispielprogramm gibt es hierzu eine Schlüsselstelle:
Code:
Const Clockmode = 1
'use i2c for the clock

#if Clockmode = 1
  Config Clock = Soft                   ' we use build in clock
  disable interrupts
#else
  Config Clock = User                   ' we use I2C for the clock
  'configure the scl and sda pins
  Config Sda = Portd.6
  Config Scl = Portd.5

  'address of ds1307
  Const Ds1307w = &HD0                  ' Addresses of Ds1307 clock
  Const Ds1307r = &HD1
#endif

Hier wird ENTWEDER die SoftClock oder die I2C Clock initialisiert. Das MUSS auch so sein und wenn Du Deine RTC verwenden möchtest dann bin ich der Meinung, musst Du auch den "Config Clock = Soft" rausschmeißen, weil:

4. Das Prinzip des Beispielprogramm basiert darauf, dass Du die Möglichkeit hast, drei eigenen Funktionen zu definieren welche durch Funktionsaufrufe durch die Library "datetime.lib" aufgerufen werden. Ob das wirklich funktioniert kann ich nicht sagen denn ich habe diesen Hack noch nicht ausprobiert.

5. Wenn Du Dich für den Weg entscheiden solltest das Beispielprogramm weiter zu verwenden so gebe ich Dir den Rat Dich eingehend mit diesem auseinanderzusetzen und Dir genau anzusehen wie es gemacht ist und wie es funktioniert. Erst wenn Du es einigermaßen verstanden hast solltest Du mit dem Entfernen der für Dich nicht relevanten Teile beginnen.
Mehr kann ich dazu auch nicht beitragen.

6. Du solltest aber auch über eine andere Alternative nachdenken. Näömlich solltest Du Dir die Frage stellen ob es wirklich Sinn macht ständig bei jedem Zugriff auf Zeitfunktionen via I2C auf die RTC zuzugreifen. Eine andere Alternative wäre es, die Soft-Clock schon bestehen zu lassen und zyklisch die Soft-Clock-Zeit mit der RTC zu synchronisieren. Dafür fehlt aber in Deinem Beispielcode dann der korrekte Zugriff auf die RTC mittels dem Du die RTC von Hand stellst und mittels dem Du vielleicht einmal pro Stunde von der RTC aus die SoftClock neu stellst. Du siehst ja dann relativ schnell wie genau Deine SoftClock läuft und in welchen Zeitrastern Du neu synchronisieren musst.
Solltest Du Dich für diesen Weg entscheiden so kannst Du sicher einen Teil des Beispielcodes weiter verwenden. Die Routinen werden dann nur nicht automatisch aus der LIB aus aufgerufen sondern Du musst händisch die Funktionen aufrufen und dafür sorgen, dass Daten in die RTCgelagen und von der RTC wieder raus kommen. Aber Achtung, hier solltest Du auch die Wandlung von und zu BCD-Format berücksichtigen.


Fazit:
Die Entscheidung was Du wie umsetzt ist aktuell für Dich noch offen. Der Code kann aktuell so wie er von Dir umgesetzt ist noch nicht richtig funktionieren. Die Gründe die dazu führen (nach meiner Meinung) sind oben beschrieben. Vor dem Weitermachen würde ich mir an Deiner Stelle nochmals ganz eingehend das Beispielprogramm ansehen. Dann würde ich mich für einen Lösungweg entscheiden und das Programm entsprechend umstellen.

Grüße,
Markus
 
Hi Markus,

ich werde von dem Ds1307 ersmal die Finger weglassen und mich ein anderesmal damit beschäftigen. Mein einfacher Gedankengang wäre, den Uhrenquarz an Tosc1 und Tosc2 zu hängen und das ganze über die Timerfunktion laufen zu lassen. Ich denke mal das dies mit der zeit ungenau wird. Tosc1 und Tosc2 wird doch automatisch genutzt, wenn ich was mit dem Timer programmiere oder? So sollte sich doch sicherlich auch eine Uhr programmieren lassen, oder?

Gruß
Jens
 
Atmega 128 und Uhrenquarz

Hallo an alle,

hab nun meinen 128 und ein neues Grafikdisplay,
bekomme aber die Softclock nicht zum laufen?
An PG3 und PG4 hab ich einen 32768 Khz Quarz angeschlossen, die Uhr steht aber.
Muss es ein spezieller Uhrenquarz sein?

Ich hab mal meinen Testcod angehängt, vielleicht fällt ja jemand etwas ein.

Grüße an alle
Siggi
Code:
 $regfile = "m128def.dat"

$crystal = 16000000
'$baud = 9600
'$hwstack = 32
'$swstack = 32
'$framesize = 40


$lib "glcdKS108.lbx"

Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Cd = 0 , Rd = 1 , Ce = 4 , Ce2 = 3 , Enable = 2 , Reset = 5

Enable Interrupts

Config Date = Mdy , Separator = /                           ' ANSI-Format

Config Clock = Soft                                       

Date$ = "11/11/05"

Time$ = "23:59:50"



Setfont Font8x8

'---------------------------------------------------------------------

Do

Waitms 100
Lcdat 1 , 1 , Time$

Lcdat 2 , 1 , "--SoftClock!- -" ;
Waitms 500



Loop

End                                                         'end program

'---------------------------------------------------------------------
Lcd_cls2:
Glcdcmd &H3E , 1 : Glcdcmd &H3E , 2                         ' both displays off
Cls
Wait 10
Glcdcmd &H3F , 1 : Glcdcmd &H3F , 2                         'both on
Return
'---------------------------------------------------------------------

$include "font8x8.font"
 
Hallo Siggi!

Also ich finde momentan keinen Fehler..... :hmmmm:

Deine Pin-Angabe für den 128er ist in Ordnung!
Die Quarzfrequenz 32,768kHz ist auch OK (sofern du nur das Komma vergessen hattest)!
Der Programmcode (abgesehen der 600ms Wartezeit) ist auch in Ordnung.

Mir will momentan wirklich nicht einleuchten warum die Uhr nicht laufen soll? :hmmmm:

Deine beiden "Waitms" in der "Do-Loop" Schleife kannst du auch auf den einen "Waitms 100" beschränken.
Dies sollte aber keine Probleme mit der Uhr verursachen.


Ach eines noch.....
Bring die Zeile "Enable Interruots" doch mal unter die Anweisun "Config Clock = Soft". Vielleicht hilft das ja! ;)


Dein Code sollte dann so aussehen:
Code:
$regfile = "m128def.dat" 
$crystal = 16000000 
'$baud = 9600 
$hwstack = 32 
$swstack = 32 
$framesize = 40 

$lib "glcdKS108.lbx" 

Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Cd = 0 , Rd = 1 , Ce = 4 , Ce2 = 3 , Enable = 2 , Reset = 5 

Config Date = Mdy , Separator = /    ' ANSI-Format 
Config Clock = Soft 

Enable Interrupts 

Date$ = "11/11/05" 
Time$ = "23:59:50" 

Setfont Font8x8

'--------------------------------------------------------------------- 
Do 
Waitms 100 
Lcdat 1 , 1 , Time$ 
Lcdat 2 , 1 , "--SoftClock!- -" ; 

Loop 

End                     'end program 

$include "font8x8.font"

Schöne Grüße,
Cassio
 
Hallo zusammen,

ich kann zunächst auch keinen Fehler im Code finden. Das Verschieben von Enable Interrupts ist siche rkein Fehler, es sollte aber auch funktionieren, wenn Enable Interrupts oben steht.

Soweit ich sehe ist der Code ja fast auch 1:1 aus dem BASCOM-Beispiel entnommen und damit sollte er "um so mehr" funktionieren :rolleyes:

Wie ist die Programmreaktion? Gibt er überhaupt etwas auf dem Display aus oder siehst Du auf dem Display garnix?
Ich habe etwas im Hinterkopf, dass nach dem Config für das LCD unbedingt ein CLS kommen sollte da BASCOm erst mit dem ersten LCD noch irgendwelche Initialisierungen durchführt. Das würde ich auf jeden Fall zunächst noch einbauen. Also nach dem Config und dem Enable Interrupts noch ein CLS bevor Du in die Do-Loop läufts.

Code:
$regfile = "m128def.dat"
$crystal = 16000000
'$baud = 9600
$hwstack = 32
$swstack = 32
$framesize = 40

$lib "glcdKS108.lbx"

Config Graphlcd = 128 * 64sed , Dataport = Portc , Controlport = Porta , Cd = 0 , Rd = 1 , Ce = 4 , Ce2 = 3 , Enable = 2 , Reset = 5

Config Date = Mdy , Separator = /    ' ANSI-Format
Config Clock = Soft

Enable Interrupts

Date$ = "11/11/05"
Time$ = "23:59:50"

[B][COLOR="Red"]' probier mal
Cls
Wait 2[/COLOR][/B]

Setfont Font8x8

'---------------------------------------------------------------------
Do
Waitms 100
Lcdat 1 , 1 , Time$
Lcdat 2 , 1 , "--SoftClock!- -" ;

Loop

End                     'end program

$include "font8x8.font"

Grüße,
Markus
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)