On Thu, Apr 8, 2010 at 10:55 AM, Joep Suijs <[email protected]> wrote:
> > 0.14697265625 is 301 / 2048, > Hi Joep, how do you compute those without headaches? Vasile > This is more smooth then your one-second jumps you have now, but you > can also split 301/2048 in 256 / 2048 + 45 / 2048 and limit the > 'jumps' to 45ms - below the threshold of someone looking at your alarm > clock... > So: add a ms every 256/2048 = 1/8 step and correct for 45 ms every > 2048. This gives you a pretty smooth correction. > And so on, 45 can be split in up to 4 parts. > > > If you take 301/2048 as a basis, you are 100% accurate (in the sense > that the software does not add any deviation) with little processing. > > Joep > > > 2010/4/8 vasile surducan <[email protected]>: > > Hi Matt, > > I will test this. If I understood right, you are defining 1 second with a > > resolution of 10pS, meaning a computing accuracy of 10ppt (part per > > trilion: http://en.wikipedia.org/wiki/Parts-per_notation), but still let > the > > sentence "This program assumes a 20 MHz resonator or crystal" unchanged, > and > > use 1S for test. How do you expect this can be tested? > > Assuming the OCXO is around 1ppb, > > (http://www.bliley.com/ocxo/ocxo.htm )your computing is still too > accurate > > with an order of 10exp-3. > > Vasile > > On Thu, Apr 8, 2010 at 7:02 AM, <[email protected]> wrote: > >> > >> Revision: 1895 > >> Author: [email protected] > >> Date: Wed Apr 7 21:00:56 2010 > >> Log: sample for timer > >> http://code.google.com/p/jallib/source/detail?r=1895 > >> > >> Added: > >> /trunk/sample/18f452_timer3_rtc.jal > >> > >> ======================================= > >> --- /dev/null > >> +++ /trunk/sample/18f452_timer3_rtc.jal Wed Apr 7 21:00:56 2010 > >> @@ -0,0 +1,144 @@ > >> +-- Title: second counter using timer3 > >> +-- Author: Matthew Schinkel - borntechi.com, copyright (c) 2009, all > >> rights reserved. > >> +-- Adapted-by: > >> +-- Compiler: >=2.4m > >> +-- > >> +-- This file is part of jallib (http://jallib.googlecode.com) > >> +-- Released under the BSD license > >> (http://www.opensource.org/licenses/bsd-license.php) > >> +-- > >> +-- Description: counts seconds with timer3 > >> +-- > >> +-- Sources: > >> +-- > >> +-- notes: > >> +-- > >> + > >> +-- include chip > >> +include 18F452 -- target picmicro > >> + > >> +-- This program assumes a 20 MHz resonator or crystal > >> +-- is connected to pins OSC1 and OSC2. > >> +pragma target clock 20_000_000 -- oscillator frequency > >> +-- configuration memory settings (fuses) > >> +pragma target OSC HS -- HS crystal or resonator > >> +pragma target WDT disabled -- no watchdog > >> +pragma target LVP disabled -- no Low Voltage Programming > >> + > >> +-- set all IO as digital > >> +enable_digital_io() > >> + > >> +-- led def > >> +alias led is pin_a1 > >> +alias led_direction is pin_a1_direction > >> +-- > >> +led_direction = output > >> + > >> +-- setup uart for communication > >> +const serial_hw_baudrate = 115200 -- set the baudrate > >> +include serial_hardware > >> +serial_hw_init() > >> + > >> +serial_hw_data = 0xAA > >> +serial_hw_data = 0xAA > >> +serial_hw_data = 0xAA > >> +serial_hw_data = 0xAA > >> + > >> +include print > >> + > >> +-- init pic interrupt settings > >> +intcon_gie = on ; enables all unmasked interrupts > >> +intcon_peie = on ; enables all unmasked peripheral interrupts > >> + > >> +-- Set this to desired interval. timer3 will count up. > >> +-- Interupt will occur when timer_interval rolls > >> +-- over from 65535 to 0 > >> +var word timer_interval = 0 > >> + > >> +-- timer3 setup > >> +tmr3 = timer_interval -- timer interval > >> +t3con_tmr3cs = 0 -- use internal clock > >> +pie2_tmr3ie = 1 -- enable the timer3 interrupt bit > >> +t3con_tmr3on = 1 -- 1 = enables timer 3 > >> +pir2_tmr3if = off -- clear overflow to start timer > >> + > >> +-- set timer3 clock prescaler > >> +t3con_t3ckps = 1 -- set prscal of 1:2 > >> + > >> +-- define a rollover of 1 second > >> +-- holds 1 second: 1.00000000000 or 0x174876E800 > >> +var byte*6 one_sec > >> +var byte one_sec_array[6] at one_sec > >> +one_sec_array[5] = 0x00 > >> +one_sec_array[4] = 0x17 > >> +one_sec_array[3] = 0x48 > >> +one_sec_array[2] = 0x76 > >> +one_sec_array[1] = 0xE8 > >> +one_sec_array[0] = 0x00 > >> + > >> +-- counter will roll over 38.14697265625 times in one second for 20mhz > >> clock > >> +-- (1sec / ( (timer freq ) * clock increments ) / prescaller 1:2 = > >> interrupts per sec > >> +-- (1 / ( (1/20_000_000*4) * 65536 ) / 2 = > >> 38.14697265625 > >> +-- holds 0.14697265625 or 36C0679D9 (the remainder) > >> +var byte*6 num_add > >> +var byte num_add_array[6] at num_add > >> +num_add_array[5] = 0x00 > >> +num_add_array[4] = 0x03 > >> +num_add_array[3] = 0x6c > >> +num_add_array[2] = 0x06 > >> +num_add_array[1] = 0x79 > >> +num_add_array[0] = 0xD9 > >> + > >> +-- counts the remainder up to one second > >> +-- after count is > 1 second, we will minus 1 second within interrupt. > >> +var byte*6 remainder_count = 0 > >> +var byte remainder_count_array[6] at remainder_count > >> + > >> +-- seconds counter, allow it to roll over to 0 > >> +var byte second_count = 255 > >> +----------- > >> + > >> +var byte count1 = 0 -- counts up to 38 (interupt every 38.14697265625 > >> sec) > >> +procedure timer_isr() is > >> + pragma interrupt -- interupt procedure > >> + > >> + if !PIR2_TMR3IF then -- check if this is a timer3 interupt > >> + return -- exit interupt if it is not > >> + end if > >> + > >> + PIR2_TMR3IF = off -- clear timer overflow > >> + > >> + count1 = count1 + 1 -- count the number of times an interrupt > >> occurs > >> + if count1 == 38 then -- if timer is at 1 sec > >> + > >> + -- if remainder_count is > 1 sec > >> + if remainder_count > one_sec then > >> + > >> + -- remove one second from remainder_count > >> + remainder_count = remainder_count - one_sec > >> + > >> + -- remove one second from actual timing > >> + count1 = count1 + 1 > >> + else > >> + -- add 0.14697265625 (the remainder) to remainder_count > >> + remainder_count = remainder_count + num_add > >> + end if > >> + > >> + second_count = second_count + 1 -- increment the seconds > >> + if second_count == 60 then -- reset seconds to 0 each min > >> + second_count = 0 > >> + end if > >> + > >> + -- send seconds to serial port > >> + print_byte_dec (serial_hw_data,second_count) > >> + serial_hw_data = 0x0D > >> + serial_hw_data = 0x0A > >> + > >> + led = !led -- switch led on/off each second > >> + count1 = 0 > >> + end if > >> +end procedure > >> + > >> +-- main program here > >> +forever loop > >> +end loop > >> + > >> > >> -- > >> You received this message because you are subscribed to the Google > Groups > >> "jallib" group. > >> To post to this group, send email to [email protected]. > >> To unsubscribe from this group, send email to > >> [email protected]<jallib%[email protected]> > . > >> For more options, visit this group at > >> http://groups.google.com/group/jallib?hl=en. > >> > > > > -- > > You received this message because you are subscribed to the Google Groups > > "jallib" group. > > To post to this group, send email to [email protected]. > > To unsubscribe from this group, send email to > > [email protected]<jallib%[email protected]> > . > > For more options, visit this group at > > http://groups.google.com/group/jallib?hl=en. > > > > -- > You received this message because you are subscribed to the Google Groups > "jallib" group. > To post to this group, send email to [email protected]. > To unsubscribe from this group, send email to > [email protected]<jallib%[email protected]> > . > For more options, visit this group at > http://groups.google.com/group/jallib?hl=en. > > -- You received this message because you are subscribed to the Google Groups "jallib" group. To post to this group, send email to [email protected]. To unsubscribe from this group, send email to [email protected]. For more options, visit this group at http://groups.google.com/group/jallib?hl=en.
