Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Считывание регистров
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > ARM, 32bit
argentum
Скажите, пробовал кто-нибудь считывать регистры T0TC - T3TC у LPC2478?
Я всё время получаю нули!!!
А хотелось бы получить всё же истинное содержаение регистров.
toweroff
в студию код инициализации, опроса... телепаты в отпуске
argentum
Цитата(toweroff @ Jul 13 2010, 01:36) *
в студию код инициализации, опроса... телепаты в отпуске

Да... Простите)))
В том-то всё и дело, что драйвер простой, и взят с сайта NXP
Код
/******************************************************************************
** Descriptions:        Initialize timer, set timer interval, reset timer,
**                        install timer interrupt handler
**
** parameters:            timer number and timer interval
** Returned value:        true or false, if the interrupt handler can't be
**                        installed, return false.
******************************************************************************/
DWORD timer_init(BYTE timer_num, DWORD TimerInterval)
{
  switch (timer_num)
  {
    case 0:
     timer0_counter = 0;
     //T0MR0 = TimerInterval;
     T0MR0 = TimerInterval * (Fpclk / 1000-1);
     T0MCR = 3;                /* Interrupt and Reset on MR0 */
     return install_irq( TIMER0_INT, (void *)Timer0Handler, HIGHEST_PRIORITY );

   case 1:
     timer1_counter = 0;
     //T1MR0 = TimerInterval;
     T1MR0 = TimerInterval * (Fpclk / 1000-1);
     T1MCR = 3;                /* Interrupt and Reset on MR1 */
     return install_irq( TIMER1_INT, (void *)Timer1Handler, HIGHEST_PRIORITY );

  case 2:
     timer2_counter = 0;
     //T1MR0 = TimerInterval;
     T2MR0 = TimerInterval * (Fpclk / 1000-1);
     T2MCR = 3;                /* Interrupt and Reset on MR1 */
     return install_irq( TIMER2_INT, (void *)Timer2Handler, HIGHEST_PRIORITY );

    case 3:
     timer3_counter = 0;
     //T1MR0 = TimerInterval;
     T3MR0 = TimerInterval * (Fpclk / 1000-1);
     T3MCR = 3;                /* Interrupt and Reset on MR1 */
     return install_irq( TIMER3_INT, (void *)Timer3Handler, HIGHEST_PRIORITY );

    default:
               return (FALSE);
  }
}


Ну а считать пытаюсь простым:
Код
a = T0TC;

toweroff
Код
    //--- Timer 0  - interrupt 10 ms

    T0PR = 0;  //-- Prscaler = 0
    T0PC = 0;

    T0MR0 = 18000 * 10; //TimerInterval;
    T0MCR = 3; //-- bit 0=1 -int on MR0 , bit 1=1 - Reset on MR0

    T0TCR = 1; //-- Timer 0 - run


посмотрите, как там у Вас с частотой на таймер, вообще стартап. В моем случае 72/4=18, отсюда T0MR0 = 18000 * 10 для 10мс

и опять же - в каком месте вызывается чтение? может, оно так получается, что вызываете как раз в состоянии счетчика 0 laughing.gif
esaulenka
На 2368 всё работает, как ни странно.

В какой момент считываете?
Таймер в это время работает? Запуск что-то не наблюдаю...
toweroff
Цитата(esaulenka @ Jul 13 2010, 11:25) *
Запуск что-то не наблюдаю...

во-во...
T0TCR = 1; //-- Timer 0 - run
где?
argentum
Прошу прощения ещё раз.
Запуск происходт в функции timer_enable сразу после инициализации. Драйвер вот:
CODE

/******************************************************************************
** Function name: enable_timer
**
** Descriptions: Enable timer
**
** parameters: timer number: 0 or 1
** Returned value: None
**
******************************************************************************/
void timer_enable(BYTE timer_num)
{
if ( timer_num == 0 )
{
T0TCR = 1;
}
else if ( timer_num == 1 )
{
T1TCR = 1;
}
else if ( timer_num == 2 )
{
T2TCR = 1;
}
else if ( timer_num == 3 )
{
T3TCR = 1;
}
return;
}


Цитата(esaulenka @ Jul 13 2010, 11:25) *
В какой момент считываете?


Считывается в while...


Цитата(toweroff @ Jul 13 2010, 11:23) *
[code] //--- Timer 0 - interrupt 10 ms
посмотрите, как там у Вас с частотой на таймер, вообще стартап. В моем случае 72/4=18, отсюда T0MR0 = 18000 * 10 для 10мс
и опять же - в каком месте вызывается чтение? может, оно так получается, что вызываете как раз в состоянии счетчика 0 laughing.gif

Прерывания-то происходят, а считать ничего не удаётся.
Так как считывание происходит в цикле while(1), то попадать всегда в T0TC = 0, кажется невероятным
DpInRock
И где этот while?
argentum
Закрываю тему. Проблема была в следующем: я пытался считать значение счётчик Таймера 3, инициализируя его по аналогии с Таймером 0. Но для Таймера 3 нужно дополнительно устанавливать соответствующий бит в регистре PCONP: PCONP |= (1<<23);
Спасибо за отклики.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.