我想知道是否有AVR内置函数可以帮助您在传递int值时设置两个字节的寄存器。
实施例: 我需要将闹钟设置为15600个时钟(在1MHz微处理器上为1秒)。
为了做到这一点,我需要按如下方式设置:
//Alarm clock at 15600 clocks
OCR0A = 0b11110000;
OCR0B = 0b00111100;
由于ATMEGA的AVR库有一些很酷的内置函数(比如设置一下),我想知道是否有一个我只给出一个int并相应地设置两个字节。
答案 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;
}