C 函数设置一个2字节寄存器

C 函数设置一个2字节寄存器,c,atmega,C,Atmega,我想知道是否有一个AVR内置函数,它可以帮助您在传递int值时设置两个字节的寄存器 例如: 我需要一个闹钟设置为15600时钟(在1MHz微处理器上为1秒) 为此,我需要如下设置: //Alarm clock at 15600 clocks OCR0A = 0b11110000; OCR0B = 0b00111100; 由于ATMEGA的AVR库有一些很酷的内置函数(比如设置一个位),我想知道是否有一个函数,我只给它一个int,它会相应地设置两个字节。几乎所有的C编译器都允许内联汇编代码,而不

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

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

为此,我需要如下设置:

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

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

几乎所有的C编译器都允许内联汇编代码,而不会进行优化。如果使用
avrgcc
,您可以在此处找到非常详细的教程:。因此,您可以直接进入控制器的汇编代码。不幸的是,似乎没有办法将一个字直接从闪存加载到寄存器对。但是您可以预加载不同的寄存器对,并使用该命令将其值移动到目标寄存器对

如果您只想使用
avrgcc
而不深入汇编程序,并且您的目标是在原子访问中加载寄存器对(以防止中断),那么可以使用原子块pragma。另外,
avr libc
为一些16位寄存器定义了单字节访问。要加载
定时器/计数器输出比较寄存器
,您可以使用:

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

ATmega没有任何内置功能!它是一种CPU架构,执行机器代码。它甚至没有功能的概念。但是,在C中编写自己的“set_alarm”函数有什么问题?如果发布这个问题,输入的速度会更快。您是否尝试过“sbr”操作码(请参见以下链接:)@Zohar81:您混淆了C和汇编程序。(很像OP)我们年龄越大,脾气就越暴躁。
:)
@Bob:我在哪里?我认为这是一个非常正确的诊断。诊断问题是解决问题的第一步。哦,在nick前面加上
@
,否则收件人可能不会得到通知。