attiny13: реализация шим и таймер времени
- Сообщения: 228
- Зарегистрирован: Пн окт 04, 2010 11:55:41
Смысл вопроса в следующем, накидал код для attiny13 в CVAVR для подогрева сидений авто, примитивен и прост, управление подогревом по ШИМ, глупо было бы не добавить функцию выключения по истечению определенного промежутка времени. Подскажите как в таком случае аппаратно настроить мк, в таймерах не шипко грамотен, могу только сделать отсчет времени по переполнению регистра сравнения.
- Реклама
Даташит на МК изучен?neid писал(а):Подскажите как в таком случае аппаратно настроить мк, в таймерах не шипко грамотен
- Сообщения: 228
- Зарегистрирован: Пн окт 04, 2010 11:55:41
больше нет скажу, чем да)Alkul писал(а):Даташит на МК изучен?neid писал(а):Подскажите как в таком случае аппаратно настроить мк, в таймерах не шипко грамотен
Ну так надо все же с изучения матчасти начать.neid писал(а):больше нет скажу, чем да)
С таймерами на самом деле особой сложности нет - если вкратце, надо задать режим работы, задать частоту тактирования и инициализировать регистр TCNT чтобы задать время, через которое произойдет переполнение.
Поищите в сети, уж по avr-кам то куча даже программных примеров и описание на русском.
Сабаку запустить и не париться там прерывание будет с интервалом до нескольких секунд, вот и считай прерывания хоть до часа...
- Реклама
- Сообщения: 228
- Зарегистрирован: Пн окт 04, 2010 11:55:41
так то в таймерах кое что знаю немного и делал проекты по отсчету времени, сидел по таймерам изучал именно для тиньки13... для меня непонятно как реализовать эти две функции в настройках мк... все что пришло в голову:Alkul писал(а):Ну так надо все же с изучения матчасти начать.neid писал(а):больше нет скажу, чем да)
С таймерами на самом деле особой сложности нет - если вкратце, надо задать режим работы, задать частоту тактирования и инициализировать регистр TCNT чтобы задать время, через которое произойдет переполнение.
Поищите в сети, уж по avr-кам то куча даже программных примеров и описание на русском.
Код: Выделить всё
// 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
В аттини13 всего 1 таймер, к которому привязаны 2 канала шима.
Разве можно одновременно генерировать аппаратно шим и использовать какой режим одного и того же таймера(шим + какое прерывание например)?
Как вариант сделать программный шим, но он все ровно завязывается в таймер.. Но при этом будет использоваться прерывание от таймера(таймер шим генерировать не будет, а будет обрабатывать програмный шим!)
Разве можно одновременно генерировать аппаратно шим и использовать какой режим одного и того же таймера(шим + какое прерывание например)?
Как вариант сделать программный шим, но он все ровно завязывается в таймер.. Но при этом будет использоваться прерывание от таймера(таймер шим генерировать не будет, а будет обрабатывать програмный шим!)
- Сообщения: 228
- Зарегистрирован: Пн окт 04, 2010 11:55:41
с программный ШИМом разобрался как его реализовать с таймером по переполнению, не пойму как теперь считать секунды при частоте 9.6 и делители 1/1... по сравнению как то проще было, поделил, узнал целое число, и делов всего) подтолкните немного?))alex38779 писал(а):В аттини13 всего 1 таймер, к которому привязаны 2 канала шима.
Разве можно одновременно генерировать аппаратно шим и использовать какой режим одного и того же таймера(шим + какое прерывание например)?
Как вариант сделать программный шим, но он все ровно завязывается в таймер.. Но при этом будет использоваться прерывание от таймера(таймер шим генерировать не будет, а будет обрабатывать программный шим!)
вот мой код теперь такой:
Код: Выделить всё
#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")Конечно можно. Флаги событий будут устанавливать в любом режиме точно так же, как и в нормальном. Кроме флага переполнения, надо смотреть как он устанавливается для каждого режима отдельно(Table 11-8. ).alex38779 писал(а):Разве можно одновременно генерировать аппаратно шим и использовать какой режим одного и того же таймера(шим + какое прерывание например)?
Думаю, что переменная timer должна быть определена 16-разрядным беззнаковым числом, т.к. 9'600'000/256=37'500.neid писал(а):не пойму как теперь считать секунды при частоте 9.6 и делители 1/1...
- Сообщения: 228
- Зарегистрирован: Пн окт 04, 2010 11:55:41
тогда с шимом будут проблемы, ввести доп переменнуюakl писал(а):Думаю, что переменная timer должна быть определена 16-разрядным беззнаковым числом, т.к. 9'600'000/256=37'500.neid писал(а):не пойму как теперь считать секунды при частоте 9.6 и делители 1/1...
unsigned int t;
if(t==37500) {s++:}
Добавлено after 22 minutes 16 seconds:
если не трудно приведите пример пожалуйстаZ_h_e писал(а):Конечно можно. Флаги событий будут устанавливать в любом режиме точно так же, как и в нормальном. Кроме флага переполнения, надо смотреть как он устанавливается для каждого режима отдельно(Table 11-8. ).alex38779 писал(а):Разве можно одновременно генерировать аппаратно шим и использовать какой режим одного и того же таймера(шим + какое прерывание например)?
Например запускаете таймер в режиме FAST PWM. Пускай будет режим №3. Т.е. счетчик считает от 0 до FF. В регистр OCRA загружаете некое число. Включает выход OCA. И все. У Вас молотит аппаратный ШИМ на ноге PB0.neid писал(а):если не трудно приведите пример пожалуйста
Но флаги OCF0B OCF0A TOV0 регистра TIFR все равно будут выставляться согласно своим событиям. Если маска для данного флага установлена, в регистр TIMSK и прерывания разрешены глобально, то прерывание произойдет. А ШИМ как молотил так и будет, если Вы конечно не вмешаетесь в регистр TCNT.
Код: Выделить всё
void Init_Dog(void)
{
WDTCR|=(1<<WDCE)|(1<<WDTIE)|(1<<WDP1)|(1<<WDP2); //предделитель на 1 сек.
}
ISR (WDT_vect)
{
//считаем секунды
}



