Я хочу изменить рабочий цикл ШИМ с 20% до 70%. Хотя пока я меняю значение OCR1AL. Рабочий цикл остается прежним. Почему это? Должен ли я изменить что-то еще? Насколько я понимаю, пока OCR1A показывает верхнее значение, это единственный параметр (регистр), который я могу использовать для изменения скважности.
.include "m16def.inc"
.cseg
PWM:
;input
ldi r16, 0x00
out DDRA, r16
;output
ldi r16, 0xff
out DDRD, r16
out PORTD, r16
ldi r20, 0xc1
out TCCR1A, r20
ldi r20, 0x01
out TCCR1B, r20
ldi r20, 0x00
out OCR1AH, r20
ldi r20, 0x33
out OCR1AL , r20
in r22, TIFR
andi r22, 0b00000100
out PORTD, r22
SW0:
in r23, PINA
cpi r23, 0b11111110
brne SW0
ldi r16, 0x82
in r17, OCR1AL
ADD r16,r17
out OCR1AL, r16
jmp SW0
ldi r16, 0x00
out PORTD, r16
Я использую AVR ATmega16 на 4 МГц.
Объясните, пожалуйста, алгоритм изменения OCR1AL при нажатии кнопки? Также, пожалуйста, добавьте полный код инициализации и/или объясните схему подключения кнопки. Почему PA0 должен быть равен 0 и почему PA1-PA7 должен быть равен 1? В любом случае лучше добавить к вашему вопросу полную информацию: как вы пришли к выводу, что это не работает: что вы ожидали, что вы получили.
Ваша проблема связана с настройкой таймера. Вы должны проверить это в первую очередь. Если вы хотите использовать 16-битный таймер, вы должны установить настройки таймера с помощью этой конфигурации: Тип: Быстрый ШИМ сверху 0xFFFF
Вы можете узнать, как настроить таймер в техническом описании вашего микроконтроллера.
После этой конфигурации, если вы измените верхние 8 бит, рабочий цикл изменится хорошо.
Я думаю, что ваша установка предназначена для 8-битного таймера, поэтому вам нужно изменить OCR1AL с 0 на 255, чтобы изменить рабочий цикл с 0 на 100 процентов.
Вы уже пробовали ту же программу на C?