我正在使用Atmega2560
微控制器进行一个简单的LED项目。我不知道如何将LED亮度调整到想要的水平。
我需要对数字信号进行所有处理。在这种情况下,不允许使用PWM和模拟信号。
DEF 常量:
LEDS
:哪些LED可以工作
LED_DATA
:我将其用于out DDRC
理论
要获得50%
亮度:
主循环
.def LEDS = R16
.def LED_DATA = R21
.org 0
rjmp MAIN
MAIN:
ldi LEDS, 0xFF ; 0xFF = 1111 1111
out DDRC, LEDS ; make PORTC's all pins to output
sbi PORTB, 0
sbi PORTB, 1
sbi PORTB, 2
LOOP_MAIN:
out PORTC, LED_DATA
call DELAY
out PORTC, 0x00
call DELAY
rjmp LOOP_MAIN
我的 wait700ms 命令:
wait700ms:
push r17
ldi r16,0x40 ; run 0x400000 times
ldi r17,0x00 ; ~12 million cycle
ldi r18,0x00 ; for 16Mhz: ~0.7s delay
_w0:
dec r18
brne _w0
dec r17
brne _w0
dec r16
brne _w0
pop r17
ret
如上所述,即使我设置了ldi r16,0x01
而不是ldi r16,0x40
,我的 delay 命令还是不够的。使用0x01
,它发生得如此之快,但还不够。我可以用眼睛看到它,并且它以全亮度闪烁。这是我们不想要的情况。平均而言,它应该在 90 Hz 和 120 Hz 之间闪烁以调整亮度。
P.S:不允许使用模拟脉冲创建占空比。
问题
如何产生 5ms 延迟?
我们可以使用(ISR)定时器中断来解决此问题吗? *(如果
可能,如何使用计时器生成5ms
延迟? (TCCR,OCR0(用于
presaceler),...))*