View previous topic :: View next topic |
Author |
Message |
mmarlette
Joined: 30 Nov 2007 Posts: 311 Location: Delano, MN
|
Posted: Tue Apr 01, 2014 12:12 am Post subject: Config SubMode = New and Config Clock = User |
|
|
Can someone explain to me how to make the subject line work together?
Seems to be a chicken and egg scenario. All references must be defined before they are referenced per the help....Not quoting....
In the below code, the get/setdate/time are defined PRIOR to the CONFIG CLOCK. I will then get an assignment error on _SEC, _MIN because CONFIG CLOCK = USER hasn't be defined yet.
If I move the CONFIG CLOCK = USER to BEFORE the get/setdate/time routines, then I get errors that the GETDATETIME routine hasn't been defined yet.
How can I make this mode work with an external clock? This is just a test code to show the point. The SUBMODE = NEW has some very nice features that I would like to use but I am stuck ATM.
Please advise......seems like I am in the rinse cycle......
Code: |
'-------------------------------------------------------------------------------
' DS1307.BAS
' Shows how to use the ds1307 clock on the Arduino M2560. A timer is configured
' at a 1 second interval. The ISR will set a flag to allow the DS1307's
' getdatetime routine to be executed.
'
' It takes ~965uS to get the date/time when called.
'-------------------------------------------------------------------------------
$regfile = "m2560def.dat" ' specify the used micro
Config SubMode = new
$crystal = 16000000 ' used crystal frequency
$baud = 115200 ' use baud rate
$hwstack = 200
$swstack = 250
$framesize = 1000
$programmer=23 ' Define programmer as ARDUINO V2 (using stk500v2 protocol)
'$prog $fc,$c6,$df,$ff ' Lock Bits, Fuse Bits Low, Fuse Bits High, Fuse Bits Extended
'
Const False = 0
Const True = 1
'address of ds1307
Const Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1
'dim other needed variables
Dim Weekday As Byte
Dim lngTick as long ' one second tick timer counter
Dim booRTCupdate as boolean ' Flag to allow event to occur
Dim strTime As String * 8
'Dim bytStatus as byte
'
'called from CONFIG CLOCK = USER
'
Getdatetime:
'set PORTA.0
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)
'reset PORTA.0
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
$lib "i2c_twi.lbx" ' using hardware I2C/TWI
Config Sda = Portd.1 ' define pin names, scl and sda pins
Config Scl = Portd.0
Config Twi = 100000 ' CONFIG TWI will ENABLE the TWI master interface, 100KHZ
i2cinit ' initialize the I2C bus
Config Date = mdy , Separator = / ' configure the date format
config clock = user ' define USER clock, it dims date / time vars
' The USER must have the calls of settime, setdate, getdatetime
' to talk to the USER's hardware
'-----[ Output Timer ISR for Oscilloscope Check on Porta.0 ]-----------------
Config Porta.0 = Output '
Porta.0 = 1 ' LED off, active lo.
TickBit Alias Porta.0
'-----[ Setup Timer1 for Tick ISR off system XTAL]----------------------------
' Timer1 is used for Tick counter at 1Hz
Config Timer1 = Timer , Prescale = 1024 , Compare A = Disconnect , Clear Timer = 1
' crytal / prescale / x Hz = Compare1a val needed
' 18432000 / 1024 / 100(Hz) = 180
' 16000000 / 1024 / 1(Hz) = 15625
' 14745600 / 1024 / 1(Hz) = 14400
' 14745600 / 1024 / 100(Hz) = 144
' 7372800 / 1024 / 100(Hz) = 72
Compare1a = 15625
On Compare1a T1_TickCounter_ISR ' Define ISR Entry Point
Enable Timer1
Enable Compare1a
'-----[Serial Port(s)]--------------------------------------------------------
Config Com1 = 115200, Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com1:" For Binary As #1
Waitms 5
'
Enable Interrupts ' Using a timer to generate 1 second ISR interval
Print #1, "DS1307"
'Print #1, "Setting SQW bit on"
'I2cstart ' Generate start code
'I2cwbyte Ds1307w ' send address
'I2cwbyte 7 ' control register in 1307
'I2crbyte bytStatus, Ack ' read the status register first
'print #1, "DS1307 READ-status register=$"; hex(bytStatus)
'bytStatus = bytStatus and &h93 ' pass only used bits
'bytStatus = bytStatus or &h10 ' set SQWout on
'print #1, "DS1307 WRITE-status register=$"; hex(bytStatus)
'I2cstart ' Generate start code
'I2cwbyte Ds1307w ' send address
'I2cwbyte 7
'I2cwbyte bytStatus ' send to status register
'I2cstop ' 32.768KHZ clock on SQWout pin of DS1307
'
' Clear Vars
'
lngTick = 0
booRTCupdate = false
'
Do ' Main Loop
if booRTCupdate = true then
booRTCupdate = false
call GetDateTime ' read from RTC
strTime = Time(_sec) ' use system vars to create time string
'strDate = Date(_day) ' use system vars to create date string
Print #1, "Date : "; _Month;"/";_day;"/20";_year; " Time : "; strTime
endif
Loop
'------[ Timer ISR routine ]----------------------------------------------------
T1_TickCounter_ISR:
Incr lngTick ' inc event counter
Toggle TickBit ' allow visual on scope
booRTCupdate = true ' every tick, allow DS1307 RTC to read date/time
Return
'------------------------------------------------------------------------------
|
(BASCOM-AVR version : 2.0.7.7 ) |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5905 Location: Holland
|
Posted: Tue Apr 01, 2014 9:23 am Post subject: |
|
|
it is really simple. you are not using subs/functions.
have a look at the difference:
Code: | $regfile = "m2560def.dat" ' specify the used micro
Config SubMode = new
$crystal = 16000000 ' used crystal frequency
$baud = 115200 ' use baud rate
$hwstack = 200
$swstack = 250
$framesize = 1000
$programmer=23 ' Define programmer as ARDUINO V2 (using stk500v2 protocol)
'$prog $fc,$c6,$df,$ff ' Lock Bits, Fuse Bits Low, Fuse Bits High, Fuse Bits Extended
'
Const False = 0
Const True = 1
'address of ds1307
Const Ds1307w = &HD0 ' Addresses of Ds1307 clock
Const Ds1307r = &HD1
'dim other needed variables
Dim Weekday As Byte
Dim lngTick as long ' one second tick timer counter
Dim booRTCupdate as boolean ' Flag to allow event to occur
Dim strTime As String * 8
'Dim bytStatus as byte
'
'called from CONFIG CLOCK = USER
Config Date = mdy , Separator = / ' configure the date format
config clock = user ' define USER clock, it dims date / time vars
' The USER must have the calls of settime, setdate, getdatetime
' to talk to the USER's hardware
'
sub Getdatetime()
'set PORTA.0
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)
'reset PORTA.0
end sub
sub 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
end sub
sub 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
end sub
$lib "i2c_twi.lbx" ' using hardware I2C/TWI
Config Sda = Portd.1 ' define pin names, scl and sda pins
Config Scl = Portd.0
Config Twi = 100000 ' CONFIG TWI will ENABLE the TWI master interface, 100KHZ
i2cinit ' initialize the I2C bus
'-----[ Output Timer ISR for Oscilloscope Check on Porta.0 ]-----------------
Config Porta.0 = Output '
Porta.0 = 1 ' LED off, active lo.
TickBit Alias Porta.0
'-----[ Setup Timer1 for Tick ISR off system XTAL]----------------------------
' Timer1 is used for Tick counter at 1Hz
Config Timer1 = Timer , Prescale = 1024 , Compare A = Disconnect , Clear Timer = 1
' crytal / prescale / x Hz = Compare1a val needed
' 18432000 / 1024 / 100(Hz) = 180
' 16000000 / 1024 / 1(Hz) = 15625
' 14745600 / 1024 / 1(Hz) = 14400
' 14745600 / 1024 / 100(Hz) = 144
' 7372800 / 1024 / 100(Hz) = 72
Compare1a = 15625
On Compare1a T1_TickCounter_ISR ' Define ISR Entry Point
Enable Timer1
Enable Compare1a
'-----[Serial Port(s)]--------------------------------------------------------
Config Com1 = 115200, Synchrone = 0 , Parity = None , Stopbits = 1 , Databits = 8 , Clockpol = 0
Open "com1:" For Binary As #1
Waitms 5
'
Enable Interrupts ' Using a timer to generate 1 second ISR interval
Print #1, "DS1307"
'Print #1, "Setting SQW bit on"
'I2cstart ' Generate start code
'I2cwbyte Ds1307w ' send address
'I2cwbyte 7 ' control register in 1307
'I2crbyte bytStatus, Ack ' read the status register first
'print #1, "DS1307 READ-status register=$"; hex(bytStatus)
'bytStatus = bytStatus and &h93 ' pass only used bits
'bytStatus = bytStatus or &h10 ' set SQWout on
'print #1, "DS1307 WRITE-status register=$"; hex(bytStatus)
'I2cstart ' Generate start code
'I2cwbyte Ds1307w ' send address
'I2cwbyte 7
'I2cwbyte bytStatus ' send to status register
'I2cstop ' 32.768KHZ clock on SQWout pin of DS1307
'
' Clear Vars
'
lngTick = 0
booRTCupdate = false
'
Do ' Main Loop
if booRTCupdate = true then
booRTCupdate = false
call GetDateTime ' read from RTC
strTime = Time(_sec) ' use system vars to create time string
'strDate = Date(_day) ' use system vars to create date string
Print #1, "Date : "; _Month;"/";_day;"/20";_year; " Time : "; strTime
endif
Loop
'------[ Timer ISR routine ]----------------------------------------------------
T1_TickCounter_ISR:
Incr lngTick ' inc event counter
Toggle TickBit ' allow visual on scope
booRTCupdate = true ' every tick, allow DS1307 RTC to read date/time
Return
|
_________________ Mark |
|
Back to top |
|
|
mmarlette
Joined: 30 Nov 2007 Posts: 311 Location: Delano, MN
|
Posted: Tue Apr 01, 2014 2:07 pm Post subject: |
|
|
Uggh, the joys of creating test examples....My DS1307.inc file is as you described.
I created another test code module with your code with subs defined as you made in the example above and compiled.
I still get an error of 111 on line 131 sub or function not declared [GETDATETIME] in .......path info......
I hope this isn't another silly mistake on my part. Not a newbie with BASCOM, but that was embarrassing.
It ONLY generates an error if you click on the check syntax(Ctl F7) icon. If you click on Compile Program(F7) icon, then NO ERROR is reported. I always check syntax first....Thus the problem here with your example.
Please advise.
Can you add the copy function to the Error output list box? Nice to copy that info at times.
Thanks Mark!
Regards,
Mark |
|
Back to top |
|
|
mmarlette
Joined: 30 Nov 2007 Posts: 311 Location: Delano, MN
|
Posted: Tue Apr 01, 2014 2:21 pm Post subject: |
|
|
I went back to some code that I tried to port over the the CONFIG SUBMODE=NEW format before and gave up on due to so many errors with using the check syntax, never thought of trying to push the compile icon.
It compiled the first time using the Compile program icon after I made the adjustments as listed in the help file.
Using the check syntax button produces MANY errors on the same code..
So there is something different about these two buttons on how they compile the program. |
|
Back to top |
|
|
albertsm
Joined: 09 Apr 2004 Posts: 5905 Location: Holland
|
Posted: Tue Apr 01, 2014 8:46 pm Post subject: |
|
|
ok, you meant syntax check. that is indeed different. i fixed this problem some weeks ago. it was also reported on this forum. if you want you can download a beta from the SLA area (register.mcselec.com) _________________ Mark |
|
Back to top |
|
|
mmarlette
Joined: 30 Nov 2007 Posts: 311 Location: Delano, MN
|
Posted: Tue Apr 01, 2014 11:36 pm Post subject: |
|
|
Mark-
I went and updated to the beta version and all is fine now.
I check the forums daily, several times a day but I missed the check syntax update.
I did see the single type lib update thread.
All good, thanks!!!!! |
|
Back to top |
|
|
mmarlette
Joined: 30 Nov 2007 Posts: 311 Location: Delano, MN
|
Posted: Mon Dec 08, 2014 4:51 pm Post subject: |
|
|
Mark,
In your response code above, showing the config sub mode = new use of getdatetime, setdate and settime.
If I add this code prior to the main loop
Code: |
lngTick = 0
booRTCupdate = false
date$ = "12/05/14"
time$ = "14:00:00"
|
I get the errors on compile that setdate / settime labels are not found.
I even added labels to the subs but still errors.
Code: |
sub Setdate
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
end sub
sub Settime
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
end sub
|
The only way I can get this method to compile is to move the setdate / settime code to after the ISR label and remove the setdate / settime from being sub modules(IE: add label, remove sub / end sub, add return. GetDateTime of course is fine as the system doesn't call that routine, I do.
Please advise what the intended method is suppose to be or if I am trying to cross intentions of the compiler.
It appears that the compiler can't see the setdate / settime when the defined label is in a sub.
Regards,
Mark |
|
Back to top |
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum You cannot attach files in this forum You cannot download files in this forum
|
|