Я работаю над простым светодиодным проектом с использованием Atmega2560
микроконтроллера.Я не знаю, как мне отрегулировать яркость светодиодов до желаемого уровня.
Мне нужно выполнить всю обработку с цифровыми сигналами.В этом случае ШИМ и аналоговые сигналы не допускаются.
DEF :
LEDS
: какие светодиоды будут работать
LED_DATA
: Я буду использовать его для out DDRC
Теория
Чтобы получить 50%
яркость:
- Включите вкл светодиод (логика-1)
- Задержка 5мс
- Выключение с выключением светодиод (логика-0)
- Задержка 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,0x40
.С 0x01
, это происходит так быстро, но этого недостаточно.Я вижу это своим глазом, и он мигает в полную яркость.Это ситуация, которую мы не хотим.В среднем он должен мигать между 90 Гц и 120 Гц для регулировки яркости.
PS: создание рабочего цикла с аналоговым импульсом не допускается.
Вопросы
Как создать задержку 5 мс ?
Можем ли мы решить эту проблему с помощью (ISR) прерываний таймера?* (Если возможно, как я могу сгенерировать 5ms
задержку с таймером? (TCCR, OCR0 (для presaceler), ...) ) *