|
|
View previous topic :: View next topic |
Author |
Message |
nuclear__
Joined: 24 Jan 2015 Posts: 63
|
rtcc read variables |
Posted: Sat Nov 14, 2020 12:39 pm |
|
|
I use 18f47j53 rtcc following the example and its working correct. I can read and print the date as it should. However when i store each byte to ext. ram and then try to read, i get strange values.
Code: |
writeByte24AA512(0x06,log_write_address,read_clock.tm_year);
// the same for mon,mday etc..
printf(usb_cdc_putc,"\n\r20%02u/%02u/%02u %02u:%02u:%02u",readByte24AA512(0x06,num*10),readByte24AA512(0x06,num*10+1),readByte24AA512(0x06,num*10+2),readByte24AA512(0x06,num*10+3),readByte24AA512(0x06,num*10+4),readByte24AA512(0x06,num*10+5));
|
Don't mind about addresses . They are ok.
That's what i get on terminal for example for date:
2020/11/14 20:32:10
20201/96/255 131:00:00
and values on memory
log 10: 201
log 11: 96
log 12: 255
log 13: 131
log 14: 0
log 15: 0
All values look int8, so where could the problem be? |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
Re: rtcc read variables |
Posted: Sat Nov 14, 2020 1:55 pm |
|
|
nuclear__ wrote: |
writeByte24AA512(0x06, log_write_address,read_clock.tm_year);
readByte24AA512(0x06, num*10),
Don't mind about addresses . They are ok.
|
Apparently you are using this driver here, in the Code Library:
http://www.ccsinfo.com/forum/viewtopic.php?t=23390
Where do you get that 0x06 is the i2c slave address for the 24AA512 ?
It is not. The base address is 0xA0. It says at the top of the driver:
Code: |
#define baseAddress24AA512 0xA0
|
The 24AA512 data sheet is here:
http://ww1.microchip.com/downloads/en/DeviceDoc/21754M.pdf
Look at page 9. It says:
Quote: |
5.0 Device Addressing
The control byte consists of a 4-bit control code; for the
24XX512 this is set as ‘1010’ binary for read and write
operations. The next three bits of the control byte are
the Chip Select bits (A2, A1 and A0). |
'1010' is 0xA, and if the next 3 address bits are tied to ground, then
in 8-bit i2c address format, this gives 0xA0 for the device address.
Last edited by PCM programmer on Sat Nov 14, 2020 11:47 pm; edited 1 time in total |
|
|
nuclear__
Joined: 24 Jan 2015 Posts: 63
|
|
Posted: Sat Nov 14, 2020 2:56 pm |
|
|
I'm confused.
You are right, I made this pcb years ago and now i have some time to play. I have address pins tied to Vdd. So base address should be 10101110 or 0xAE . However after changing all 06 with AE memory verification fails. It's working with 06. I can't remember why i put 06.........
I will change it again to 06 and search for that later. It's working, i can write and read bytes fine! Any suggestion for rtcc? I can see it has nothing to do with memory chip.
Having year 2000, even when i do:
Code: | printf(usb_cdc_putc, "%u", read_clock.tm_year); |
I get 198.
If i try %Lu (just in case) compiler finds it invalid, so it's a byte. |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Nov 15, 2020 1:06 am |
|
|
I tested it in hardware and it worked.
I used an 18F27J53 with CCS vs. 5.096. The program shown below
displayed the following on TeraTerm:
Quote: | 2020/11/14 20:54:46 |
Test program:
Code: |
#include <18F27J53.h>
#fuses INTRC_IO, NOWDT
#fuses SOSC_HIGH, RTCOSC_T1
#use delay(clock=4M)
#use rs232(baud=9600, UART1, ERRORS)
rtc_time_t Initialize_Time;
rtc_time_t read_clock;
//==============================
void main()
{
setup_rtc(RTC_ENABLE, 0);
Initialize_Time.tm_year = 20; // 2020
Initialize_Time.tm_mon = 11; // November
Initialize_Time.tm_mday = 14; // 14th
Initialize_Time.tm_wday = 6; // Saturday
Initialize_Time.tm_hour = 20; // 8 pm
Initialize_Time.tm_min = 54; // 54 minutes
Initialize_Time.tm_sec = 46; // 46 seconds
rtc_write(&Initialize_Time);
rtc_read(&read_clock);
printf("\n\r20%02u/%02u/%02u %02u:%02u:%02u",
read_clock.tm_year,
read_clock.tm_mon,
read_clock.tm_mday,
read_clock.tm_hour,
read_clock.tm_min,
read_clock.tm_sec);
while(TRUE);
}
|
If you can't make it work, post your compiler version and post your
test program.
Last edited by PCM programmer on Mon Nov 16, 2020 11:15 pm; edited 1 time in total |
|
|
nuclear__
Joined: 24 Jan 2015 Posts: 63
|
|
Posted: Sun Nov 15, 2020 2:56 am |
|
|
Hi
This works. It doesn't work when i do that from a function.
if printf is in main its ok.
Here its not
Code: |
void write_log()
{
rtc_time_t write_clock, read_clock;
get_time();
log_write_address = readByte24AA512(0x06,0);
writeByte24AA512(0x06,0,log_write_address+10);
printf(usb_cdc_putc,"\n\ryear %u \r\n",read_clock.tm_year);
writeByte24AA512(0x06,log_write_address,read_clock.tm_year);
writeByte24AA512(0x06,log_write_address+1,read_clock.tm_mon);
writeByte24AA512(0x06,log_write_address+2,read_clock.tm_mday);
writeByte24AA512(0x06,log_write_address+3,read_clock.tm_hour);
writeByte24AA512(0x06,log_write_address+4,read_clock.tm_min);
writeByte24AA512(0x06,log_write_address+5,read_clock.tm_sec);
printf(usb_cdc_putc,"\n\r20%02u/%02u/%02u %02u:%02u:%02u",read_clock.tm_year,read_clock.tm_mon,read_clock.tm_mday,read_clock.tm_hour,read_clock.tm_min,read_clock.tm_sec);
}
void get_time()
{
rtc_time_t write_clock, read_clock;
rtc_read(&read_clock);
printf(usb_cdc_putc,"\n\r20%02u/%02u/%02u %02u:%02u:%02u",read_clock.tm_year,read_clock.tm_mon,read_clock.tm_mday,read_clock.tm_hour,read_clock.tm_min,read_clock.tm_sec);
}
void main()
........
rtc_time_t write_clock, read_clock;
setup_rtc(RTC_ENABLE,127); //enables internal RTCC
rtc_read(&read_clock); //reads clock value from RTCC
WHILE(TRUE)
{
if (timer0==0)
{
rtc_read(&read_clock);
get_time();
}
}
|
So i should first understand some critical things . Its difficult to find in datasheet how this works
rtc_time_t write_clock, read_clock;
probably replicating in function write_log() is fault while in get_time is not.
Could you please explain?
v5.046 |
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Sun Nov 15, 2020 3:14 am |
|
|
Your get_time() function loads the time into a read_clock structure
that is local to the get_time() function.
As soon as that function exits, that structure goes bye-bye.
You can't access it outside of the get_time() function.
Look up the difference between local and global variables. |
|
|
nuclear__
Joined: 24 Jan 2015 Posts: 63
|
|
Posted: Sun Nov 15, 2020 3:51 am |
|
|
I was aware of differences and i always try to have them global since optimization is not my concern. Now you mention i understood that
rtc_time_t is a type of variable. Its working now.
Thank you !
i will try to make them global too. |
|
|
|
|
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
|