LED frequencies without cogs
Hi, I'm looking at this code taken from Parallax's Fundamentals: I/O and Timing Basics v.1.0.
For "dT := clkfreq / 4620", my question is why 4620? 80,000,000 divided by 4620 isn't exactly a nice number. Is there something special about 4620 that I'm missing?
Thanks,
cy88
For "dT := clkfreq / 4620", my question is why 4620? 80,000,000 divided by 4620 isn't exactly a nice number. Is there something special about 4620 that I'm missing?
Thanks,
cy88
''File: LedFrequenciesWithoutCogs.spin
''Experience the discomfort of developing processes that could otherwise run
''independently in separate cogs. In this example, LEDs blink at 1, 2, 3, 5,
''7, and 11 Hz.
CON
_xinfreq = 5_000_000 ' 5 MHz external crystal
_clkmode = xtal1 + pll16x ' 5 MHz crystal multiplied → 80 MHz
T_LED_P4 = 2310 ' Time increment constants
T_LED_P5 = 1155
T_LED_P6 = 770
T_LED_P7 = 462
T_LED_P8 = 330
T_LED_P9 = 210
PUB Blinks | T, dT, count
dira[noparse][[/noparse]9..4]~~ ' Set LED I/O pins to output
dT := clkfreq / 4620 ' Set time increment
T := cnt ' Mark current time
repeat ' Main loop
T += dT ' Set next cnt target
waitcnt(T) ' Wait for target
if ++count == 2310 ' Reset count every 2310
count := 0
' Update each LED state at the correct count.
if count // T_LED_P4 == 0
!outa
if count // T_LED_P5 == 0
!outa
if count // T_LED_P6 == 0
!outa[noparse][[/noparse]6]
if count // T_LED_P7 == 0
!outa[noparse][[/noparse]7]
if count // T_LED_P8 == 0
!outa[noparse][[/noparse]8]
if count // T_LED_P9 == 0
!outa[noparse][[/noparse]9]

Comments
1155 is half of 2310 and 770 is 1/3rd of 2310. 462 is 1/5th of 2310. 330 is 1/7th of 2310. 210 is 1/11th of 2310.
since all LED's are flashing at different frequencies, with only one counter, that gets reset back to 0 to make sure all LED's keep their pulse the number has to be divisible by it's frequency value, eg, 1,2,3,5,7,11 and so by multiplying them ALL together, you will get a nice non-fractional value that can be divided by either of the frequencies [noparse]:)[/noparse]
so that when the count gets reset, it won't affect the frequencies of any of the LED's [noparse];)[/noparse] if you see what I mean, as 2310 is divisible by all values and gives integer results.
As you can probably guess I'm not a teacher, but I hope it's clear enough lol if not let me know.
▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔
http://www.propgfx.co.uk/forum/·home of the PropGFX Lite
·