attiny13: реализация шим и таймер времени

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

Смысл вопроса в следующем, накидал код для attiny13 в CVAVR для подогрева сидений авто, примитивен и прост, управление подогревом по ШИМ, глупо было бы не добавить функцию выключения по истечению определенного промежутка времени. Подскажите как в таком случае аппаратно настроить мк, в таймерах не шипко грамотен, могу только сделать отсчет времени по переполнению регистра сравнения.
Реклама
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

neid писал(а):Подскажите как в таком случае аппаратно настроить мк, в таймерах не шипко грамотен
Даташит на МК изучен?
Реклама
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

Alkul писал(а):
neid писал(а):Подскажите как в таком случае аппаратно настроить мк, в таймерах не шипко грамотен
Даташит на МК изучен?
больше нет скажу, чем да)
Держит паяльник хвостом
Сообщения: 933
Зарегистрирован: Ср апр 13, 2011 11:09:20
Откуда: Екатеринбург

Сообщение Alkul »

neid писал(а):больше нет скажу, чем да)
Ну так надо все же с изучения матчасти начать.
С таймерами на самом деле особой сложности нет - если вкратце, надо задать режим работы, задать частоту тактирования и инициализировать регистр TCNT чтобы задать время, через которое произойдет переполнение.
Поищите в сети, уж по avr-кам то куча даже программных примеров и описание на русском.
Реклама
Эиком - электронные компоненты и радиодетали
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

Сабаку запустить и не париться там прерывание будет с интервалом до нескольких секунд, вот и считай прерывания хоть до часа...
Реклама
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

Alkul писал(а):
neid писал(а):больше нет скажу, чем да)
Ну так надо все же с изучения матчасти начать.
С таймерами на самом деле особой сложности нет - если вкратце, надо задать режим работы, задать частоту тактирования и инициализировать регистр TCNT чтобы задать время, через которое произойдет переполнение.
Поищите в сети, уж по avr-кам то куча даже программных примеров и описание на русском.
так то в таймерах кое что знаю немного и делал проекты по отсчету времени, сидел по таймерам изучал именно для тиньки13... для меня непонятно как реализовать эти две функции в настройках мк... все что пришло в голову:

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

// Timer 0 output compare B interrupt service routine
interrupt [TIM0_COMPB] void timer0_compb_isr(void)
{
timer++; //считаем тики
if(timer==150) {s++;timer=0;}//секунды
TCNT0=0x00;
}
…
// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 37,500 kHz
// Mode: Fast PWM top=0xFF
// OC0A output: Non-Inverted PWM
// OC0B output: Disconnected
TCCR0A=0x83;
TCCR0B=0x04;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0xFA; // 37500/250=150 раз в 1сек

TIMSK0=0x08;
шим работает при таких настройках, таймер нет( в правильном ли я направлении вообще) и вообще возможно ли на данном мк?
Реклама
Потрогал лапой паяльник
Аватара пользователя
Сообщения: 386
Зарегистрирован: Чт окт 31, 2013 10:54:32

Сообщение alex38779 »

В аттини13 всего 1 таймер, к которому привязаны 2 канала шима.

Разве можно одновременно генерировать аппаратно шим и использовать какой режим одного и того же таймера(шим + какое прерывание например)?

Как вариант сделать программный шим, но он все ровно завязывается в таймер.. Но при этом будет использоваться прерывание от таймера(таймер шим генерировать не будет, а будет обрабатывать програмный шим!)
Контактная информация:
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

alex38779 писал(а):В аттини13 всего 1 таймер, к которому привязаны 2 канала шима.

Разве можно одновременно генерировать аппаратно шим и использовать какой режим одного и того же таймера(шим + какое прерывание например)?

Как вариант сделать программный шим, но он все ровно завязывается в таймер.. Но при этом будет использоваться прерывание от таймера(таймер шим генерировать не будет, а будет обрабатывать программный шим!)
с программный ШИМом разобрался как его реализовать с таймером по переполнению, не пойму как теперь считать секунды при частоте 9.6 и делители 1/1... по сравнению как то проще было, поделил, узнал целое число, и делов всего) подтолкните немного?))
вот мой код теперь такой:

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

#define PWR  PORTB.0

unsigned char PWR_1;       //переменная, для изменения скважности ШИМ в программе
unsigned char PWR_1_b;     //переменные, для буферизации значений скважности ШИМ
unsigned char timer;       //переменная- счетчик вызовов обработчика прерываний

// Timer 0 overflow interrupt service routine
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
timer++;


if (timer == 0){                                //если счетчик переполнился и принял значение 0
         
        PWR_1_b   = PWR_1;                          //сохранием значения в буфер
         
        PWR=1;                               //выставляем ноги, отвечающие за ШИМ в логическую 1 
        }
 
if (PWR_1_b   == timer) { PWR   = 0;}             //по достижении заданной скважности выводим логический 0 в ножку МК
TCNT0=0x00;
}

............

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 9600,000 kHz
// Mode: Normal top=0xFF
// OC0A output: Disconnected
// OC0B output: Disconnected
TCCR0A=0x00;
TCCR0B=0x01;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;

// Timer/Counter 0 Interrupt(s) initialization
TIMSK0=0x02;
        
// Global enable interrupts
#asm("sei")
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

alex38779 писал(а):Разве можно одновременно генерировать аппаратно шим и использовать какой режим одного и того же таймера(шим + какое прерывание например)?
Конечно можно. Флаги событий будут устанавливать в любом режиме точно так же, как и в нормальном. Кроме флага переполнения, надо смотреть как он устанавливается для каждого режима отдельно(Table 11-8. ).
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
akl
Друг Кота
Сообщения: 4463
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

neid писал(а):не пойму как теперь считать секунды при частоте 9.6 и делители 1/1...
Думаю, что переменная timer должна быть определена 16-разрядным беззнаковым числом, т.к. 9'600'000/256=37'500.
Прорезались зубы
Сообщения: 228
Зарегистрирован: Пн окт 04, 2010 11:55:41

Сообщение neid »

akl писал(а):
neid писал(а):не пойму как теперь считать секунды при частоте 9.6 и делители 1/1...
Думаю, что переменная timer должна быть определена 16-разрядным беззнаковым числом, т.к. 9'600'000/256=37'500.
тогда с шимом будут проблемы, ввести доп переменную

unsigned int t;
if(t==37500) {s++:}

Добавлено after 22 minutes 16 seconds:
Z_h_e писал(а):
alex38779 писал(а):Разве можно одновременно генерировать аппаратно шим и использовать какой режим одного и того же таймера(шим + какое прерывание например)?
Конечно можно. Флаги событий будут устанавливать в любом режиме точно так же, как и в нормальном. Кроме флага переполнения, надо смотреть как он устанавливается для каждого режима отдельно(Table 11-8. ).
если не трудно приведите пример пожалуйста
Собутыльник Кота
Аватара пользователя
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Сообщение Z_h_e »

neid писал(а):если не трудно приведите пример пожалуйста
Например запускаете таймер в режиме FAST PWM. Пускай будет режим №3. Т.е. счетчик считает от 0 до FF. В регистр OCRA загружаете некое число. Включает выход OCA. И все. У Вас молотит аппаратный ШИМ на ноге PB0.
Но флаги OCF0B OCF0A TOV0 регистра TIFR все равно будут выставляться согласно своим событиям. Если маска для данного флага установлена, в регистр TIMSK и прерывания разрешены глобально, то прерывание произойдет. А ШИМ как молотил так и будет, если Вы конечно не вмешаетесь в регистр TCNT.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Электрический кот
Аватара пользователя
Сообщения: 1031
Зарегистрирован: Чт июн 20, 2013 00:00:58
Откуда: москва, м.Сходненская

Сообщение Mishany »

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

void Init_Dog(void)
{
	WDTCR|=(1<<WDCE)|(1<<WDTIE)|(1<<WDP1)|(1<<WDP2);   //предделитель на 1 сек.
}
ISR (WDT_vect)
{
//считаем секунды
}
Ответить

Вернуться в «AVR»