реклама на сайте
подробности

 
 
> Несколько прерываний, Как разрулить?
Ruffian
сообщение Mar 30 2011, 12:12
Сообщение #1


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



Нужно ловить два сигнала от датчиков (для простоты прямоугольные).
Первый сигнал нужно измерить его длительность.
Для второго сигнала просто считать количество (при каждом импульсе инкремент некоей переменной).
Решил повесить эти два сигнала на INT0 и INT1. Но как разрулить - не пойму.
Если по INT0 начинать считать длительность, то для этого нужен ещё и таймер. Значит третье прерывание добавляется. А что будет, если придет прерывание INT1?
В общем каша образовалась.
Может проще сделать вообще без прерываний, тупо в цикле опрашивать порт и смотреть, появились импульсы или нет и реагировать, если они появились?
Что посоветуете?

Сообщение отредактировал Ruffian - Mar 30 2011, 12:13
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
Ruffian
сообщение Apr 1 2011, 19:49
Сообщение #2


Участник
*

Группа: Участник
Сообщений: 19
Регистрация: 4-03-11
Пользователь №: 63 397



К сожалению, не удается. Даже период.
Сделал иначе: подаю сигнал на INT0 и его же через инвертор на INT1. В обработчике INT0 обнуляю таймер/счётчик, в обработчике INT1 останавливаю таймер, снимаю с него количество тиков, сохраняю их и перезапуск таймера.
Правда используется два входа прерывания.
Go to the top of the page
 
+Quote Post
AHTOXA
сообщение Apr 2 2011, 15:10
Сообщение #3


фанат дивана
******

Группа: Свой
Сообщений: 3 387
Регистрация: 9-08-07
Из: Уфа
Пользователь №: 29 684



Цитата(Ruffian @ Apr 2 2011, 01:49) *
К сожалению, не удается. Даже период.

Странно, там же нет ничего сложного:
Код
static u16    long_time;
u32 impulse_len;

void ic_init(void)
{
    TCCR1A = 0;
    TCCR1B |= _BV(ICNC1) | _BV(CS10) | _BV(ICES1);;
    TIMSK |= _BV(TICIE1) | _BV(TOIE1);
    TIFR = _BV(ICF1) | _BV(TOV1);
}

SIGNAL(SIG_OVERFLOW1)
{
    long_time++;
}

SIGNAL(SIG_INPUT_CAPTURE1)
{
    static u32 prev_ticks = 0;    
    u16 icr = ICR1;
    u32 ticks;

    LoWord(ticks) = icr;
    HiWord(ticks) = long_time;

    if ((ticks < prev_ticks) && HiWord(ticks))
        HiWord(ticks)++;

    impulse_len = ticks - prev_ticks;
    prev_ticks = ticks;
}


--------------------
Если бы я знал, что такое электричество...
Go to the top of the page
 
+Quote Post

Сообщений в этой теме


Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 5th August 2025 - 08:50
Рейтинг@Mail.ru


Страница сгенерированна за 0.01349 секунд с 7
ELECTRONIX ©2004-2016