我试图制作Arduino的delayMicroseconds()函数的更精确版本,最终目标是一个方波发生器,其频率可以变化到100 KHz,精度为0.2千赫。
根据我在网上找到的资源,这是我最好的尝试:
__asm__ ("mov eax, $x");
__asm__("beginning:");
__asm__("inc eax");
__asm__("cmp eax, 0x0A");
__asm__("jne beginning");
__asm__("mov $x, eax");
我将上面的代码输入Arduino IDE并点击"验证;"出现以下错误消息:
Arduino: 1.6.4 (Windows 7), Board: "Arduino Uno"
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s: Assembler messages:
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:46: Error: constant value required
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:46: Error: constant value required
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:46: Error: unknown opcode `x'
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:54: Error: constant value required
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:58: Error: unknown opcode `cmp'
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:62: Error: unknown opcode `jne'
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:66: Error: constant value required
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:66: Error: `,' required
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:66: Error: constant value required
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:66: Error: garbage at end of line
C:\Users\212455~1\AppData\Local\Temp\cciNDaW0.s:66: Error: unknown opcode `x'
Error compiling.
This report would have more information with "Show verbose output during compilation" enabled in File > Preferences.
我该怎么办?
答案 0 :(得分:0)
使用_delay_loop_1()
和/或_delay_loop_2()
来自
avr-libc。
第一个可以计数到256,每次迭代需要3个周期
最多768个周期。第二个计数高达65536并且需要4
每次迭代的周期,最多262144个周期。
如果查看头文件util/delay_basic.h
,
您将看到这些实现为非常简单的内联汇编(2
每个说明。