用于设置2字节寄存器的功能

时间:2016-01-10 09:03:07

标签: c atmega

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

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

为了做到这一点,我需要按如下方式设置:

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

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

1 个答案:

答案 0 :(得分:1)

几乎所有C编译器都允许内联汇编程序代码不会被优化。如果您使用avrgcc,则可在此处找到非常详细的教程:AVR GCC Inline Assembler Cookbook。所以你可以直接找到控制器的汇编代码。不幸的是,似乎无法将一个字直接从闪存加载到寄存器对。但是您可以预加载不同的寄存器对并使用MOVW (Move Word)命令将其值移动到目标寄存器对。

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

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