Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
BASCOM AVR, help reference (2007).PDF
Скачиваний:
281
Добавлен:
12.08.2013
Размер:
17.02 Mб
Скачать

 

© MCS Electronics, 1995-2007

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

' send address

I2cwbyte Ds1307w

I2cwbyte 4

' starting address

in 1307

' Send Data to

I2cwbyte _day

SECONDS

' MINUTES

I2cwbyte _month

I2cwbyte _year

' Hours

I2cstop

 

Return

 

Settime:

_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)

I2cstart

' Generate start

code

' send address

I2cwbyte Ds1307w

I2cwbyte 0

' starting address

in 1307

' Send Data to

I2cwbyte _sec

SECONDS

' MINUTES

I2cwbyte _min

I2cwbyte _hour

' Hours

I2cstop

 

Return

 

#endif

 

Weekdays:

Data "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" , "Saturday" ,

"Sunday"

DAYOFYEAR

Action

Returns the Day of the Year of a Date

Syntax

Target = DayOfYear()

Target = DayOfYear(bDayMonthYear)

Target = DayOfYear(strDate)

Target = DayOfYear(wSysDay)

Target = DayOfYear(lSysSec)

Remarks

Target

A Integer, that is assigned with the Day of the Year

 

 

page -431-

© MCS Electronics, 1995-2007

BDayMonthYear

A Byte, which holds the Day-value followed by Month(Byte) and Year

 

(Byte)

StrDate

A String, which holds a Date-String in the format specified in the

 

CONFIG DATE statement

WSysDay

A Variable (Word) which holds a System Day (SysDay)

LsysSec

A Variable (Long) which holds a System Second (SysSec)

 

 

The Function can be used with five different kind of Input:

1.Without any parameter. The internal Date-values of SOFTCLOCK (_day, _month, _year) are used.

2.With a user defined date array. It must be arranged in same way (Day, Month, Year) as the internal SOFTCLOCK date. The first Byte (Day) is the input by this kind of usage. So the Day of the Year can be calculated of every date.

3.With a Date-String. The date-string must be in the Format specified in the Config Date Statement.

4.With a System Day Number (WORD)

5.With a System Second Number (LONG)

The Return-Value is in the Range of 0 to 364 (365 in a leap year). January the first starts with 0.

The function is valid in the 21th century (from 2000-01-01 to 2099-12-31).

See also

Date and Time Routines , SysSec , SysDay

Example

See DayOfWeek

DATE$

Action

Internal variable that holds the date.

Syntax

DATE$ = "mm/dd/yy" var = DATE$

Remarks

The DATE$ variable is used in combination with the CONFIG CLOCK directive.

The CONFIG CLOCK statement will use the TIMER0 or TIMER2 in asynchrone mode to create an interrupt that occurs every second. In this interrupt routine the_Sec, _Min and _Hour variables are updated. The _dat, _month and _year variables are also updated. The date format is in the same format as in VB.

page -432-

© MCS Electronics, 1995-2007

When you assign DATE$ to a string variable these variables are assigned to the DATE$ variable.

When you assign the DATE$ variable with a constant or other variable, the _day, _month and _year variables will be changed to the new date.

The only difference with VB is that all data must be provided when assigning the date. This is done for minimal code. You can change this behavior of course.

The async timer is only available in the M103, 90S8535, M163 and M32(3), Mega128, Mega64, Mega8. For other chips it will not work.

As new chips are launched by Atmel, and support is added by MCS, the list above might not be complete. It is intended to serve as an example for chips with a timer that can be used in asynchrone mode. So when your micro has a timer that can be used in asynchrone mode, it should work.

Do not confuse DATE$ with the DATE function.

ASM

The following ASM routines are called.

When assiging DATE$ : _set_date (calls _str2byte)

When reading DATE$ : _make_dt (calls _byte2str)

See also

TIME$ , CONFIG CLOCK , DATE

Example

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

 

------------

: megaclock.bas

'name

'copyright

: (c) 1995-2005, MCS Electronics

'purpose

: shows the new TIME$ and DATE$ reserved variables

'micro

: Mega103

'suited for demo

: yes

'commercial addon needed

: no

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

------------

$regfile = "m103def.dat"

' specify the used

micro

' used crystal

$crystal = 4000000

frequency

' use baud rate

$baud = 19200

$hwstack = 32

' default use 32

for the hardware stack

' default use 10

$swstack = 10

for the SW stack

' default use 40

$framesize = 40

for the frame space

 

'With the 8535 and timer2 or the Mega103 and TIMER0 you can 'easily implement a clock by attaching a 32768 Hz xtal to the timer 'And of course some BASCOM code

'This example is written for the STK300 with M103

Enable Interrupts

page -433-

© MCS Electronics, 1995-2007

 

'[configure LCD]

'address for E and

$lcd = &HC000

RS

'address for only

$lcdrs = &H8000

E

'nice display from

Config Lcd = 20 * 4

bg micro

'we run it in bus

Config Lcdbus = 4

mode and I hooked up only db4-db7

'tell about the

Config Lcdmode = Bus

bus mode

 

'[now init the clock]

' ANSI-Format

Config Date = Mdy , Separator = /

Config Clock = Soft

'this is how

simple it is

 

'The above statement will bind in an ISR so you can not use the TIMER anymore! 'For the M103 in this case it means that TIMER0 can not be used by the user anymore

'assign the date to the reserved date$ 'The format is MM/DD/YY

Date$ = "11/11/00"

'assign the time, format in hh:mm:ss military format(24 hours)

'You may not use 1:2:3 !! adding support for this would mean overhead 'But of course you can alter the library routines used

Time$ = "02:20:00"

 

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

 

'clear the LCD display

 

Cls

 

Do

'cursor home

Home

Lcd Date$ ; " " ; Time$

'show the date and

time

 

Loop

 

'The clock routine does use the following internal variables: '_day , _month, _year , _sec, _hour, _min

'These are all bytes. You can assign or use them directly _day = 1

'For the _year variable only the year is stored, not the century

End

DATE

Action

Returns a date-value (String or 3 Bytes for Day, Month and Year) depending of the Type of the Target

Syntax

bDayMonthYear = Date(lSysSec)

bDayMonthYear = Date(lSysDay)

bDayMonthYear = Date(strDate)

page -434-

© MCS Electronics, 1995-2007

strDate = Date(lSysSec) strDate = Date(lSysDay) strDate = Date(bDayMonthYear)

Remarks

StrDate

A Date-String in the format specified in the

 

CONFIG DATE statement

LsysSec

A LONG – variable which holds the System Second (SysSec =

 

TimeStamp)

LsysDay

A WORD – variable, which holds then System Day (SysDay)

BDayMonthYear A BYTE – variable, which holds Days, followed by Month (Byte) and Year (Byte)

Converting to String:

The target string must have a length of at least 8 Bytes, otherwise SRAM after the target-string will be overwritten.

Converting to Soft clock date format (3 Bytes for Day, Month and Year):

Three Bytes for Day, Month and Year must follow each other in SRAM. The variable-name of the first Byte, the one for Day must be passed to the function.

See also

Date and Time Routines , DAYOFYEAR, SYSDAY

Example

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

 

------------

: datetime_test1,bas

'name

'copyright

: (c) 1995-2005, MCS Electronics

'purpose

: show how to use the Date-Time routines from the

DateTime.Lib

: Mega103

'micro

'suited for demo

: no

'commercial addon needed

: no

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

 

------------

 

$regfile = "m103def.dat"

' specify the used

micro

' used crystal

$crystal = 4000000

frequency

' use baud rate

$baud = 19200

$hwstack = 32

' default use 32

for the hardware stack

' default use 10

$swstack = 10

for the SW stack

' default use 40

$framesize = 40

for the frame space

 

Const Clockmode = 1

 

page -435-

© MCS Electronics, 1995-2007

 

'use i2c for the clock

 

#if Clockmode = 1

' we use build in

Config Clock = Soft

clock

 

Disable Interrupts

 

#else

' we use I2C for

Config Clock = User

the clock

 

'configure the scl and sda pins

 

Config Sda = Portd.6

 

Config Scl = Portd.5

 

'address of ds1307

' Addresses of

Const Ds1307w = &HD0

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)

 

page -436-

© MCS Electronics, 1995-2007

Print "Weekday-Number of System Day " ; Wsysday ; " (" ; Date(wsysday) ; ") is " ; Bweekday ; " = " ; Strweekday

' Example 4 with System Second

' that is

Lsyssec = 123456789

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

' we have

Strdate = "04-11-02"

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

' Load RTC-Clock

_sec = 12 : _min = 30 : _hour = 18

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()

page -437-

© MCS Electronics, 1995-2007

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"

' ANSI-Date

Strdate = "02-11-29"

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 "

page -438-

© MCS Electronics, 1995-2007

; 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) ; ")"

page -439-

©MCS Electronics, 1995-2007

'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) ; ")"

page -440-

© MCS Electronics, 1995-2007

' ================ 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

page -441-

© MCS Electronics, 1995-2007

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:

' Generate start

I2cstart

code

' send address

I2cwbyte Ds1307w

I2cwbyte 0

' start address in

1307

 

I2cstart

' Generate start

code

' send address

I2cwbyte Ds1307r

I2crbyte _sec , Ack

 

page -442-

 

© MCS Electronics, 1995-2007

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

' send address

I2cwbyte Ds1307w

I2cwbyte 4

' starting address

in 1307

' Send Data to

I2cwbyte _day

SECONDS

' MINUTES

I2cwbyte _month

I2cwbyte _year

' Hours

I2cstop

 

Return

 

Settime:

_sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)

I2cstart

' Generate start

code

' send address

I2cwbyte Ds1307w

I2cwbyte 0

' starting address

in 1307

' Send Data to

I2cwbyte _sec

SECONDS

' MINUTES

I2cwbyte _min

I2cwbyte _hour

' Hours

I2cstop

 

Return

 

#endif

 

Weekdays:

Data "Monday" , "Tuesday" , "Wednesday" , "Thursday" , "Friday" , "Saturday" ,

"Sunday"

DBG

Action

Prints debug info to the hardware UART

Syntax

DBG

Remarks

See $DBG for more information

page -443-