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

 
 
> GPIO прерывания Rising/Falling edge приходят одновременно?
evgen2
сообщение Jan 10 2014, 17:43
Сообщение #1


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Есть дивайс для измерения температуры TMP03, с него идет ШИМ с частотой около 30 Гц.
Точнее - два дивайса. Выходы подаются на GPIO ноги, на которые можно назначить прерывания Rising/Falling edge. Микроконтроллер - lpc1768

Меряем одно время прихода Rising edge, меряем время прихода Falling edge, получаем два интервала времени, потом по формуле
Temp= CoeffSensorA + CoeffSensorB * td0 / dt1;

получаем температуру, и всё работает замечательно.

Только вот изредка меряется какая-то ерунда. Стал разбираться.

Сделал тест

Код
int TL[1000];
int TS[1000];
int tln=0;

void EINT3_IRQHandle(void)
{  int ti, v;
    static int tiold=0;
      ti = LPC_TIM1->TC;
        if((LPC_GPIOINT->IO0IntStatR &  0x00000001) || (LPC_GPIOINT->IO0IntStatF &  0x0000001)) // это ШИМ с первого TMP03
      { v = (LPC_GPIOINT->IO0IntStatR &  0x00000001) | (((LPC_GPIOINT->IO0IntStatF &  0x0000001)<<1));
        if(tln == 0)
             TL[tln] = ti;
        else
            TL[tln] = ti - tiold;
                tiold = ti;
        TS[tln] =v;  
        tln++;        
        if(tln == 1000)
           tln = 0;
                LPC_GPIOINT->IO0IntClr =0x00000001;
    }
       if((LPC_GPIOINT->IO0IntStatR &  0x00000002) || (LPC_GPIOINT->IO0IntStatF &  0x0000002)) // это ШИМ с второго TMP03
      {
          LPC_GPIOINT->IO0IntClr =0x00000002;
      }    
}


Смотрю на TS и вижу вот такое:

1
2
1
2
3 <== этого не может быть, потому что не может быть никогда
2
1
2
1

Т.е. одновременно приходит и Rising м Falling edge
причем, если смотреть на TL - никакого дребезга с небольшими временами не видно.
Одновременно Rising и Falling (3) получаются вроде бы точно вместо Rising (1), но это на небольшом интервале измерения. Причем, если Rising и Falling одновременно считать за Rising, то смотри начало - все меряется замечательно, кроме как изредка какая-то фигня. Причем эта фигня систематическая и не лечится усреднением. Связано ли это как-то с одновременным приходом Rising м Falling edge - пока неясно.

Сообщение отредактировал evgen2 - Jan 10 2014, 17:45
Go to the top of the page
 
+Quote Post
 
Start new topic
Ответов
evgen2
сообщение Jan 22 2014, 13:26
Сообщение #2


Местный
***

Группа: Участник
Сообщений: 236
Регистрация: 1-04-06
Пользователь №: 15 688



Пока резюме такое:

Пока не включаю I2C2 никакой потери GPIO прерываний нет

Код
void I2C2Init( void )
{
  LPC_SC->PCONP |= (1 << 26);

  /* set PIO0.10 and PIO0.11 to I2C2 SDA and SCL */
  /* function to 10 on both SDA and SCL. */
  LPC_PINCON->PINSEL0 &= ~((0x03<<20)|(0x03<<22));
  LPC_PINCON->PINSEL0 |= ((0x02<<20)|(0x02<<22));

  /*--- Clear flags ---*/
  LPC_I2C2->I2CONCLR = I2CONCLR_AAC | I2CONCLR_SIC | I2CONCLR_STAC | I2CONCLR_I2ENC;    

  /*--- Reset registers ---*/
  LPC_I2C2->I2SCLL   = I2SCLL_SCLL;
  LPC_I2C2->I2SCLH   = I2SCLH_SCLH;

  /* Install interrupt handler */
  NVIC_EnableIRQ(I2C2_IRQn);

  LPC_I2C2->I2CONSET = I2CONSET_I2EN;
  return;
}


Если вызываю I2C2Init - (и чуть поработаю с I2C - один раз прочитаю коффициенты) через произвольное время (от секунд до нескольких минут) )происходит потеря прерывания GPIO с последующим коротким, порядка 0.5 мкс "вторичным" или "ложным" прерыванием.

Если при этом (после инициализации и чтения коэффициентов) поставить брейкпонт в функции прерывания I2C2_IRQn, то отладчик туда не попадает, т.е. прерывания от I2C2 никак не могут "убить" прерывания GPI.

Такое впечатление, что прерывания запрещаются каким-то внутренним резидентным процессом, который непонятно как искать и непонятно как связан с I2C
cranky.gif

Go to the top of the page
 
+Quote Post

Сообщений в этой теме
- evgen2   GPIO прерывания Rising/Falling edge приходят одновременно?   Jan 10 2014, 17:43
- - Golikov A.   а сколько времени между падающим и восходящим? пре...   Jan 10 2014, 19:09
|- - alexdos   Цитата(Golikov A. @ Jan 10 2014, 22:09) а...   Jan 10 2014, 19:20
|- - Сергей Борщ   Цитата(alexdos @ Jan 10 2014, 21:20) Напл...   Jan 10 2014, 21:00
|- - evgen2   Цитата(Сергей Борщ @ Jan 11 2014, 01:00) ...   Jan 10 2014, 21:09
- - jcxz   А где у вас чтение IOIntStatus для квитирования пр...   Jan 11 2014, 16:14
|- - evgen2   Цитата(jcxz @ Jan 11 2014, 20:14) А где у...   Jan 11 2014, 16:22
||- - jcxz   Цитата(evgen2 @ Jan 11 2014, 22:22) Чего-...   Jan 11 2014, 16:25
|- - evgen2   Цитата(jcxz @ Jan 11 2014, 20:14) Уж не и...   Jan 11 2014, 16:38
|- - jcxz   Цитата(evgen2 @ Jan 11 2014, 22:38) и что...   Jan 11 2014, 17:13
|- - evgen2   Цитата(jcxz @ Jan 11 2014, 21:13) Я же уж...   Jan 11 2014, 17:42
|- - jcxz   Просто прочитать этот регистр. Чтение его - это и ...   Jan 11 2014, 18:10
|- - evgen2   Цитата(jcxz @ Jan 11 2014, 22:10) Просто ...   Jan 11 2014, 19:31
|- - evgen2   Цитата(jcxz @ Jan 11 2014, 22:10) Просто ...   Jan 13 2014, 16:26
- - KRS   Попробуйте в начале прерывания считать статусы Int...   Jan 22 2014, 18:35


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

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 18:07
Рейтинг@Mail.ru


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