|
lpc2148 + eint0 == интересная вестч, Подвешивает процессор в непредсказуемом месте |
|
|
|
Jul 3 2007, 10:17
|
Местный
  
Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107

|
Уважаемые господа. Я сталкнулся с проблемой странного поведения процессора при обработке eint0. Прерывание от кнопки. По спаду импульса. Инициализация такая:
{ PINSEL1_bit.P0_16=0x1; EXTINT = 0x01; VPBDIV = 0x0; EXTMODE = 0x01; VPBDIV = 0x00; VPBDIV = 0x00; // one-fourth VICIntSelect &= ~(1<<VIC_EINT0); VICVectAddr3 = (uint32_t)&HwInterrupt0Interrupt; VICVectCntl3 = 0x20 | VIC_EINT0;for external 0 VICIntEnable = (1<<VIC_EINT0); }
Причем VPBDIV = 0x00; вокруг других операций , между ними и их количество на работу не влияют.
Обработчик прерываний выглядит так:
volatile int intsrc;
__irq HwInterrupt0Interrupt() { EXTINT = 1; VICVectAddr = 0; intsrc = 1<<VIC_EINT0; }
Компилер - GCC. режим АРМ для всего кода и код генерится правильный (я глазками смотрю, да и другие прерывания рботают - УАРТ, ТАЙМЕР и т.д.)
Далее у меня бесконечный цикл в котором я анализирую intsrc и если она имеет флажок, то дергаю ногой процессора вот так:
while(1) { PCON = 1; if (intsrc & (1<<VIC_EINT0)) { FIO0CLR = 1 << 20; intsrc & ~(1<<VIS_EINT0); FIO0SET = 1 << 20; } }
И что интересно: Один раз ногой удается дернуть, а вот потом процессор сваливается в непредсказуемое состояние, которое не является обработчиком прерывания. Создается впечатление, что он вваливается в бесконечный цикл, но не понятно где... Отладчиком не посмотреть - это уже впаяно в изделие. PLL не задействована. Все кварцы генерят...
Вопрос - где грабли? (Вариант - дребезг - не предлагать!) Что надо еще прочитать?
Заранее благодарен, Дима
|
|
|
|
|
 |
Ответов
|
Jul 3 2007, 11:33
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(diwil @ Jul 3 2007, 13:17)  Один раз ногой удается дернуть... Сдается мне, что это Вам показалось  . Зависает он при инициализации. При инициализации именно INT0 по фронту есть еще дополнительный баг и рабочий вариант инициализации выглядит так: Код { PINSEL1_bit.P0_16=0x1; EXTINT = 0x01;
VPBDIV = 0x0; EXTMODE = 0x01; VPBDIV= 0x01; // Это по Errata VPBDIV = 0x00; // А это если INT0 настраивается, для остальных необязательно
VPBDIV = 0x00; // one-fourth VICIntSelect &= ~(1<<VIC_EINT0); VICVectAddr3 = (uint32_t)&HwInterrupt0Interrupt; VICVectCntl3 = 0x20 | VIC_EINT0;for external 0 VICIntEnable = (1<<VIC_EINT0); }
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 3 2007, 11:54
|
Местный
  
Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107

|
Цитата(zltigo @ Jul 3 2007, 15:33)  Сдается мне, что это Вам показалось  . Зависает он при инициализации. При инициализации именно INT0 по фронту есть еще дополнительный баг и рабочий вариант инициализации выглядит так: Код { PINSEL1_bit.P0_16=0x1; EXTINT = 0x01;
VPBDIV = 0x0; EXTMODE = 0x01; VPBDIV= 0x01; // Это по Errata VPBDIV = 0x00; // А это если INT0 настраивается, для остальных необязательно
VPBDIV = 0x00; // one-fourth VICIntSelect &= ~(1<<VIC_EINT0); VICVectAddr3 = (uint32_t)&HwInterrupt0Interrupt; VICVectCntl3 = 0x20 | VIC_EINT0;for external 0 VICIntEnable = (1<<VIC_EINT0); } А где можно эту эррата почитать? Ту, что у филипса вытаскиваю -0 ничего про это нет...
|
|
|
|
|
Jul 3 2007, 12:06
|

Гуру
     
Группа: Свой
Сообщений: 13 372
Регистрация: 27-11-04
Из: Riga, Latvia
Пользователь №: 1 244

|
Цитата(diwil @ Jul 3 2007, 14:54)  А где можно эту эррата почитать? Ту, что у филипса вытаскиваю -0 ничего про это нет... Не совсем понял - errata по на филипсе есть. А вот еще одной шаманской записи для обеспечения работоспособности именно INT0 в ней нет - это я уже сам пару лет назад, когда использовал все четыре, в полный рост... и почти случайно нашел как заставить работать. Полная  инструкция: Код // Set edle-sensetive Mode // The steps involved in the configuration of the EXTMODE and/or EXTPOLAR would be as follow:- // 1. Write 0x00 to VPBDIV // 2. Write the desired value to EXTMODE or EXTPOLAR register // 3. Write the same value to VPBDIV // 3a. Write 0x00 to VPBDIV (additional step for INT0 ) // 4. Restore the VPBDIV to the previously saved value or simply write to the register again // with the desired value.
VPBDIV = 0; // 1. ii = EXTMODE & ( EXTMODE_EXTMODE0|EXTMODE_EXTMODE1|EXTMODE_EXTMODE2|EXTMODE_EXTMODE3); // Get Curent Value ii |= EXTMODE_EXTMODE0; EXTMODE = ii; // 2. VPBDIV = ii; // 3. VPBDIV = 0; // 3a!!! VPBDIV = configBUS_CLK; // 4. 3a. Пункт от себя добавлен, остальное цитирует errata. Помогло?
--------------------
Feci, quod potui, faciant meliora potentes
|
|
|
|
|
Jul 3 2007, 12:20
|
Местный
  
Группа: Свой
Сообщений: 366
Регистрация: 5-09-06
Из: Санкт-Петербург
Пользователь №: 20 107

|
Цитата(zltigo @ Jul 3 2007, 16:06)  Не совсем понял - errata по на филипсе есть. А вот еще одной шаманской записи для обеспечения работоспособности именно INT0 в ней нет - это я уже сам пару лет назад, когда использовал все четыре, в полный рост... и почти случайно нашел. Помогло-то? примного благодарствую. Я еще не пробовал - вечером скажу... А в эрратах ничего подобного нет... Хотя нашел.. для 2129... спасибо еще раз. буду пробовать
|
|
|
|
Сообщений в этой теме
diwil lpc2148 + eint0 == интересная вестч Jul 3 2007, 10:17 Leen У атмела SAM7S наступал на такие грабли: 8-миуровн... Jul 3 2007, 10:27 diwil Цитата(Leen @ Jul 3 2007, 14:27) У атмела... Jul 3 2007, 10:58    zltigo Цитата(diwil @ Jul 3 2007, 15:20) Хотя на... Jul 3 2007, 12:24     diwil Значится разобрался... Этого бага в 2148 нет. Т.е.... Jul 3 2007, 17:31   GetSmart Цитата(zltigo @ Jul 3 2007, 18:06) Код //... Nov 7 2007, 14:53    zltigo Цитата(GetSmart @ Nov 7 2007, 16:53) Сдел... Nov 7 2007, 15:01
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|