使用AVRA编写Arduino PWM LED渐变程序

3

我正在使用汇编语言编写Arduino UNO (=ATMega328P-PU)程序,以节省内存,因此我使用avra.exe(与atmel studio的avrasm32相同)进行编译,使用avrdude进行上传,像闪烁这样的简单程序可以正常运行。但是现在我尝试使用pwm来半亮一个LED。我检查了代码中的错误,但没有发现任何问题,但LED仍然全亮。我也检查了接线。以下是我的pwm.asm代码:

.nolist
.include "m328pdef.inc"
.list

.cseg
.org 0x00
     rjmp start
.org 0x34
 start: sbi ddrb, 5 ;pin 13
        sbi portb, 5 ;pin 13 on, just to compare with the PWMed led
        sbi ddrd, 5 ;pin 5 pwm
        ldi r16, 0b00100011 ;fast pwm mode, non inverted pwm at oc0b = pin 5
        out tccr0a, r16 ;I'm using Timer0
        ldi r16, 0b00000001 ;no prescaler
        out tccr0b, r16
        ldi r16, 128 ; duty cycle = 50%
        out ocr0b, r16

  loop: rjmp loop

我尝试改变占空比数值,但没有任何改变。


使用avr-gcc编译器,我得到了几乎相同的汇编代码(.lss),并且程序也正常运行。可能LED连接不正确? - KIIV
1个回答

2
我找到了解决方案。代码和接线都是正确的。将占空比设置为50%对于人眼来说并没有什么区别。所以我尝试将16放入ocr0b(占空比=6.25%),然后我发现了真正的差异。这是因为它遵循对数逻辑,因此50%和100%的占空比之间的差异实际上非常小。

如果你将 LED 移动到视线范围内,即使它对眼睛来说太快了,你也能看到“闪烁的痕迹”。 - KIIV

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接