|
Несколько прерываний, Как разрулить? |
|
|
|
Mar 30 2011, 12:12
|
Участник

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

|
Нужно ловить два сигнала от датчиков (для простоты прямоугольные). Первый сигнал нужно измерить его длительность. Для второго сигнала просто считать количество (при каждом импульсе инкремент некоей переменной). Решил повесить эти два сигнала на INT0 и INT1. Но как разрулить - не пойму. Если по INT0 начинать считать длительность, то для этого нужен ещё и таймер. Значит третье прерывание добавляется. А что будет, если придет прерывание INT1? В общем каша образовалась. Может проще сделать вообще без прерываний, тупо в цикле опрашивать порт и смотреть, появились импульсы или нет и реагировать, если они появились? Что посоветуете?
Сообщение отредактировал Ruffian - Mar 30 2011, 12:13
|
|
|
|
|
 |
Ответов
|
Apr 1 2011, 19:49
|
Участник

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

|
К сожалению, не удается. Даже период. Сделал иначе: подаю сигнал на INT0 и его же через инвертор на INT1. В обработчике INT0 обнуляю таймер/счётчик, в обработчике INT1 останавливаю таймер, снимаю с него количество тиков, сохраняю их и перезапуск таймера. Правда используется два входа прерывания.
|
|
|
|
|
Apr 2 2011, 15:10
|

фанат дивана
     
Группа: Свой
Сообщений: 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; }
--------------------
Если бы я знал, что такое электричество...
|
|
|
|
|
Apr 2 2011, 18:35
|

Частый гость
 
Группа: Участник
Сообщений: 78
Регистрация: 8-12-09
Пользователь №: 54 138

|
Цитата(AHTOXA @ Apr 2 2011, 18:10)  Странно, там же нет ничего сложного: Согласен, только нужно измерять длительность импульса, а не период. Правильнее будет так: CODE volatile uint16_t long_time; volatile uint32_t pulse_time; volatile uint32_t pause_time; volatile uint8_t flag = 0;
void ic_init(void) { TCCR1A = 0; TCCR1B |= (1<<ICNC1)|(1<<ICES1)|(1<<CS10); // здесь, возможно, нужно выбрать другой prescaler TIMSK |= (1<<TICIE1)|(1<<TOIE1); TIFR = (1<<ICF1)|(1<<TOV1); asm("sei"); }
SIGNAL(SIG_OVERFLOW1) { long_time++; if(long_time==0) { // overflow detected! Обработка переполнения (если нужно) } }
SIGNAL(SIG_INPUT_CAPTURE1) { uint16_t ticks;
TCNT1=0; ticks = ICR1; long_time = 0; if(TCCR1B & (1<<ICES1)) { //rising edge detected pause_time = long_time; pause_time = (pause_time<<16) | ticks; TCCR1B &= ~(1<<ICES1); // switch to detect falling edge } else { //falling edge detected pulse_time = long_time; pulse_time = (pulse_time<<16) | ticks; TCCR1B |= 1<<ICES1; // switch to detect rising edge } flag = 1; // new data arrived }
void main_loop( void ){
while(1) { if(flag) { // Здесь обрабатываем поступившие данные flag=0; } } }
Сообщение отредактировал nk@ - Apr 2 2011, 18:36
|
|
|
|
Сообщений в этой теме
Ruffian Несколько прерываний Mar 30 2011, 12:12 AHTOXA Цитата(Ruffian @ Mar 30 2011, 18:12) Что ... Mar 30 2011, 12:40 Ruffian Цитата(AHTOXA @ Mar 30 2011, 16:40) Для и... Mar 30 2011, 19:41 -SANYCH- ЦитатаISR(TIMER1_CAPT_vect){
if (PORTA ==... Mar 30 2011, 20:12 Ruffian Да, очепятка.
Правда это ничего не меняет. Прерыва... Mar 30 2011, 20:54 nk@ Цитата(Ruffian @ Mar 30 2011, 23:54) Да, ... Mar 31 2011, 04:03 Ruffian Я конечно тупой, но не настолько чтобы об этом н... Mar 31 2011, 08:05 AHTOXA Попробуйте для начала настроить захват на фронт, н... Mar 31 2011, 09:29   Ruffian Дело не в том, как посчитать длительность или пери... Apr 2 2011, 20:54 -SANYCH- Попробуйте вычитать данные с регистра захвата тай... Apr 2 2011, 11:01 nk@ Странно. С инициализацией вроде все правильно. Мо... Apr 2 2011, 21:25
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|