|
|
View previous topic :: View next topic |
Author |
Message |
lucasromeiro
Joined: 27 Mar 2010 Posts: 167
|
Help ! 18f67k22 RTC |
Posted: Tue Nov 20, 2012 1:21 pm |
|
|
Hello everybody,
I have a pic 18f67k22, using the compiler 4128.
I'm not having success when using the internal clock RTC with the pic, because I have no time accuracy.
What occurs:
I put it to count 1 in 1 second and will accumulate, but by passing 1 minute, he told the truth 56 seconds.
I'm losing a lot of precision, because in 15 minutes already lost 1 minute. It is very wrong!
I tried changing the pic to see if the problem was in the pic and the other gave the same error, but not delayed 4 seconds and said yes 4 seconds.
Maybe my RTC needs a calibration or configuration, maybe FUSE, do not know for sure.
Could you help me?
If someone can post this code that is simple to help me. I think I am missing in configuration or calibration, not sure.
I am now without the code, was at work.
Hug everyone |
|
|
temtronic
Joined: 01 Jul 2010 Posts: 9225 Location: Greensville,Ontario
|
|
Posted: Tue Nov 20, 2012 2:08 pm |
|
|
Timing problems can occour due to board layout, wrong xtal selection, wrong cap values, changes in temperature, humidity etc. Even the Vcc ( 5 v vs 3 v) can affect the overall timing as well as current 'surges' from other sources.
Something to consider in the overall project. The PIC must have battery backup and some 'failsafe' code/hardware should primary power be lost.
Using an RTC chip like the DS1307 eliminates 99% of the headaches. Yes, costs a couple of dollars but then what is YOUR time worth?
Other benefits to a hardware RTC include an easy interrupt (say 1Hz) AND a few bytes of CMOS RAM (scratchpad) to store important data when main power fails (it will......) and a LOT less code for 'timekeeping', freeing up codespace for other functions.
hth
jay |
|
|
lucasromeiro
Joined: 27 Mar 2010 Posts: 167
|
|
Posted: Tue Nov 20, 2012 2:16 pm |
|
|
temtronic wrote: | Timing problems can occour due to board layout, wrong xtal selection, wrong cap values, changes in temperature, humidity etc. Even the Vcc ( 5 v vs 3 v) can affect the overall timing as well as current 'surges' from other sources.
Something to consider in the overall project. The PIC must have battery backup and some 'failsafe' code/hardware should primary power be lost.
Using an RTC chip like the DS1307 eliminates 99% of the headaches. Yes, costs a couple of dollars but then what is YOUR time worth?
Other benefits to a hardware RTC include an easy interrupt (say 1Hz) AND a few bytes of CMOS RAM (scratchpad) to store important data when main power fails (it will......) and a LOT less code for 'timekeeping', freeing up codespace for other functions.
hth
jay |
Thanks for the tips!
But I have to use the internal RTC in this project.
It makes all the difference for me, is something commercial pos. and have to reduce cost and size.
I understand it has several things that can interfere with the accuracy of the timer.
but how could I cntrolar these variables?
I believe that even with calibration or configuration problem, because the error is repeated forever.
I'll check these variables as external interference, voltage drop etc, but I have to feed it with 5v for reasons of design.
Could you help me?
a code simple calibration and configuration that can help me.
never done it as I could be missing this point.
Thanks to all |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Tue Nov 20, 2012 4:46 pm |
|
|
May seem like a silly question but:-
Are you using a crystal or the internal oscillator for cost reasons?
Mike |
|
|
lucasromeiro
Joined: 27 Mar 2010 Posts: 167
|
|
Posted: Tue Nov 20, 2012 4:58 pm |
|
|
Mike Walne wrote: | May seem like a silly question but:-
Are you using a crystal or the internal oscillator for cost reasons?
Mike |
The project may admit an external crystal case solves the problem.
But we can not use an external RTC, project requirement.
The clock for the RTC internal clock can be internal or external, but prefer the internal clock.
We try to use the clock external to try to resolve the problem, but could not make it work. |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Wed Nov 21, 2012 3:00 am |
|
|
lucasromeiro wrote: | Mike Walne wrote: | May seem like a silly question but:-
Are you using a crystal or the internal oscillator for cost reasons?
Mike |
The project may admit an external crystal case solves the problem.
But we can not use an external RTC, project requirement.
The clock for the RTC internal clock can be internal or external, but prefer the internal clock.
We try to use the clock external to try to resolve the problem, but could not make it work. |
The internal LFINTOSC clock will _never_ be remotely 'accurate'....
It is only quoted as having +/-15% accuracy. It's timing also drifts with temperature.
You can adjust an offset value in the RTCC, telling it to add pulses every second, or skip pulses every second, to tune the timing to be 'close', but this needs to be done for every chip (the LFINTOSC, is _not_ supplied with a calibration value from the factory, that can be accessed via the fuses), and will still give a timing that will change be several minutes per day if the temperature shifts...
You access this with:
Code: |
signed int8 RTCCAL;
#byte RTCCAL=(getenv("SFR:RTCCAL"))
//Then
RTCCAL=1 to 127 gives +ve adjustment
RTCCAL=-1 to -128 gives -ve adjustment
|
The adjustment is in added/subtracted RTC clocks/minute, in steps of four, from 0 to 508 positive, and 0 to 512 negative.
You can also access this in the setup_rtc function, by adding the value to the command, so:
Code: |
setup_rtc(RTC_ENABLE | RTC_OUTPUT_SECONDS, 05);
|
Will give 20 pulses per minute added to the RTC count.
Realistically to get anything approaching 'accuracy', you must use the external oscillator.
This requires a watch crystal between SOSCO and SOSCI. Suitable loading capacitors on this. Enabling SOSC with:
setup_oscillator(OSC_SOSC_ON);
and selecting the RTC to run from the secondary oscillator (RTCOSC_T1 fuse).
I'm afraid the internal LFINTOSC, is not the tool to use if you want anything approaching an accurate RTCC....
Best Wishes |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Wed Nov 21, 2012 3:13 am |
|
|
OK. So it wasn't a silly question (Should have been).
Mike |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Wed Nov 21, 2012 4:11 am |
|
|
No, it definately wasn't. Also though it is a 'read the data sheet' moment for the original poster.
Best Wishes |
|
|
lucasromeiro
Joined: 27 Mar 2010 Posts: 167
|
|
Posted: Wed Nov 21, 2012 4:44 am |
|
|
Ttelmah wrote: | lucasromeiro wrote: | Mike Walne wrote: | May seem like a silly question but:-
Are you using a crystal or the internal oscillator for cost reasons?
Mike |
The project may admit an external crystal case solves the problem.
But we can not use an external RTC, project requirement.
The clock for the RTC internal clock can be internal or external, but prefer the internal clock.
We try to use the clock external to try to resolve the problem, but could not make it work. |
The internal LFINTOSC clock will _never_ be remotely 'accurate'....
It is only quoted as having +/-15% accuracy. It's timing also drifts with temperature.
You can adjust an offset value in the RTCC, telling it to add pulses every second, or skip pulses every second, to tune the timing to be 'close', but this needs to be done for every chip (the LFINTOSC, is _not_ supplied with a calibration value from the factory, that can be accessed via the fuses), and will still give a timing that will change be several minutes per day if the temperature shifts...
You access this with:
Code: |
signed int8 RTCCAL;
#byte RTCCAL=(getenv("SFR:RTCCAL"))
//Then
RTCCAL=1 to 127 gives +ve adjustment
RTCCAL=-1 to -128 gives -ve adjustment
|
The adjustment is in added/subtracted RTC clocks/minute, in steps of four, from 0 to 508 positive, and 0 to 512 negative.
You can also access this in the setup_rtc function, by adding the value to the command, so:
Code: |
setup_rtc(RTC_ENABLE | RTC_OUTPUT_SECONDS, 05);
|
Will give 20 pulses per minute added to the RTC count.
Realistically to get anything approaching 'accuracy', you must use the external oscillator.
This requires a watch crystal between SOSCO and SOSCI. Suitable loading capacitors on this. Enabling SOSC with:
setup_oscillator(OSC_SOSC_ON);
and selecting the RTC to run from the secondary oscillator (RTCOSC_T1 fuse).
I'm afraid the internal LFINTOSC, is not the tool to use if you want anything approaching an accurate RTCC....
Best Wishes |
Good morning Ttelmah,
Thanks for explanations.
Understand the question of accuracy in using the internal clock.
could you help me to configure the RTC to work with external clock?
Shall not know how to do this configuration.
Another thing: what should I use crystal for the RTC external?
What capacitors?
Thanks for everything, is helping me a lot!
Hugs |
|
|
Mike Walne
Joined: 19 Feb 2004 Posts: 1785 Location: Boston Spa UK
|
|
Posted: Wed Nov 21, 2012 5:08 am |
|
|
The microchip data sheet has ALL the information you need for whichever oscillator you choose.
Mike |
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Wed Nov 21, 2012 8:00 am |
|
|
and of course the data sheet for whatever crystal you use. Key thing that is often 'missed', is that the two capacitors used in the crystal circuit, are each paralleled by the pin and track capacitances, and are then seen _in series_ as the crystal load.
I have already posted what is needed to use the external crystal.
Best Wishes |
|
|
lucasromeiro
Joined: 27 Mar 2010 Posts: 167
|
|
Posted: Wed Nov 21, 2012 9:51 am |
|
|
Ttelmah wrote: | and of course the data sheet for whatever crystal you use. Key thing that is often 'missed', is that the two capacitors used in the crystal circuit, are each paralleled by the pin and track capacitances, and are then seen _in series_ as the crystal load.
I have already posted what is needed to use the external crystal.
Best Wishes |
You refer to this configuration crystal?
http://destro.hostpo.net/images_projetos/uc_8051-basic-6.png
I just need to turn this way and configure the lines that you have posted?
thank you
|
|
|
Ttelmah
Joined: 11 Mar 2010 Posts: 19504
|
|
Posted: Wed Nov 21, 2012 10:15 am |
|
|
The RTC, uses the _secondary oscillator_. On pins 29, and 30.
You need to identify a 32KHz watch crystal that meets the accuracy you require, then get _it's_ data sheet, and from the design of your board, calculate the track capacitance, add the PIC pin capacitance, and calculate C1, and C2, to give the loading your crystal requires.
It is _all_ down to reading data sheets, as Mike says. They also have application notes explaining how best to layout the tracks round the crystal pins, and things to avoid. |
|
|
lucasromeiro
Joined: 27 Mar 2010 Posts: 167
|
|
Posted: Wed Nov 21, 2012 12:45 pm |
|
|
Ttelmah wrote: | The RTC, uses the _secondary oscillator_. On pins 29, and 30.
You need to identify a 32KHz watch crystal that meets the accuracy you require, then get _it's_ data sheet, and from the design of your board, calculate the track capacitance, add the PIC pin capacitance, and calculate C1, and C2, to give the loading your crystal requires.
It is _all_ down to reading data sheets, as Mike says. They also have application notes explaining how best to layout the tracks round the crystal pins, and things to avoid. |
hello,
i use this configuration, but dont work:
Code: |
#FUSES RTCOSC_T1
setup_rtc(RTC_ENABLE|RTC_OUTPUT_SOURCE,0);
//setup_oscillator(OSC_SOSC_ON);
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16); //Incremento em 210mS
//setup_timer_1(T1_DISABLED); //Habilita o clock do rtcc
// setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_ENABLE_SOSC); //Habilita o clock do rtcc
setup_timer_1(T1_ENABLE_SOSC);
setup_timer_2(T2_DIV_BY_4,249,5); //Incremento em 1.0mS
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_timer_4(T4_DISABLED,0,1);
|
|
|
|
lucasromeiro
Joined: 27 Mar 2010 Posts: 167
|
CODE |
Posted: Wed Nov 21, 2012 1:27 pm |
|
|
Code: |
//Parâmetros Gerais
setup_wdt(WDT_OFF);
setup_ccp1(CCP_OFF);
setup_low_volt_detect(FALSE);
//Parâmetros dos Timers
setup_timer_0(RTCC_INTERNAL|RTCC_DIV_16); //Incremento em 210mS
//setup_timer_1(T1_DISABLED); //Habilita o clock do rtcc
setup_timer_1(T1_EXTERNAL|T1_DIV_BY_1|T1_ENABLE_SOSC); //Habilita o clock do rtcc
//setup_timer_1(T1_ENABLE_SOSC);
setup_timer_2(T2_DIV_BY_4,249,5); //Incremento em 1.0mS
setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
setup_timer_4(T4_DISABLED,0,1);
//Parâmetros dos Display LCD
lcd_init();
//Parâmetros da Comunicação SPI
setup_spi2(SPI_SS_DISABLED);
//Parâmetros das Interrupções
//enable_interrupts(INT_RTCC); // Interrupção Serial
//enable_interrupts(INT_TIMER0); // Incremento a cada 210 mS
Parametro_Interrupcoes_RDA=0;
Parametro_Interrupcoes_RDA2=0;
enable_interrupts(INT_RDA);
//enable_interrupts(INT_RDA2);
enable_interrupts(GLOBAL);
//Parâmetros das Portas Digitais
set_tris_b(0b10111100);
set_tris_c(0b10111001);
set_tris_d(0b10110100);
set_tris_e(0b10000000);
Make_All_Pins_Digital();
//Parâmetros das Portas Analógicas
setup_adc_ports(sAN0|VSS_VDD);
setup_adc(ADC_CLOCK_INTERNAL|ADC_TAD_MUL_0);
set_adc_channel(0);
delay_us(10);
//Bloco de Flags das Interrupções
Parametro_Interrupcoes_RDA=0;
Parametro_Interrupcoes_RDA2=0;
Parametro_Interrupcoes_TIMER0=0;
//Bloco de LED das Interrupções
output_low(LED_Alarme);
output_low(LED_Serial);
//Configuração do RTCC
setup_rtc(RTC_ENABLE|RTC_OUTPUT_SOURCE,0); //enables internal RTCC
//setup_oscillator(OSC_SOSC_ON);
#include <18F67K22.h>
#device adc=10
#FUSES NOWDT //No Watch Dog Timer
#FUSES WDT128 //Watch Dog Timer uses 1:128 Postscale
#FUSES VREGSLEEP //Ultra low-power regulator is disabled
#FUSES NOXINST //Extended set extension and Indexed Addressing mode disabled (Legacy mode)
#FUSES HSH //High speed Osc, high power 16MHz-25MHz
#FUSES NOPLLEN //4X HW PLL disabled, 4X PLL enabled in software
#FUSES FCMEN //Fail-safe clock monitor enabled
#FUSES IESO //Internal External Switch Over mode enabled
#FUSES PUT //Power Up Timer
#FUSES NOBROWNOUT //No brownout reset
#FUSES BORV18 //Brownout reset at 1.8V
#FUSES ZPBORM //Zero-Power BOR
#FUSES WDT_NOSLEEP //Watch Dog Timer, disabled during SLEEP
#FUSES WDT1048576 //Watch Dog Timer uses 1:1048576 Postscale
#FUSES MSSPMSK7 //MSSP uses 7 bit Masking mode
#FUSES STVREN //Stack full/underflow will cause reset
#FUSES BBSIZ2K //2K words Boot Block size
#FUSES MCLR //Master Clear pin enabled
#FUSES NODEBUG //No Debug mode for ICD
#FUSES NOPROTECT //Code not protected from reading
#FUSES NOCPB //No Boot Block code protection
#FUSES NOCPD //No EE protection
#FUSES NOWRT //Program memory not write protected
#FUSES NOWRTC //Configuration registers not write protected
#FUSES NOWRTB //Boot block not write protected
#FUSES NOWRTD //Data EEPROM not write protected
#FUSES NOEBTR //Memory not protected from table reads
//LUCAS
//#FUSES RTCOSC_INT //RTCC uses Internal 31KHz Oscillator as reference source
#FUSES SOSC_LOW
#FUSES RTCOSC_T1
// FIM DE LUCAS |
|
|
|
|
|
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
|