Страница 1 из 1

Не могу настроить 2-ух канальный аппаратный ШИМ на Attiny13

Добавлено: Сб мар 01, 2014 23:54:33
Ghostgkd777
Уважаемым котам большой привет, помогите начинающему освоить AVR.
Сам пишу на ассемблере. Нужно организовать 2-ух канальный аппаратный ШИМ на Attiny13 на выводах OC0A и OC0B. ШИМ на них нужен инверсный один относительно другого.
Пишу в OCR0A и OCR0B одно и то-же значение с ADCH, но имею в итоге ШИМ только на OC0B, на канале OC0A мертвый ноль.
Грешил на сожженый после переполюсовки МК, но на новом МК история та-же. Подключаю на макетке через переходник:
дорожки.JPG
(76.62 КБ) 578 скачиваний
Изображение
В настройкафф пишу:
В регистры OCR0A OCR0B пишу одно и то-же значение из регистра АЦП ADCH, требуется запустить их в противофазе. Настраиваю ШИМ на режим точной фазы. Устанавливаю в TCCR0A инверсную работу выходов: 0b11100001 в TCCR0B пишу 0b00000011. Порты PB0, PB1 настраиваю на выход: DDRB.1 в 1 и DDRB.0 в 1.
По идее, оба канала ШИМ должны работать в противофазе (с учетом, что OCR0A=OCR0B у меня). Подскажите чайнику куда копать, где накошачил?))
Листинг программы:
  • .Include "tn13Adef.inc"


    .def temp1=R16
    .def AD=R19



    .CSEG
    .org 0

    rjmp RESET ; Reset Handler
    rjmp EXT_INT0 ; IRQ0 Handler
    rjmp PC_INT0 ; PCINT0 Handler
    rjmp TIM0_OVF ; Timer0 Overflow Handler
    rjmp EE_RDY ; EEPROM Ready Handler
    rjmp ANA_COMP ; Analog Comparator Handler
    rjmp TIM0_COMPA ; Timer0 CompareA Handler
    rjmp TIM0_COMPB ; Timer0 CompareB Handler
    rjmp WATCHDOG ; Watchdog Interrupt Handler
    rjmp ADCON ; ADC Conversion Handler

    EXT_INT0: ; IRQ0 Handler
    PC_INT0: ; PCINT0 Handler
    TIM0_OVF: ; Timer0 Overflow Handler
    EE_RDY: ; EEPROM Ready Handler
    ANA_COMP: ; Analog Comparator Handler
    TIM0_COMPA: ; Timer0 CompareA Handler
    TIM0_COMPB: ; Timer0 CompareB Handler
    WATCHDOG: ; Watchdog Interrupt Handler
    ;ADCON
    reti


    RESET: ldi r16, low(RAMEND); Main program start
    out SPL,r16 ; Set Stack Pointer to top of RAM

    ldi temp1,0b11100001 ; ШИМ А инверсный, ШИМ В прямой
    out TCCR0A,temp1 ; вкл оба ШИМ, режим точной фазы
    ldi temp1,0b00000011 ; уст. Кдел таймеров=64 ШИМ 20Гц
    out TCCR0B,temp1

    ;cbi PORTB,2
    sbi DDRB,1
    sbi DDRB,0

    ldi temp1,0b00111100
    out DIDR0,temp1
    ldi temp1,0b00100011 ; включаем ADC3
    out ADMUX,temp1
    ldi temp1,0b10001000 ; активно прерывание Кдел=2
    out ADCSRA,temp1

    sei ; Enable interrupts

    ;============== ПРОГРАММА=================
    START: sbi ADCSRA,6
    WAIT: sbic ADCSRA,6
    rjmp WAIT
    out OCR0A,AD
    out OCR0B,AD
    rjmp START


    ;==============ОБРАБОТКА ПРЕРЫВАНИЯ ADC====
    ADCON: in AD,ADCH
    reti

Re: Не могу настроить 2-ух канальный аппаратный ШИМ на Attin

Добавлено: Вс мар 02, 2014 16:01:06
ANALOG
1. Засуньте код в тег

Код: Выделить всё

2. А если в OCR0 загружать константы, а не значения из ADC - работает?

PS: мне кажется, выбран неправильный режим работы таймера. Попробуйте использовать режим Fast PWM (грузить в TCCR0A 0b11100011)

Re: Не могу настроить 2-ух канальный аппаратный ШИМ на Attin

Добавлено: Пн мар 03, 2014 09:25:41
Engineer_Keen
Код рабочий (проверял в симуляторе, но в таких простых случаях ему можно верить на 99%), проверяйте железо.

На будущее... Не используйте магических цифр в программе, код

Код: Выделить всё

ldi temp1,(1<<COM0A1)|(1<<COM0A0)|(1<<COM0B1)|(1<<WGM00); ШИМ А инверсный, ШИМ В прямой
out TCCR0A,temp1 ; вкл оба ШИМ, режим точной фазы
читается лучше чем

Код: Выделить всё

ldi temp1,0b11100001 ; ШИМ А инверсный, ШИМ В прямой
out TCCR0A,temp1 ; вкл оба ШИМ, режим точной фазы
будет проще, гарантирую :idea:

Re: Не могу настроить 2-ух канальный аппаратный ШИМ на Attin

Добавлено: Пн мар 03, 2014 20:13:40
titoFF
Спасибо, не знал, что в ассемблере так можно делать. В книге Белова вообще м самые магические из магических применяются, в 16 СИ. А на С вообще CVAVR и генератор кода. Не понимаю, почему его советуют. Хотя по логике там хорошо написано.

Re: Не могу настроить 2-ух канальный аппаратный ШИМ на Attin

Добавлено: Вт мар 04, 2014 17:49:22
Ghostgkd777
ANALOG, к сожалению не вижу даже кнопки "отредактировать сообщение" чтобы засунуть текст в тэг. Но на будущее буду знать.
Константы пока не грузил в ADC, попробую, но врядли получится т.к. в OCR0A и OCR0B значение из ADC заносится, они не пустые оба.
Режим работы выбран Phase Correct PWM для управления оборотами двигателя, как и советует даташит. Понимаю,что напрашивается вопрос о глюке МК от наводок мотора, но испытывал на макетке на светодиодах сначала, прежде чем вешать мотор.

Engineer_Keen, я вот тоже всю валерианку выпил - не могу ничего понять. :dont_know: Менял МК, оба их пропаивал и после пайки прозванивал контакт от ножки МК до макетки, пользовался одним и тем-же светиком - на одной ноге горит, на другой - нет. :kill:
За совет спасибо, думаю что Вы абсолютно правы, надо привыкать :))

В общем, из положения вышел применив реверс на реле, а хотел Н-мост с попеременным включением ШИМ то на одной диагонали, то на другой. Но вопрос остался непонятым :cry:

Re: Не могу настроить 2-ух канальный аппаратный ШИМ на Attin

Добавлено: Ср мар 05, 2014 01:17:44
ANALOG
Странно, кнопочка правки и правда куда-о пропала :roll:
Недавно форум вроде на ремонт закрывали, должно быть, еще не все доделали :dont_know:

Re: Не могу настроить 2-ух канальный аппаратный ШИМ на Attin

Добавлено: Сб мар 08, 2014 20:45:14
ИС-пытатель
Программа рабочая. Проверено в Proteus. Скорее всего сдохла часть контроллера. Или элементарный непропай. Проверьте все соединения. Советую перед rjmp START добавить команду wdr (Вы ведь не отключали сторожевой таймер ;) )
P.S. Лучше было бы изменять значения OCR0A и OCR0B непосредственно в обработчике прерывания от АЦП. Так будет надежнее. ;) А еще можете в цикле организовать инверсию ноги B. Правда у Вас будет рассинхронизация примерно в 1-2 такта контроллера. Но Вы ее глазом не заметите. ;)