|
|
View previous topic :: View next topic |
Author |
Message |
jgschmidt
Joined: 03 Dec 2008 Posts: 184 Location: Gresham, OR USA
|
24F16KA102 and RTCC - used DS3231 instead. |
Posted: Thu May 15, 2014 6:40 am |
|
|
Hi,
I'm having some trouble getting the RTCC on the 24F16KA102 to run.
Compiler version is PCWHD 4.135.
32K clock crystal and matching caps are connected at B4 and A4
The minimalist code is below. Heartbeat and debug message display fine. All I get back from reading the time is "00/00/2000 00:00:01".
My attempt to set the time isn't working and the clock is not running.
Am I perhaps missing something in the fuses?
Code: | #case
// 16KA102Test.c Test components
//
// 2014.05.14 - Jurgen G Schmidt www.jgscraft.com
//
// Compiler: CCS PCWH 4.135
// Programmer: PICkit2
//
// PB1 MCLR/RA5 - 1 28 - Vdd +
// PB2 RA0 - 2 27 - Vss -
// RA1 - 3 26 - RB15 HB LED
// PGD1/RB0 - 4 25 - RB14
// PGC1/RB1 - 5 24 - RB13/SDO1 LCD
// DTS RX1/RB2 - 6 23 - RB12
// RB3 - 7 22 - RB11/SCK1 LCD
// - Vss - 8 21 - RB10/SDI1
// OSCI/RA2 - 9 20 - RA6
// OSCO/RA3 - 10 19 - RA7
// XTAL SOSCI/RB4 - 11 18 - RB9/SDA1
// XTAL SOSCO/RA4 - 12 17 - RB8/SCL1
// + Vdd - 13 16 - RB7/TX1 DTS
// RB5 - 14 15 - RB6 JGSDBG
//
//-----------------------------------------------------------------------------
#include <24f16ka102.h>
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOPUT //No Power Up Timer
#FUSES NOMCLR //Engages weak pullup
#FUSES NOBROWNOUT //No brownout reset
#FUSES ICSP1
#FUSES RTCCK_SOSC // use SOSC as RTCC clock
#use delay(internal=32M)
// Serial debug data via SW. INVERT so can connect directly to legacy PC serial port
#use rs232( BAUD=9600, XMIT=PIN_B6, INVERT, STREAM=JGSDBG )
#use rs232( BAUD=2400, RCV=PIN_B2, XMIT=PIN_B7, STREAM=JGSDAT, ERRORS )
#define PIN_LED PIN_B15 // heartbeat LED
#define PIN_DBG PIN_B6 // SW Serial out
typedef unsigned int8 UINT8;
typedef unsigned int16 UINT16;
//-----------------------------------------------------------------------------
void main()
{
rtc_time_t write_clock, read_clock;
setup_adc_ports( NO_ANALOGS); // ALWAYS, Always, always do this !!!
delay_ms( 200 ); // allow serial port to warm up :)
fprintf(JGSDBG,"\r\n%s %s %s\r\n",__FILE__, __DATE__, __TIME__);
setup_rtc(RTC_ENABLE | RTC_OUTPUT_SECONDS, 0x00);
write_clock.tm_year=0x14;
write_clock.tm_mon=5;
write_clock.tm_mday=0x15;
write_clock.tm_wday=5;
write_clock.tm_hour=0x12;
write_clock.tm_min=0x15;
write_clock.tm_sec=0;
rtc_write(&write_clock); //writes new clock setting to RTCC
while( TRUE ){
output_toggle( PIN_LED );
rtc_read(&read_clock); //reads clock value from RTCC
fprintf(JGSDBG,"\r%02u/%02u/20%02u %02u:%02u:%02u",
read_clock.tm_mon,read_clock.tm_mday,read_clock.tm_year,read_clock.tm_hour,read_clock.tm_min,read_clock.tm_sec);
delay_ms( 10000 );
}
}
//-----------------------------------------------------------------------------
//------ end of 16KA102Test.c ------ |
Thanks for any help. _________________ Jürgen
www.jgscraft.com
Last edited by jgschmidt on Sat May 17, 2014 8:56 am; edited 1 time in total |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Fri May 16, 2014 1:32 am |
|
|
Built-in rtcc functions of V4.135 are apparently faulty. At least the unlock function in setup_rtc() and rtc_write() uses a wrong NVMKEY address.
Manual unlock before calling the functions might work. Or use a newer PCD version, e.g. V4.140. |
|
|
jgschmidt
Joined: 03 Dec 2008 Posts: 184 Location: Gresham, OR USA
|
No luck. |
Posted: Sat May 17, 2014 8:53 am |
|
|
After spending 2 days looking at the 24F reference, working with sample code from the XLP 16-bit kit and comparing CCS asm code with Microchip's, I've given up.
This is not enough reason to upgrade compiler versions yet - I just thought I'd try something new with a pretty well-established chip. I didn't get many hits on RTCC overall in the forum so maybe that's a hint not to use it. Sigh...
It's back to the trusty DS3231 and M41T81SMY6F. _________________ Jürgen
www.jgscraft.com |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sat May 17, 2014 12:21 pm |
|
|
The generated code of V4.135 is
Code: | .................... setup_rtc(RTC_ENABLE | RTC_OUTPUT_SECONDS, 0x00);
044A: MOV #0,W1
044C: MOV #55,W2
044E: MOV W2,[W1]
0450: MOV #AA,W3
0452: MOV W3,[W1]
0454: BSET.B 627.5
0456: MOV #742,W1
0458: MOV #46,W2
045A: MOV #57,W3
045C: MOV.B W2L,[W1]
045E: MOV.B W3L,[W1]
0460: BSET.B 742.1
0462: MOV #8400,W4
0464: MOV W4,626
0466: BSET.B 2FC.1
0468: BCLR.B 627.5 |
The error is in the first instruction which should be
Likewise in rtc_write(). |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9219 Location: Greensville,Ontario
|
|
Posted: Sat May 17, 2014 2:11 pm |
|
|
There's a LOT to said about using 'tried and true' hardware and software !
The latest stuff doesn't necessarily be the old stuff !! |
|
|
jgschmidt
Joined: 03 Dec 2008 Posts: 184 Location: Gresham, OR USA
|
|
Posted: Sat May 17, 2014 2:45 pm |
|
|
Yes, FvM, I noticed that. I tried to write my own C and ASM code to replace the CCS functions - no luck. Other forums also mention the possibility that the clock crystal is sensitive to board layout and so may not start on my proto board. Echoing T, I'm sticking with what is known to work. _________________ Jürgen
www.jgscraft.com |
|
|
FvM
Joined: 27 Aug 2008 Posts: 2337 Location: Germany
|
|
Posted: Sat May 17, 2014 3:19 pm |
|
|
Of course there can be other than software related problems. But not reading back the written RTC values refers to software issue.
As a workaround for the said built-in function bug, you can set RTCWREN manually before calling setup_rtc() or rtc_write()
Code: | #word NVMKEY = 0x766
#word RCFGCAL = 0x626
#bit RTCWREN = RCFGCAL.13
...
#asm
DISI #7
#endasm
NVMKEY = 0x55;
NVMKEY = 0xaa;
RTCWREN = 1;
setup_rtc(...); |
|
|
|
jgschmidt
Joined: 03 Dec 2008 Posts: 184 Location: Gresham, OR USA
|
|
Posted: Sat May 17, 2014 8:10 pm |
|
|
Thanks for that - I'll try it out. _________________ Jürgen
www.jgscraft.com |
|
|
jgschmidt
Joined: 03 Dec 2008 Posts: 184 Location: Gresham, OR USA
|
Some Progress... |
Posted: Sat May 17, 2014 10:57 pm |
|
|
Thanks, that code worked - I can update the registers. And the clock is running. But I'm running into the hardware trouble mentioned by others...
The RTCC clock is running and when I check the SOSCO line with my scope it's right at 32767Hz. However, the clock is running about 2 to 3 times fast. (1 minute goes by in 25 seconds.) I don't have the necessary skills to resolve that. In any case, here's the currently running code for anyone else who wants to experiment:
Code: | #case
// 16KA102Test.c Test components
//
//-----------------------------------------------------------------------------
#include <24f16ka102.h>
#FUSES NOOSCIO // clock output in OSCO to verify clock settings with scope
#FUSES NOWDT //No Watch Dog Timer
#FUSES NOPUT //No Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES ICSP1
#FUSES RTCCK_SOSC // use SOSC as RTCC clock
#use delay(internal=32M)
// Serial debug data via SW. INVERT so can connect directly to legacy PC serial port
#use rs232( BAUD=9600, XMIT=PIN_B6, INVERT, STREAM=JGSDBG )
#define PIN_LED PIN_A0 // heartbeat LED
#define PIN_DBG PIN_B6 // SW Serial out
#word NVMKEY = 0x766
#word RCFGCAL = 0x626
#bit RTCWREN = RCFGCAL.13
//-----------------------------------------------------------------------------
void main()
{
rtc_time_t write_clock, read_clock;
setup_adc_ports( NO_ANALOGS); // ALWAYS, Always, always do this !!!
delay_ms( 200 ); // allow serial port to warm up :)
fprintf(JGSDBG,"\r\n%s %s %s\r\n",__FILE__, __DATE__, __TIME__);
delay_ms( 200 ); // allow serial port to warm up :)
#asm
DISI #7
#endasm
NVMKEY = 0x55;
NVMKEY = 0xaa;
RTCWREN = 1;
setup_rtc(RTC_ENABLE | RTC_OUTPUT_SECONDS, 0);
write_clock.tm_year=0x09;
write_clock.tm_mon=0x08;
write_clock.tm_mday=0x07;
write_clock.tm_wday=0x05;
write_clock.tm_hour=0x06;
write_clock.tm_min=0x05;
write_clock.tm_sec=4;
#asm
DISI #7
#endasm
NVMKEY = 0x55;
NVMKEY = 0xaa;
RTCWREN = 1;
rtc_write(&write_clock); //writes new clock setting to RTCC
while( TRUE ){
output_toggle( PIN_LED );
rtc_read(&read_clock); //reads clock value from RTCC
fprintf(JGSDBG,"\r\n>>%02u/%02u/20%02u %02u:%02u:%02u",read_clock.tm_mon,read_clock.tm_mday,read_clock.tm_year,read_clock.tm_hour,read_clock.tm_min,read_clock.tm_sec);
delay_ms( 1000 );
}
}
//------------------------------------------------------------------------------
//------ end of 16KA102Test.c ------ |
Cheers, _________________ Jürgen
www.jgscraft.com |
|
|
|
|
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
|
Powered by phpBB © 2001, 2005 phpBB Group
|