Перейти к содержанию

Timer / Counter1 Atmega16


serenbkii

Рекомендуемые сообщения

Привет всем, не могу никак разобраться как управлять ШИМ- ом на 16 битном таймере. Нужен ШИМ по трем каналам, на TC0 разобрался и сигнал идет, TC1 ни в какую не запускается, что я делаю не так? Вот код CVAVR


#include <mega16.h>		
#include <delay.h>

// Declare your global variables here

void main(void)
{


// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=0 State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x08;


// Port D initialization
// Func7=In Func6=In Func5=Out Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=0 State4=0 State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x30;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 4000,000 kHz
// Mode: Fast PWM top=FFh
// OC0 output: Non-Inverted PWM
TCCR0=0x69;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 4000,000 kHz
// Mode: Fast PWM top=OCR1A
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x08;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x00;
SFIOR=0x00;

while (1)
  {  
  OCR0++; // здесь все нормально работает
  delay_ms(10);
  OCR1AL=0x80;//что я только сюда уже не писал, ничего не помогает
  OCR1BL=0xEF;//уже все регистры перепробовал

  };
}

Изменено пользователем admin
CODE для чего?
Ссылка на комментарий
Поделиться на другие сайты

Реклама: ООО ТД Промэлектроника, ИНН: 6659197470, Тел: 8 (800) 1000-321

20% скидка на весь каталог электронных компонентов в ТМ Электроникс!

Акция "Лето ближе - цены ниже", успей сделать выгодные покупки!

Плюс весь апрель действует скидка 10% по промокоду APREL24 + 15% кэшбэк и бесплатная доставка!

Перейти на страницу акции

Реклама: ООО ТМ ЭЛЕКТРОНИКС, ИНН: 7806548420, info@tmelectronics.ru, +7(812)4094849

Выбираем схему BMS для корректной работы литий-железофосфатных (LiFePO4) аккумуляторов

 Обязательным условием долгой и стабильной работы Li-FePO4-аккумуляторов, в том числе и производства EVE Energy, является применение специализированных BMS-микросхем. Литий-железофосфатные АКБ отличаются такими характеристиками, как высокая многократность циклов заряда-разряда, безопасность, возможность быстрой зарядки, устойчивость к буферному режиму работы и приемлемая стоимость. Но для этих АКБ, также как и для других, очень важен контроль процесса заряда и разряда, а специализированных микросхем для этого вида аккумуляторов не так много. Инженеры КОМПЭЛ подготовили список имеющихся микросхем и возможных решений от разных производителей. Подробнее>>

Реклама: АО КОМПЭЛ, ИНН: 7713005406, ОГРН: 1027700032161

Привет всем, не могу никак разобраться как управлять ШИМ- ом на 16 битном таймере. Нужен ШИМ по трем каналам,

даташит

The Timer/Counter (TCNT1), Output Compare Registers (OCR1A/B), and Input Capture Register (ICR1) are all 16-bit registers.

тоесть менять необходимо значение OCR1A и OCR1В а они состоят из двух 8ми битников

читаем даташит

To do a 16-bit write, the High byte must be written before the Low byte. For a 16-bit read, the

Low byte must be read before the High byte.

тоесть для задания прироста необходимо изменить сначала старший разряд а затем младший, тоесть

попробуйте так:

OCR1AН=0x80;//

OCR1AL=0x80;//что я только сюда уже не писал, ничего не помогает

OCR1BН=0xEF;//уже все регистры перепробовал

OCR1BL=0xEF;/

Ссылка на комментарий
Поделиться на другие сайты

Упс...полистал даташит

The TOP value, or maximum Timer/Counter value, can in some modes of operation be defined

by either the OCR1A Register, the ICR1 Register, or by a set of fixed values. When using

OCR1A as TOP value in a PWM mode, the OCR1A Register can not be used for generating a

PWM output. However, the TOP value will in this case be double buffered allowing the TOP

value to be changed in run time. If a fixed TOP value is required, the ICR1 Register can be used

as an alternative, freeing the OCR1A to be used as PWM output.

Ссылка на комментарий
Поделиться на другие сайты

спасибо, дома попробую. А вырезок из даташита не понял. Что то о невозможности использовать orc1a в качестве ШИМ. Поясните пожалуйста.

Ссылка на комментарий
Поделиться на другие сайты

Последняя "вырезка" говорит о том, что нельзя ставить верхнее значение как OCR1A, а необходимо ставить типа 0*3FF

Пояснение тут

The counter reaches the TOP when it becomes equal to the highest value in the

count sequence. The TOP value can be assigned to be one of the fixed values:

0x00FF, 0x01FF, or 0x03FF, or to the value stored in the OCR1A or ICR1 Register. The assignment is dependent of the mode of operation.

В Вашем случае значение ТОР=OCR1A

Тоесть выход OCR1A работать как ШИМ не будет...ну как то так:)

Кусок Вашего кода

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 4000,000 kHz

// Mode: Fast PWM top=OCR1A

// OC1A output: Non-Inv.

Изменено пользователем Oleg_Shonin
Ссылка на комментарий
Поделиться на другие сайты

Значение OCR1A используется как буфер хранения задания... Думаю, что крайней принципиальности не будет если напишите/выставите на вкладке так,

// Mode: Fast PWM top=O*03FF

Ссылка на комментарий
Поделиться на другие сайты

Точно помню, что выставлял. Потом побитно с даташита регистры конфигурировал. Ну, доберусь до компьютера, всё ещё раз проверю. Спасибо большое за ответы.

Ссылка на комментарий
Поделиться на другие сайты

у меня 0х00FF сконфигурировано, что соответствует

дык это в нулевом таймере...а в таймере 1, с которым вы боретесь что стоит?

:) всё взято с Вашего кода..проверяйте - успехов

Ссылка на комментарий
Поделиться на другие сайты

это мастер начального кода комменты писал, а конфиг раз 30 менялся, говорю же, что уже только не пробовал. Ещё раз спасибо, думаю сегодня PWM будет побежден))) ещё раз спасибо.

Ссылка на комментарий
Поделиться на другие сайты

А почему таймер не запущен. (TCCR1B)?

Молчишь? Даю намёк.

CS12 /CS11 /CS10 (0 / 0 / 0)- No clock source (Timer/Counter stopped).

Изменено пользователем Ittido
Ссылка на комментарий
Поделиться на другие сайты

В Code Wizard avr когда TC0 конфигурирую- выставляю стоящий таймер и все ОК. Сейчас включил таймер TC1 и все заработало, спасибо за наводку, два дня голову ломаю.

Ссылка на комментарий
Поделиться на другие сайты

спасибо, дома попробую. А вырезок из даташита не понял. Что то о невозможности использовать orc1a в качестве ШИМ. Поясните пожалуйста.

Ссылка на комментарий
Поделиться на другие сайты

Оригинал

The counter reaches the TOP when it becomes equal to the highest value in the

count sequence. The TOP value can be assigned to be one of the fixed values:

0x00FF, 0x01FF, or 0x03FF, or to the value stored in the OCR1A or ICR1 Register. The assignment is dependent of the mode of operation.

Перевод

Счетчик достигает TOP, когда это становится равным самому высокому значению в результате роста значения. Значение TOP может быть присвоено быть одним из фиксированных значений:0x00FF, 0x01FF, или 0x03FF, или к значению, сохраненному в OCR1A или Регистре ICR1. Присвоение зависит режима работы.

Тоесть для манипуляции ШИМ необходимо менять значение OCR1A, которое можеть быть меньше или равное значению TOP. В данном случае OCR1A - буфер хранения ТОР...

Тоесть на выходе ножки всегда будет логическая единица

Ссылка на комментарий
Поделиться на другие сайты

TOP верхнее значение счетчика таймера (до которого идет счет), принимает три варианта, зависящих от разрешения PWM. 0x00FF - 8бит, 0x01FF - 9бит, 0x03FF - 10бит (выставляются при конфигурировании таймера/счетчика). Олег немного неправильно выразился, поправлю "В данном случае при OCR1A = TOP на выходе будет всегда логическая единица, как и наоборот - при OCR1A = 0x0000 - логический ноль". По регистру OCR1A - он предназначен для использования в качестве регистра сравнения ШИМ и никак иначе, т.е. не является никаким буфером хранения. Используй на здоровье. По программе замечу, не стоит в основном цикле дергать значение регистров сравнения, т.к. он (цикл) повторяется гораздо чаще, чем отрабатывает счетчик/таймер. Лучше это делать в прерывании от таймера/счетчика (например по переполнению). Насколько мне припоминается, значения регистров переписываются синхронно, по достижению конца счета.

Ссылка на комментарий
Поделиться на другие сайты

Спасибо всем за помощь, делаю RGB контроллер с управлением энкодером на mega1.Код выкладываю на суд, мне будет интересно послушать критику, сильно только не пинайте, это первая моя программа. Буду очень признателен за мнение и критику со стороны опытных людей. Это не последняя версия, ещё вношу некоторые изменения по управлению и хочу прикрутить эффектов и всяких красотулек.

#include <mega16.h>                            // объявление контроллера мега16
#include <delay.h>                             // объявление пауз
#define r OCR1A                                // регистр OCR1A будем именовать в коде как r для удобства и читаемости кода
#define g OCR1B                                // тоже самое, но с буквой g
#define b OCR0                                 // тоже самое, но с буквой b

unsigned char tmp=1;                           //объявляем переменную для определения стадии наращивания/убавления цветов



void _pwmLED(void)    {                        //инициализация ШИМ

       PORTB=0x00;                            //конфигурация порта B
       DDRB=0x08;                             //нога PB3 на выход (будет использована как ШИМ синего цвета)

       PORTD=0x00;                            //конфигурация порта B
       DDRD=0x30;                             //ноги PD4 и PD5 на выход (PD4- зеленый, PD5- красный) 

       DDRC=0x00;                             //конфиг порта С на кнопки
       PORTC=0x07;                            //подтяжка 

       TCCR0=0x69;                            //инициализация таймера TC0
       TCNT0=0x00;                            //как не инвертированный ШИМ 8-бит
       OCR0=0x00;                             //начальное значение величины ШИМ на красный цвет

       TCCR1A=0xA1;                           //инициализация таймера TC1
       TCCR1B=0x09;                           //как не инвертированный ШИМ 8-бит на синий и зеленый цвет
       TCNT1H=0x00;                           //на пинах PD4 и PD5
       TCNT1L=0x00;
       ICR1H=0x00;
       ICR1L=0x00;
       OCR1AH=0x00;
       OCR1AL=0x00;
       OCR1BH=0x00;
       OCR1BL=0x00;   
}

interrupt_init() {                             //инициализация прерывания 
GICR|=0x40;                                    //по низкому уровню на INT0
MCUCR=0x00;
MCUCSR=0x00;
GIFR=0x40;
#asm("sei")                                    //глобально разрешаем прерывания
}


void encoder_right()  {   //при вращении вправо      

       if (tmp==1) {if (g<255) g+=15; else tmp=2;}  //зажигаем зеленый                      
       if (tmp==2) {if (r>0)   r-=15; else tmp=3;}  //гасим красный
       if (tmp==3) {if (b<255) b+=15; else tmp=4;}  //зажигаем синий
       if (tmp==4) {if (g>0)   g-=15; else tmp=5;}  //гасим зеленый
       if (tmp==5) {if (r<255) r+=15; else tmp=6;}  //зажигаем красный
       if (tmp==6) {if (b>0)   b-=15; else tmp=1;}  //гасим синий 

}                                             
void encoder(void)  {   //при вращении влево

       if (tmp == 1) {if(g>0)  g-=15; else tmp = 6;}   //гасим зеленый
       if (tmp == 2) {if(r<255) r+=15; else tmp = 1;}  //зажигаем красный
       if (tmp == 3) {if(b>0)   b-=15; else tmp = 2;}  //гасим синий
       if (tmp == 4) {if(g<255) g+=15; else tmp = 3;}  //зажигаем зеленый
       if (tmp == 5) {if(r>0)   r-=15; else tmp = 4;}  //гасим красный
       if (tmp == 6) {if(b<255) b+=15; else tmp = 5;}  //зажигаем зеленый
}                                                                            



interrupt [EXT_INT0] void ext_int0_isr(void)            //обработчик прерывания INT0
{
if(PINC.2==0){                                          //если на пине PD3 НЛУ, 
encoder_right();                                        //то энкодер вращается вправо
}
else{                                                   //в противном случае
encoder();                                              //энкодер вращается влево
}

}

void main(void) {                                       //главная функция

_pwmLED();                                              //переход в функцию инициализации ШИМ
interrupt_init();                                       //переход в функцию инициализации прерываний



while (1) {                                             //бесконечный опрос кнопок PC0 и PC1 для управления с кнопок

if (PINC.0==0) { delay_ms(50); encoder_right();}        //если на PC0 НЛУ, считать, что энкодер крутится вправо
if (PINC.1==0) { delay_ms(50); encoder();}              //если на PC1 НЛУ, считать, что энкодер крутится влево

}              
}

Изменено пользователем serenbkii
Ссылка на комментарий
Поделиться на другие сайты

В Вашем случае значение ТОР=OCR1A

Тоесть выход OCR1A работать как ШИМ не будет...ну как то так :)

Кусок Вашего кода

// Timer/Counter 1 initialization

// Clock source: System Clock

// Clock value: 4000,000 kHz

// Mode: Fast PWM top=OCR1A

// OC1A output: Non-Inv.

Олег. Вся ошибка состояла в том, что таймер не был запущен (OCR1A=0x08, а надо было 0х09). После смены значения, все заработало. Режим FastPWM с переменной разрядностью автором не используется. Вместо него используется стандартный FastPWM 8bit, в котором регистр OCR1A доступен для пользователя как регистр совпадения (TOP=0xFF) и выход PD5 прекрасно работает как вывод ШИМ.

Значение OCR1A используется как буфер хранения задания... Думаю, что крайней принципиальности не будет если напишите/выставите на вкладке так,

// Mode: Fast PWM top=O*03FF

Что касается данной строчки, так это всего-лишь заремаренный комментарий. От его изменения ничего не произойдет.

Изменено пользователем Геннадий
Ссылка на комментарий
Поделиться на другие сайты

Что касается данной строчки, так это всего-лишь заремаренный комментарий. От его изменения ничего не произойдет.

ну как бы, я не спорю про комментарий, просто когда я делаю правки в "спомогалке Код Вижиона", то копирую все вместе с комментариями, дабы легче было разбираться, потому на них и смотрю, иначе автор должен был бы их удалить, коли не обновляет

Олег. Вся ошибка состояла в том, что таймер не был запущен (OCR1A=0x08, а надо было 0х09).

Вот Именно по этому комментрарии нужно копировать, дабы не рыть OCR1A=0x08 или 0х09

Вы абсолютно правы, но я новичек и мне проще запустить Кодвижион и в "спомогалке сгенерить код" и потом я смогу сравнить, - OCR1A=0x08 или 0х09....

Но так как для этого нужно запускать виртуалку 32битку (в рабочее время это не приветствуется:)), то смотрел по комментариям....зелен я еще, дабы так сходу прочесть коды, звыняйте коли не так:)

По регистру OCR1A - он предназначен для использования в качестве регистра сравнения ШИМ и никак иначе, т.е. не является никаким буфером хранения.

Тут я не согласен...потому как

When using

OCR1A as TOP value in a PWM mode, the OCR1A Register can not be used for generating a

PWM output. However, the TOP value will in this case be double buffered allowing the TOP

value to be changed in run time.

Ну так пишут в даташите...таки двойным буфером будет, одно в ТОР, другое в OCR1A

Ссылка на комментарий
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.
Примечание: Ваш пост будет проверен модератором, прежде чем станет видимым.

Гость
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Ответить в этой теме...

×   Вставлено с форматированием.   Восстановить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

Загрузка...
  • Последние посетители   0 пользователей онлайн

    • Ни одного зарегистрированного пользователя не просматривает данную страницу
×
×
  • Создать...