Страница 1 из 1

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

Добавлено: Ср окт 19, 2016 16:42:34
neid
Смысл вопроса в следующем, накидал код для attiny13 в CVAVR для подогрева сидений авто, примитивен и прост, управление подогревом по ШИМ, глупо было бы не добавить функцию выключения по истечению определенного промежутка времени. Подскажите как в таком случае аппаратно настроить мк, в таймерах не шипко грамотен, могу только сделать отсчет времени по переполнению регистра сравнения.

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

Добавлено: Ср окт 19, 2016 17:12:19
Alkul
neid писал(а):Подскажите как в таком случае аппаратно настроить мк, в таймерах не шипко грамотен
Даташит на МК изучен?

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

Добавлено: Ср окт 19, 2016 19:37:51
neid
Alkul писал(а):
neid писал(а):Подскажите как в таком случае аппаратно настроить мк, в таймерах не шипко грамотен
Даташит на МК изучен?
больше нет скажу, чем да)

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

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

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

Добавлено: Ср окт 19, 2016 20:55:21
Mishany
Сабаку запустить и не париться там прерывание будет с интервалом до нескольких секунд, вот и считай прерывания хоть до часа...

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

Добавлено: Ср окт 19, 2016 22:05:22
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;
шим работает при таких настройках, таймер нет( в правильном ли я направлении вообще) и вообще возможно ли на данном мк?

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

Добавлено: Чт окт 20, 2016 08:49:51
alex38779
В аттини13 всего 1 таймер, к которому привязаны 2 канала шима.

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

Как вариант сделать программный шим, но он все ровно завязывается в таймер.. Но при этом будет использоваться прерывание от таймера(таймер шим генерировать не будет, а будет обрабатывать програмный шим!)

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

Добавлено: Чт окт 20, 2016 10:36:24
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")

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

Добавлено: Чт окт 20, 2016 10:37:52
Z_h_e
alex38779 писал(а):Разве можно одновременно генерировать аппаратно шим и использовать какой режим одного и того же таймера(шим + какое прерывание например)?
Конечно можно. Флаги событий будут устанавливать в любом режиме точно так же, как и в нормальном. Кроме флага переполнения, надо смотреть как он устанавливается для каждого режима отдельно(Table 11-8. ).

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

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

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

Добавлено: Чт окт 20, 2016 12:05:22
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. ).
если не трудно приведите пример пожалуйста

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

Добавлено: Чт окт 20, 2016 15:47:42
Z_h_e
neid писал(а):если не трудно приведите пример пожалуйста
Например запускаете таймер в режиме FAST PWM. Пускай будет режим №3. Т.е. счетчик считает от 0 до FF. В регистр OCRA загружаете некое число. Включает выход OCA. И все. У Вас молотит аппаратный ШИМ на ноге PB0.
Но флаги OCF0B OCF0A TOV0 регистра TIFR все равно будут выставляться согласно своим событиям. Если маска для данного флага установлена, в регистр TIMSK и прерывания разрешены глобально, то прерывание произойдет. А ШИМ как молотил так и будет, если Вы конечно не вмешаетесь в регистр TCNT.

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

Добавлено: Пт окт 21, 2016 14:24:24
Mishany

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

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