реклама на сайте
подробности

 
 
 
Reply to this topicStart new topic
> 16-разрядный аппаратный ШИМ на ATmega64
DREAD
сообщение Mar 31 2008, 12:17
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 15-05-06
Пользователь №: 17 106



Как организовать 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

Сообщение отредактировал DREAD - Mar 31 2008, 12:51
Go to the top of the page
 
+Quote Post
GDI
сообщение Mar 31 2008, 13:21
Сообщение #2


Профессионал
*****

Группа: Свой
Сообщений: 1 235
Регистрация: 14-05-05
Из: Санкт-Петербург
Пользователь №: 5 008



Может стоит попробовать просто числа в регистры записывать? Вроде кто-то тут уже говорил про подобные глюки с дефайнами, правда там про УАРТ речь шла.


--------------------
http://www.embedders.org Блоги разработчиков электроники.
Go to the top of the page
 
+Quote Post
Lem
сообщение Mar 31 2008, 20:15
Сообщение #3


Участник
*

Группа: Участник
Сообщений: 37
Регистрация: 20-03-05
Пользователь №: 3 533



Цитата(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;
Go to the top of the page
 
+Quote Post
_Pasha
сообщение Mar 31 2008, 21:44
Сообщение #4


;
******

Группа: Участник
Сообщений: 5 646
Регистрация: 1-08-07
Пользователь №: 29 509



Цитата(DREAD @ Mar 31 2008, 16:17) *
void Timer_Counter3_init(void)
{
............................................................
OCR3B = 0;
}


Попробуйте OCR3B = 0x7fff - и сразу станет ясно, можете ли Вы на своем осциле увидеть обещанный для случая OCR3B = 0 "very narrow spike".
Go to the top of the page
 
+Quote Post
yod
сообщение Apr 1 2008, 08:33
Сообщение #5


Участник
*

Группа: Новичок
Сообщений: 24
Регистрация: 20-10-06
Пользователь №: 21 500



позавчера не мог заставить шимить mega1280 - портировал рабочий код с mega128
дело оказалось в простом - для ноги вывода шима следует ВЫКЛЮЧИТЬ подтягивающий резистор, иначе он все время в 1-це.
Go to the top of the page
 
+Quote Post
DrGluck
сообщение Apr 1 2008, 10:14
Сообщение #6


Местный
***

Группа: Участник
Сообщений: 340
Регистрация: 25-11-05
Из: Россия
Пользователь №: 11 361



".....позавчера не мог заставить шимить mega1280 - портировал рабочий код с mega128
дело оказалось в простом - для ноги вывода шима следует ВЫКЛЮЧИТЬ подтягивающий резистор, иначе он все время в 1-це......" -

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


--------------------
"... Ищущий вечно, однажды найдя, то, что искал бесконечно, мимо прошёл, совершенно беспечно, с кем-то о вечном шутя ..."
Go to the top of the page
 
+Quote Post
yod
сообщение Apr 2 2008, 07:38
Сообщение #7


Участник
*

Группа: Новичок
Сообщений: 24
Регистрация: 20-10-06
Пользователь №: 21 500



Цитата(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
Go to the top of the page
 
+Quote Post
Amper25
сообщение Apr 2 2008, 20:24
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929



to yod.

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

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

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

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

Каким компилятором и средой пользовались?

Сообщение отредактировал Amper25 - Apr 2 2008, 20:25
Go to the top of the page
 
+Quote Post
Nanobyte
сообщение Apr 2 2008, 20:38
Сообщение #9


За битами по регистрам гоняюсь
***

Группа: Свой
Сообщений: 457
Регистрация: 24-04-06
Из: Таганрог
Пользователь №: 16 446



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

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


--------------------
Курсор влево, курсор вправо - считается хакерством. FORMAT C: производится без предупреждения
Go to the top of the page
 
+Quote Post
Amper25
сообщение Apr 2 2008, 20:46
Сообщение #10


Местный
***

Группа: Свой
Сообщений: 215
Регистрация: 10-04-07
Пользователь №: 26 929



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


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

Вообщем для работы PWM на ноге MCU, надо кроме прочего для этой ноги выставить биты
DDRx <= '1'
PORTx - без разницы какой.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 18th July 2025 - 14:14
Рейтинг@Mail.ru


Страница сгенерированна за 0.01487 секунд с 7
ELECTRONIX ©2004-2016