Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: 16-разрядный аппаратный ШИМ на ATmega64
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > AVR
DREAD
Как организовать 16-разрядный аппаратный ШИМ в режиме fast PWM на Atmega64

таймер инициализируется так:

void Timer_Counter3_init(void)
{
ICR3= 0xFFFF;
TCCR3A = (1<<COM3B1)|(1<<COM3B0)|(1<<WGM31);
TCCR3B = (1<<WGM32)|(1<<WGM33)|(0<<CS30)|(1<<CS31);
//ETIMSK = (1<<TOIE3);
OCR3B = 0;
}
казалось бы должно работать но увы.
Люди добрые подскажите что я не так сделал

никто не хочет подсказать 05.gif
GDI
Может стоит попробовать просто числа в регистры записывать? Вроде кто-то тут уже говорил про подобные глюки с дефайнами, правда там про УАРТ речь шла.
Lem
Цитата(DREAD @ Mar 31 2008, 16:17) *
Как организовать 16-разрядный аппаратный ШИМ в режиме fast PWM на Atmega64


На меге 162 делал так:
Код
  TCNT1  = 0x0000;
  TCCR1A = 0xf2;
  TCCR1B = 0x19;
  OCR1A  = 0x0000;
  OCR1B  = 0x0000;
  ICR1   = 0x4fff;
  TCNT1  = 0x0000;
_Pasha
Цитата(DREAD @ Mar 31 2008, 16:17) *
void Timer_Counter3_init(void)
{
............................................................
OCR3B = 0;
}


Попробуйте OCR3B = 0x7fff - и сразу станет ясно, можете ли Вы на своем осциле увидеть обещанный для случая OCR3B = 0 "very narrow spike".
yod
позавчера не мог заставить шимить mega1280 - портировал рабочий код с mega128
дело оказалось в простом - для ноги вывода шима следует ВЫКЛЮЧИТЬ подтягивающий резистор, иначе он все время в 1-це.
DrGluck
".....позавчера не мог заставить шимить mega1280 - портировал рабочий код с mega128
дело оказалось в простом - для ноги вывода шима следует ВЫКЛЮЧИТЬ подтягивающий резистор, иначе он все время в 1-це......" -

достойный первоапрельский перл ! ... smile.gif
yod
Цитата(DrGluck @ Apr 1 2008, 16:14) *
".....позавчера не мог заставить шимить mega1280 - портировал рабочий код с mega128
дело оказалось в простом - для ноги вывода шима следует ВЫКЛЮЧИТЬ подтягивающий резистор, иначе он все время в 1-це......" -

достойный первоапрельский перл ! ... smile.gif

никуя смешного
ГЛЯДИ - ВХОДИТ
рабочий код инициализации __atmega128__
Код
.global POW_LAMP_init
POW_LAMP_init:
    ldi        r24,lo8(lamp_dir)
    sts        lamp_ptr,r24
    sts        lamp_count,__zero_reg__
    in        r24,_SFR_IO_ADDR(DDRB)
    ori        r24,1<<PB4;
    out        _SFR_IO_ADDR(DDRB),r24
    in        r24,_SFR_IO_ADDR(PORTB)
    ori        r24,1<<PB4;-------------это работает-----------
    out        _SFR_IO_ADDR(PORTB),r24
    ldi        r24,0b00111
    sts        PORTG,r24                //for external Quarz 32768
    ldi        r24,0b00001000
    out        _SFR_IO_ADDR(ASSR),r24            //use external clock
    ldi        r24,(0b01100000)|timer0speed    //phase correct PWM
    out        _SFR_IO_ADDR(TCCR0),r24
    in        r24,_SFR_IO_ADDR(TIMSK)
    ori        r24,1<<TOIE0
    out        _SFR_IO_ADDR(TIMSK),r24
    RET
.end

И ВЫХОДИТ (С)Иа
рабочий код инициализации _atmega1280_
Код
.global POW_LAMP_init
POW_LAMP_init:
    ldi        r24,lo8(lamp_dir)
    sts        lamp_ptr,r24
    sts        lamp_count,__zero_reg__
    
    in        r24,_SFR_IO_ADDR(DDRB)        //fist led
    ori        r24,1<<PB7;
    out        _SFR_IO_ADDR(DDRB),r24
    in        r24,_SFR_IO_ADDR(PORTB)
    andi    r24,~(1<<PB7); -------------это место пришлось править-----------
    out        _SFR_IO_ADDR(PORTB),r24

    in        r24,_SFR_IO_ADDR(DDRG)        //second led
    ori        r24,1<<PG5;
    out        _SFR_IO_ADDR(DDRG),r24
    in        r24,_SFR_IO_ADDR(PORTG)
    andi    r24,~(1<<PG5);-------------сделано по аналогии-----------
    out        _SFR_IO_ADDR(PORTG),r24

    in        r24,_SFR_IO_ADDR(PORTG)        //for external Quarz 32768
    andi    r24,~((1<<PG3)||(1<<PG4))
    out        _SFR_IO_ADDR(PORTG),r24

    ldi        r24,(1<<AS2)
    sts        ASSR,r24                    //use external clock
    ldi        r24,0b10000001                //phase correct PWM
    out        _SFR_IO_ADDR(TCCR0A),r24
    ldi        r24,0b00000100                //div 1024
    out        _SFR_IO_ADDR(TCCR0B),r24
    
    lds        r24,TIMSK0
    ori        r24,1<<TOIE0
    sts        TIMSK0,r24
    RET
.end
Amper25
to yod.

Вы что то не то сделали, либо устранили причину косвенным путем.
Включение выключение подтяжки никак не повлияет на ШИМ.

Кстати, непонятно, как вы выключили подтяжку для одного пина?
В AVR можно вкл/выкл подтяжки только все сразу, с помощью PUD бита.
Может вы просто бит в DDRx поменяли?

Кстати, какой то странный у вас ASM.
Зачем использовать
out _SFR_IO_ADDR(DDRB),r24

если можно просто:
out DDRB,R24
а если регистр не из 0..0x60 то
STS DDRB,r24

Каким компилятором и средой пользовались?
Nanobyte
Цитата(Amper25 @ Apr 2 2008, 23:24) *
... Кстати, непонятно, как вы выключили подтяжку для одного пина?
В AVR можно вкл/выкл подтяжки только все сразу, с помощью PUD бита.

Почему нельзя управлять свойствами одного пина? Устанавливайте/сбрасывайте требуемый бит порта для управления его подтяжкой.
Amper25
Цитата
Почему нельзя управлять свойствами одного пина? Устанавливайте/сбрасывайте требуемый бит порта для управления его подтяжкой.


Да, тут я протупил немного. Можно конечно.
Просто я имел ввиду, что при этом затрагиваются DDRx и PORTx биты. А когда их трогали, очевидно включили правильную комбинацию для PWM.

Вообщем для работы PWM на ноге MCU, надо кроме прочего для этой ноги выставить биты
DDRx <= '1'
PORTx - без разницы какой.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.