设置 2 字节寄存器的函数

Function to set a 2 byte register

我想知道是否有 AVR 内置函数可以帮助您在传递 int 值后设置两个字节的寄存器。

示例: 我需要将闹钟设置为 15600 个时钟(在 1MHz 微处理器上为 1 秒)。

为此,我需要按如下方式进行设置:

//Alarm clock at 15600 clocks
OCR0A = 0b11110000;
OCR0B = 0b00111100;

由于 ATMEGA 的 AVR 库有一些很酷的内置函数(比如设置位)我想知道是否有一个我只是给一个 int 并相应地设置两个字节。

几乎所有的 C 编译器都允许使用不会被优化的内联汇编代码。如果您使用 avrgcc,您会在此处找到非常详细的教程:AVR GCC Inline Assembler Cookbook. So you can directly get down to the assembler code of the controller. Unfortunately there seems to be no way to load a word directly from flash memory to a register pair. But you could preload a different register pair and use the MOVW (Move Word) 命令将其值移动到目标寄存器对。

如果您只想使用 avrgcc 而无需深入到汇编程序,并且您的目标是在原子访问中加载寄存器对(以防止中断中断),您可以使用 ATOMIC_BLOCK pragma .此外,avr-libc 为某些 16 位寄存器定义了单字节访问。要加载 Timer/Counter Output Compare Register,您可以使用:

ATOMIC_BLOCK(ATOMIC_RESTORESTATE)
{
    //Alarm clock at 15600 clocks
    OCR1A = 0x3cf0;
}