Всем привет. Решил подключить RGB светодиод к Atmega8. И возникла проблема.
Сперва опишу как подключил:
К пинам порта D, подключил через PNP транзисторы ножки светодиода
PD0 - Blue
PD1 - GREEN
PD3 - RED
Что бы светодиод работал как нужно, мне нужно использовать ШИМ.
Для этого я использовал прерывания от таймера T0. И в нем веду счетчик ШИМ и управляю ножками светодиода.
; PD0 = RED
; PD1 = GREEN
; PD2 = BLUE
T0:
push r25
push r26
push r27
in r25, PORTD
lds r26, COUNT_PWM ; Счетчик ШИМ
cpi r26, 0
brne T0_red
cbr r25, 0x0B ; Если счетчик ШИМ на нуле включаем все светодиоды
; Если значение счетчика ШИМ достигло LED1_*** то выключаем нужные светодиоды
T0_red:
lds r27, LED1_RED
cp r26, r27
brne T0_green
sbr r25, 0x01 ; Отключам RED
T0_green:
lds r27, LED1_GREEN
cp r26, r27
brne T0_blue
sbr r25, 0x02 ; Отключам GREEN
T0_blue:
lds r27, LED1_BLUE
cp r26, r27
brne T0_exit
sbr r25, 0x08 ; Отключам BLUE
T0_exit:
out PortD, r25
; Увеличиваем счетчик ШИМ
inc r26
sts COUNT_PWM, r26
pop r27
pop r26
pop r25
reti
Этот код отлично работает! Светодиод горит как нужно.
Проблема заключается в том что у меня еще на контроллере висит дисплей, датчик температуры, и еще кое какие фентиплюшки.
И из за того что я использую регистры в таймере T0, у меня временами глючит дисплей, так как для передачи данных дисплею эти регистры используются.
1. Так вот, в программе часто используется delay, соответственно, код из таймера я ни как не могу перенести в программу, потому что из за задержки светодиод гаснет!
2. Я не могу перенести выводы светодиода на встроенные ШИМ контроллера, так как они уже заняты.
3. Я пробовал все регистры от r16 до r31. Все равно, дисплей глючит.
Как мне сделать такой ШИМ что бы не трогать регистры?