【发布时间】:2013-09-27 05:33:50
【问题描述】:
我在 C 语言中创建了一些简单的代码来更改输出的占空比,我正在尝试将其转换为汇编,以便我可以在那里对其进行编辑并提高效率。但是,代码是为连接到 Teensy 2.0 的 Atmega32U4 编写的,每当我尝试使用常用方法翻译它时,由于使用了库,它会引发错误(我认为)。
如果我知道如何用汇编编写代码,我会重做整个代码,但我对此一无所知。
代码如下,
#include <avr/io.h>
#define F_CPU 7800UL // frequency of 7.8kHz
#include <util/delay.h>
int main()
{
DDRF = 0x00; // all in F are input
PORTF = 0xFF; // all inputs are set to low
DDRB = 0xFF; // all in B are output
PORTB = 0x00;
while(1)
{
if (~PINF &(1<<PF1)) // 0.05 duty cycle
{
PORTB = 0b00100000;
_delay_ms(50);
PORTB = 0x00;
_delay_ms(950);
}
else if (~PINF & (1<<PF4)) //0.73 duty cycle
{
PORTB = 0b00100000;
_delay_ms(730);
PORTB = 0x00;
_delay_ms(270);
}
else if (~PINF & (1<<PF6)) //0.92 duty cycle
{
PORTB = 0b00100000;
_delay_ms(920);
PORTB = 0x00;
_delay_ms(80);
}
else
{
PORTB = 0b00100000;
_delay_ms(500);
PORTB = 0x00;
_delay_ms(500);
}
}
}
我很确定我没有以最有效或最正确的方式编写此代码,但我上个月才开始学习 C。任何将其翻译成大会的建议将不胜感激。
【问题讨论】:
-
为了准确性和效率,您可以使用定时器或PWN输出功能代替。这将更容易且更易于维护。
-
参考用户手册或数据表,看看你的微控制器是否有
PWM输出功能。然后使用它。如果没有,您可以实现state machine 或使用多个计时器来实现不同的占空比。
标签: c assembly translate atmega