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

Таймеры, Help

Добавлено: Пт фев 06, 2009 10:09:36
shtorm
Доброго времени суток, стоит задача измерить расход топлива на инжекторных двигателях. Нашел (т.е. помогли найти) полуготовый проект (http://www.telesys.ru/electronics/projects.php?do=p141), но код написан на IAR, а я в нем не "бум-бум", пытаюсь написать с нуля на CVAVR с отображением на LCD, но так как с таймерами еще не научился пользоваться прошу вашей помощи: мне нужно проверять"ногу"(какую имеено ногу незнаю, потомучто непонятно чем отличаеться T0 от INT0) по возрастающему фронту, и при срабатывании прерывания запускать таймер на подсчет тактов (посчитать длительность импульса) до того момента пока сигнал не пойдет на спад, если импульс пропал то все поновой...вот как реализованно это на IAR:

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

#pragma vector = INT1_vect                                                      // INT1 (
__interrupt void MY_INT1 (void)                                                 // стандартная запись)
{
    if ((MCUCR & Bit(ISC10)) != 0)                                              // прерывание произошло по нарастающему фронту
    {   TCCR1B = Bit(CS11);                                                     // запуск таймера c clk/8
        MCUCR &= ~Bit(ISC10);                                                   // сбрасываем бит в регистре MCUCR для инициализации следующего прерывания по спадающему фронту
    }
    else                                                                        // прерывание произошло по спаду
    {   TCCR1B = 0;                                                             // останов таймера
        MCUCR |= Bit(ISC10);                                                    // устанавливаем бит в регистре MCUCR для инициализации следующего прерывания по нарастающему фронту
        g_fors_time = g_time_ovf; 
	g_fors_time = g_fors_time <<16> 28)                                                        // 2 сек нет сигнала - 7372800/8/65536 = 14 (раз) - это 1 сек.(примерно)
    {TCCR1B = 0;                                                                // останов таймера
     MCUCR |= Bit(ISC10);                                                       // устанавливаем бит в регистре MCUCR для инициализации следующего прерывания по нарастающему фронту
     TCNT1 = 0; g_time_ovf=0;
     g_eesave_en=1;                                                             // ставим флаг для сохранения по этому событию в EE
    }    
}

подскажите пожалуста как настроить таймеры в CVAVR и какую ногу использовать T0(T1) или INT0(INT1) :oops:

Добавлено: Пт фев 06, 2009 14:54:20
shtorm
коечто догнал, нужно использовать INT0 для отслеживания внешних прерываний, сделал так:

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

interrupt [EXT_INT0] void ext_int0_isr(void)
{
   if(MCUCR==0x03){
    TCCR0=0x33;
    MCUCR=0x02;
    }else{
    g_fors_time = g_time_ovf; 
    g_fors_time = g_fors_time + TCNT0;
    g_full_time = g_full_time + g_fors_time;
    TCNT0 = 0; g_time_ovf=0; 
    TCCR0=0x00;
   MCUCR=0x03;
   }

}
только не понял чему равен TCNT0 во время включения таймера? т.е. это и есть кол-во тактов которое выполнил таймер за время своей работы? или я чтото не так понял?

Добавлено: Пт фев 06, 2009 15:13:23
Digital
Ещё в догонку :)

На примере ATMega16 (у других AVR почти также):

Вход Т0(Т1) - источник тактового сигнала для 8-bit таймера0 или 16-bit таймера1 соответственно. Т.е. таймер микроконтроллера (МК) может тактироваться или от: 1. Внутреннего RC 2. Внешнего "кварца" 3. От внешнего источника (по Т0(Т1)).

Входы INT0(1)(2) - входы внешних прерываний, т.е. по внешнему фронту или спаду (по чём срабатывать выбирается вами) внешнего сигнала вырабатывается прерывание, и, далле в программе (в обработчике внешнего прерывания) можно уже указать МК, что с ним делать, например запустить тот или иной таймер считать в течение необходимого времени и сохранить насчитанное значение в переменной для дальнейшей обработки, ну и т.д. и т.п. (т.е. то, что нужно от программы вам).

Добавлено: Пт фев 06, 2009 15:18:18
Digital
TCNT0 - счетный регистр таймера. Если 8-bit , то в TCNT0 значение будет меняться от 0 до 255. Если такой таймер остановить в какой-либо момент, то там окажется число в этих пределах.

А сначала TCNT0==0 (если не задать иного вручную).

Добавлено: Пт фев 06, 2009 15:20:28
shtorm
Digital ок понял :) а по поводу TCNT я правильно понял?

Добавлено: Пт фев 06, 2009 15:22:45
Digital
Что именно?

Добавлено: Пт фев 06, 2009 15:25:19
shtorm
пока я писал ты уже ответил

Добавлено: Пт фев 06, 2009 15:25:39
Digital
:)