Таймеры, Help

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 185
Зарегистрирован: Чт янв 22, 2009 14:03:25

Сообщение 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:
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 185
Зарегистрирован: Чт янв 22, 2009 14:03:25

Сообщение 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 во время включения таймера? т.е. это и есть кол-во тактов которое выполнил таймер за время своей работы? или я чтото не так понял?
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 78
Зарегистрирован: Сб сен 13, 2008 16:23:09
Откуда: Kaluga

Сообщение Digital »

Ещё в догонку :)

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

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

Входы INT0(1)(2) - входы внешних прерываний, т.е. по внешнему фронту или спаду (по чём срабатывать выбирается вами) внешнего сигнала вырабатывается прерывание, и, далле в программе (в обработчике внешнего прерывания) можно уже указать МК, что с ним делать, например запустить тот или иной таймер считать в течение необходимого времени и сохранить насчитанное значение в переменной для дальнейшей обработки, ну и т.д. и т.п. (т.е. то, что нужно от программы вам).
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 78
Зарегистрирован: Сб сен 13, 2008 16:23:09
Откуда: Kaluga

Сообщение Digital »

TCNT0 - счетный регистр таймера. Если 8-bit , то в TCNT0 значение будет меняться от 0 до 255. Если такой таймер остановить в какой-либо момент, то там окажется число в этих пределах.

А сначала TCNT0==0 (если не задать иного вручную).
Последний раз редактировалось Digital Пт фев 06, 2009 15:41:24, всего редактировалось 1 раз.
Контактная информация:
Реклама
Эиком - электронные компоненты и радиодетали
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 185
Зарегистрирован: Чт янв 22, 2009 14:03:25

Сообщение shtorm »

Digital ок понял :) а по поводу TCNT я правильно понял?
Контактная информация:
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 78
Зарегистрирован: Сб сен 13, 2008 16:23:09
Откуда: Kaluga

Сообщение Digital »

Что именно?
Контактная информация:
Реклама
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 185
Зарегистрирован: Чт янв 22, 2009 14:03:25

Сообщение shtorm »

пока я писал ты уже ответил
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 78
Зарегистрирован: Сб сен 13, 2008 16:23:09
Откуда: Kaluga

Сообщение Digital »

:)
Контактная информация:
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»