June 27, 2010 by Frozenlock Here is my problem: I've successfully obtained a a high frequency generator with one of the MCU's timers. However, the frequency follows this equation: F = Clock / (2 * N (1+ OCRnx)). This gives the following selectable frequencies (in kHz): 7,372.80 3,686.40 2,457.60 1,843.20 1,474.56 1,228.80 1,053.26 921.60 As you can see, there's a HUGE void between the selectable frequencies. (Around 50% for the firsts) If I need a frequency of 1300 kHz, am I doomed? Is there a way to use the interrupt, or perhaps a combination of timers to be able to obtain a larger selection of frequencies? Thank you very much in advance! You can obtain an exact average frequency. Some cycles will be slightly long, some slightly short, but they'll all be one or the other, and the average will be the desired frequency. The general scheme goes like this: ``````volatile long counter; void MyInterruptRoutine() { const long actualFrequency = 737280; const long desiredFrequency = 130000; counter += desiredFrequency; if (counter >= actualFrequency) { counter -= actualFrequency; DoStuffAtDesiredFrequency(); // to be written } } void main() { counter = 0; initializeInterrupt(); // to be written } `````` I don't know yet if an average frequency will do the trick, but I'll try. Thanks! Note: Those specific values wouldn't work because 7.3728MHz is too fast for an interrupt routine on an Atmega, because it wouldn't leave enough clock cycles to do the interrupt processing. Another change, to help performance, is to reduce whatever your fraction is (737280/130000 in this case) to it's simplest equivalent form (9216/1625 in this case). This makes it harder to tell what's going on (so add comments), but allows you to use int instead of long which will save a lot of clock cycles.