Светодиод Arduino PWM с замиранием в сборке

Я пишу программы Arduino UNO (=ATmega328P-PU) в сборке для экономии памяти, поэтому я использую avra.exe (так же, как avrasm32 от atmel studio) для компиляции и загрузки avrdude, и простые программы, такие как мигание, работают нормально. Но теперь я попытался наполовину осветить светодиод с помощью шим. Я проверил свой код на наличие ошибок, но не нашел ни одной, и индикатор просто загорелся. Я тоже проверил проводку. Меня поражает :c. Вот мой код pwm.asm:

.nolist
.include "m328pdef.inc"
.list

.cseg
.org 0x00
     rjmp start
.org 0x34
 start: sbi ddrb, 5 ;pin 13
        sbi portb, 5 ;pin 13 on, just to compare with the PWMed led
        sbi ddrd, 5 ;pin 5 pwm
        ldi r16, 0b00100011 ;fast pwm mode, non inverted pwm at oc0b = pin 5 (right?)
        out tccr0a, r16 ;I'm using Timer0
        ldi r16, 0b00000001 ;no prescaler
        out tccr0b, r16
        ldi r16, 128 ; duty cycle = 50%
        out ocr0b, r16

  loop: rjmp loop

, 👍1

Обсуждение

Попробуйте написать код на C и посмотрите, получите ли вы какие-либо другие выходные данные, используя "avr-objdump-S <filename>.elf". Исходя из моих ограниченных знаний о сборке, код выглядит как файл. Что произойдет, если вы подключите светодиод наоборот (VCC-резистор-светодиод-шим-вывод против шим-вывода-резистор-светодиод-GND)? Наши глаза не воспринимают различные уровни освещенности в линейной шкале., @Gerben


2 ответа


Лучший ответ:

2

Я попробовал вашу программу, после преобразования ее в синтаксис GNU-as. Он работает так, как и ожидалось, как видно на экране. Ваша проблема может заключаться просто в том, что разница между 50% и 100% не очень очевидна для глаза из-за его логарифмического восприятия.

,

Понял! я попытался установить рабочий цикл на 16 (рабочий цикл 6,25%) и заметил разницу. Я не знал о его логарифмическом восприятии. Спасибо!, @Frazzo


0

вы должны установить таймеры PRR на

начало: lds r16, PRR и r16,0b10010111 ; PRTIM2 | PRTIM0 | PRTIM1 sts PRR,r16

,

Мне трудно понять это как ответ на вопрос, на который есть принятый ответ, в котором ничего не говорится о PRR. PRR по умолчанию равен 0x00 при сбросе, то есть по умолчанию ничего не отключается для уменьшения мощности. Это не изменяется загрузчиком или его кодом. Зачем им понадобилось менять PRR?, @timemage