使用不带PWM和模拟功能的组件更改Atmel AVR中的LED亮度

时间:2018-12-19 17:15:53

标签: assembly arduino avr atmega atmel

我正在使用Atmega2560微控制器进行一个简单的LED项目。我不知道如何将LED亮度调整到想要的水平。

我需要对数字信号进行所有处理。在这种情况下,不允许使用PWM和模拟信号。

DEF 常量:

LEDS:哪些LED可以工作

LED_DATA:我将其用于out DDRC

理论

要获得50%亮度:

  1. 打开 LED (逻辑1)
  2. 延迟 5毫秒
  3. 关闭关闭 LED (逻辑0)
  4. 延迟 5毫秒

主循环

.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:不允许使用模拟脉冲创建占空比。

问题

  1. 如何产生 5ms 延迟?

  2. 我们可以使用(ISR)定时器中断来解决此问题吗? *(如果 可能,如何使用计时器生成5ms延迟? (TCCR,OCR0(用于 presaceler),...))*

0 个答案:

没有答案