我有一个Arduino Uno Rev3,我从C中的主代码调用以下汇编函数。
#
# Global data (val1)
#
.extern delay
.data
.comm val1,1
.global val1
#
# Program code (compute function)
#
.text
.global compute
compute:
lds r22, val1 ;value of input
ldi r23, 0x00 ;0 value
ldi r24, 0x0D ;value to flash led
flash:
# flash LED
call SDelay ;Short Delay
out 0x04, r24 ;LED On
out 0x05, r24
call SDelay ;Delay
out 0x04, r23 ;LED Off
out 0x05, r23
dec r22
brne flash;
finish:
rjmp finish ;keep looping once finished
SDelay:
# Push registers onto stack
push r22
push r23
push r24
push r25
#Delay
ldi r22, 0xa0
ldi r23, 0x00
ldi r24, 0x00
ldi r25, 0x00
call delay
#Pop registers on stack
pop r25
pop r24
pop r23
pop r22
ret
这应该闪烁一个LED(我不确定我在这里闪烁的那个)输入的次数。该次数应存储在val1中(以C计算)。但是,我不知道我做错了什么。
有人可以快速解释如何闪烁arduino板中的特定LED吗?我知道我必须将引脚设置为高电平或低电平,但我不知道哪个引脚会为特定的LED设置。
我知道这些都是noob问题,但我是AVR程序集的新手,并且非常喜欢它。我不会这样做,但我们学校的CS部门认为我们有必要理解这一点。
谢谢!
答案 0 :(得分:1)
根据Arduino Uno R3板的schematic,您可以通过代码控制2个LED,连接到PD4和PD5(用作串行RX和TX的双重用途);将这些引脚配置为输出并将0写入它们将点亮它们。
锻炼
或者你可能想要
您正在从C调用ASM例程...这需要一些额外的想法,特别是当您将参数从C交给ASM时......本质上param的内容从R25向下传递 - 每个2字节每个参数,所以一个字符被移交为R25(MSB)和R24(LSB)......通读this