Изменение яркости светодиодов в Atmel AVR с использованием сборки без ШИМ и аналогового - PullRequest
0 голосов
/ 19 декабря 2018

Я работаю над простым светодиодным проектом с использованием Atmega2560 микроконтроллера.Я не знаю, как мне отрегулировать яркость светодиодов до желаемого уровня.

Мне нужно выполнить всю обработку с цифровыми сигналами.В этом случае ШИМ и аналоговые сигналы не допускаются.

DEF :

LEDS: какие светодиоды будут работать

LED_DATA: Я буду использовать его для out DDRC

Теория

Чтобы получить 50% яркость:

  1. Включите вкл светодиод (логика-1)
  2. Задержка 5мс
  3. Выключение с выключением светодиод (логика-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

Как вы можете видеть выше, моя команда delay недостаточна, даже когда я установил ldi r16,0x01 вместо ldi r16,0x400x01, это происходит так быстро, но этого недостаточно.Я вижу это своим глазом, и он мигает в полную яркость.Это ситуация, которую мы не хотим.В среднем он должен мигать между 90 Гц и 120 Гц для регулировки яркости.

PS: создание рабочего цикла с аналоговым импульсом не допускается.

Вопросы

  1. Как создать задержку 5 мс ? ​​

  2. Можем ли мы решить эту проблему с помощью (ISR) прерываний таймера?* (Если возможно, как я могу сгенерировать 5ms задержку с таймером? (TCCR, OCR0 (для presaceler), ...) ) *

...