Author | Eur van Andel, Copyright (c) 2003..2008, all rights reserved. |
Adapted-by | Rob Hamerling |
Compiler | 2.4l |
This Interrupt Service Routine updates the variable seconds about once per second. The precision is 0.2 ppm, the accuracy depends on the Xtal used.
http://www.romanblack.com/one_sec.htm http://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm
This is the Bresenham Line Algorithm, invented at IBM in 1962, which gets an accurate end result by summing the small errors resulting of taking discrete steps and correcting when the error gets too large. This means that individual second lengths may show some jitter, but that long-term timekeeping is accurate. Original assembler by Roman Black. At 20 MHz, so 200ns/clock, so 5 000 000 clocks/second Rhe RTC has three bytes: bres_hi, bres_mid, bres_lo timer 0 runs on internal clock speed and interrupts on overflow every timer 0 interrupt decreases bres_mid by one. The 2 000 000 value is added when bres_hi en bres_mid are zero note that remainder is added to bres_lo, which can overflow in bres_mid this keeps clock count accurate, although interrupts happen every 256 clock counts the ISR subtracts 1 from the mid byte. It first checks the mid byte for zero and borrows a bit from bres_hi if needed. Required PIC settings: OPTION_REG_PSA = 1 OPTION_REG_PS = 0 OPTION_REG_T0CS = 0 -- Timer0 on instruction cycle clock
No dependency found
var volatile byte _rtc_bres_mid = _rtc_mid -- > init 3-byte counter
const byte _rtc_mid = _rtc_cycles_per_second % 65536 / 256
const byte _rtc_hi = _rtc_cycles_per_second / 65536
var volatile byte _rtc_bres_hi = _rtc_hi -- \
var volatile byte _rtc_bres_lo = _rtc_lo -- /
const _rtc_cycles_per_second = (target_clock / 4)
var volatile byte seconds -- global variable updated by ISR
const byte _rtc_lo = _rtc_cycles_per_second % 256
var volatile byte _rtc_bres_mid = _rtc_mid -- > init 3-byte counter
No documentation found
const byte _rtc_mid = _rtc_cycles_per_second % 65536 / 256
No documentation found
const byte _rtc_hi = _rtc_cycles_per_second / 65536
No documentation found
var volatile byte _rtc_bres_hi = _rtc_hi -- \
No documentation found
var volatile byte _rtc_bres_lo = _rtc_lo -- /
No documentation found
const _rtc_cycles_per_second = (target_clock / 4)
No documentation found
var volatile byte seconds -- global variable updated by ISR
No documentation found
const byte _rtc_lo = _rtc_cycles_per_second % 256
No documentation found
RTC()
No documentation found
16f876a | 16f876a_rtc_lcd.jal |
16f877a | 16f877a_rtc_lcd.jal |
16f886 | 16f886_rtc_lcd_4mhz.jal |
16f886 | 16f886_rtc_lcd_20mhz.jal |
16f886 | 16f886_rtc_lcd_125khz.jal |