Мне кажется из этого сегмента:
#elif PIC_CLK == 16000000
#define DelayDivisor 1
#define WaitFor1Us asm("nop")
#define Jumpback asm("goto $ - 4")
#elif PIC_CLK == 20000000
#define DelayDivisor 1
#define WaitFor1Us asm("nop"); asm("nop")
#define Jumpback asm("goto $ - 6")
#elif PIC_CLK == 32000000
#define DelayDivisor 1
#define WaitFor1Us asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop")
#define Jumpback asm("goto $ - 12")
, что для каждых дополнительных 4 миллионов увеличений PIC_CLK
вам нужна еще одна nop
инструкция.
Я неиспользовали более ранние, поскольку они просто используют функцию масштабирования на более низких тактовых частотах - поскольку вы не можете выполнить половину или четверть nop
, они просто уменьшают число циклов до половины или четверти и выполняют полное nop
столькораз.
Итак, для 64 миллионов (что на 32 миллиона больше, чем в предыдущем) вам понадобится еще восемь nop
инструкций (32 миллиона, разделенных на 4 миллиона), и, поскольку каждая из них увеличивает размер прыжка на 2(PIC18F имеет 2-байтовую ширину инструкции), вы должны иметь возможность использовать следующее:
#elif PIC_CLK == 32000000
#define DelayDivisor 1
#define WaitFor1Us asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop")
#define Jumpback asm("goto $ - 12")
#elif PIC_CLK == 64000000
#define DelayDivisor 1
#define WaitFor1Us asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop") \
asm("nop"); asm("nop"); asm("nop"); asm("nop"); \
asm("nop"); asm("nop"); asm("nop"); asm("nop");
#define Jumpback asm("goto $ - 28")
#else
#error delay.h - please define PIC_CLK correctly
#endif
В итоге, это значения, которые вам нужны для каждого значения PIC_CLK, при вероятности отключенияСледующее поколение будет еще быстрее:
PIC_CLK Divisor NOP count Jump size
--------- ------- --------- ---------
1000000 16 1 4
2000000 8 1 4
4000000 4 1 4
8000000 2 1 4
16000000 1 1 4
20000000 1 2 6
24000000 1 3 8
28000000 1 4 10
32000000 1 5 12
64000000 1 13 28
96000000 1 21 44
128000000 1 29 60
Или, если вы хотите, чтобы формулы для значений больше или равны 16 миллионам:
divisor = 1
nopcount = picclk / 4000000 - 3
jumpsize = nopcount * 2 + 2