Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: проц игнорирует LPM0
Форум разработчиков электроники ELECTRONIX.ru > Микроконтроллеры (MCs) > MSP430
Shtirlich
есть чип F2012 с включенными шим и ацп. работаю в IAR 4.21.2. ацп будит проц из LPM0 когда готово измерение. дальше решаем что делать - продолжать работать или подать сигнал о завершении.
суть проблемы в следующем: первая функция входа в сон выполняется один раз из 20-ти, вторая (внутри цикла) всегда. то есть процессор на первой функции чето выполняет и.. идет дальше, не заморачиваясь на всякие там прерывания с участием АЦП.
со второй функцией все ок, если в нее попасть. доходим, ждем, прыгаем в прерывание, сравниваем - все по логике.

в даташите сказано, что при установке бита CPUOFF подействовать должно "мгновенно". неужели функция криво выполняется именно в этом месте?
можно ли руками, без intrinsic записать нужные биты? веть если как указано словом писать что делать с N Z и С в регистре SR?

p.s. сломал голову, отладку и один eZ430U

Код
//если нажат P1.3*************************************************    
  if (!(BIT3 & P1IN))              
  {
   ADC10CTL1 = INCH_0;                       // input A1
   ADC10AE0 |= BIT0;                         // PA.0 ADC option select
   ADC10CTL0 = ADC10ON + ADC10IE;            //interrupt enabled
   ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
   //__bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit
   __low_power_mode_0();

   //конфигурим шим
   P1DIR |= BIT2;                          // P1.2 = output
   P1SEL |= BIT2;                          // P1.2 = TA1 output  
      
   while (ADC10MEM > 0x2E1)                   //пока акум выше 10,8 вольт
    {
      P1OUT |= BIT7;                          //зажеч P1.7 (желтый)
      
      ADC10CTL0 |= ENC + ADC10SC;             // Sampling and conversion start
     // __bis_SR_register(CPUOFF + GIE);        // LPM0, ADC10_ISR will force exit
      __low_power_mode_0();
      
    
      if (ADC10MEM > 0x311)                   // если акум больше 11,5 V
      TACCR1 = 511;                           // TACCR1 PWM Duty Cycle 100%
      else
      TACCR1 = 255;                           // TACCR1 PWM Duty Cycle 50%
    }//конец  while
rezident
Цитата(Shtirlich @ Dec 11 2009, 03:23) *
можно ли руками, без intrinsic записать нужные биты? веть если как указано словом писать что делать с N Z и С в регистре SR?
Любой другой выдуманный вариант все равно приведет к тому же самому результату - манипуляцией с битами регистра SR. Так зачем еще что-то выдумывать?
__bis_SR_register() и __biс_SR_register() изменяют только те биты, которые указаны как аргумент вызова функции.

Цитата(Shtirlich @ Dec 11 2009, 03:23) *
в даташите сказано, что при установке бита CPUOFF подействовать должно "мгновенно". неужели функция криво выполняется именно в этом месте?
А как вы проверяете? Небось под отладчиком? wink.gif
Shtirlich
совсем не хочется что то выдумывать, но то что есть работать отказывается cranky.gif . функция явно сбоит. смотрел естественно все в отладчике.
лоу повер вобщем нужен только для ожидания момента, когда измерение будет готово. можно конечно в цикле ждать флага, но так правельнее.
rezident
Вы делаете заключение о неработоспособности только потому, что у вас в отладчик проскакивает эту функцию? Я не вижу обработчика прерывания от ADC, но могу предположить, что в нем есть функция выхода из режима LPM0. Так? Непосредственно перед командой перехода в LPM0 вы разрешаете прерывание от ADC и запускаете преобразование. Что должно произойти дальше по логике? дальше ADC должен сделать преобразование в результате которого возникает прерывание и переход по вектору прерывания ADC. А там видимо стоит выход из LPM0. Вот ваш отладчик и не фиксирует этого перехода в LMP0. Просто не может/не успевает laughing.gif Вести отладку режимов энергосбережения с помощью эмулятора весьма проблематично. Попробуйте другой способ. Например, "дрыгать ножкой" MSP430 перед входом в режим энергосбережения и после выхода из него. Уверен, что будет все работать так, как предполагается у вас в программе.
Ну и еще один хинт. Опишите обработчики для всех векторов прерываний. Даже для тех, которые не используются.
Shtirlich
Цитата(rezident @ Dec 12 2009, 03:45) *
Ну и еще один хинт. Опишите обработчики для всех векторов прерываний. Даже для тех, которые не используются.


мысль грамотная, спасибо. правда как у ламера у меня это врятли нормально получится, только больше ошибок наделаю. но решение в обход нашлось: если еще перед main просто запустить АЦП на одно измерение по той же схеме в прерывание не входим (точнее выходим из LPM0, видимо по другому прерыванию), но (!) при последующих запусках все уже ок. самое интересное, что это таинственной прерывание видимо самим АЦП и вызывается. ибо если start посредством ADC10SC не устанавливаем спокойно спим вечно.
чтение даташита на семейство ничего не прояснило. я понимаю, что прерывание АЦП генериться при установке IFG? и флаг при выполнении прерывания обнуляется? видимо я чегото недопонимаю..
rezident
Цитата(Shtirlich @ Dec 15 2009, 15:26) *
мысль грамотная, спасибо. правда как у ламера у меня это врятли нормально получится, только больше ошибок наделаю.
В конце хедера msp430x20x2.h есть список всех векторов прерываний. Как можно ошибиться при копи-пасте? wink.gif Cделайте на каждый вектор по "заглушке-ловушке", типа такой
Код
#pragma vector=PORT1_VECTOR
#pragma type_attribute=__interrupt
void PORT1_ISR(void)
{ for (;;);
}

Если какое-то неиспользуемое прерывание почему-то вдруг вызывается, то вы поймаете его в такой ловушке.
Цитата(Shtirlich @ Dec 15 2009, 15:26) *
чтение даташита на семейство ничего не прояснило.
Читать нужно User's Guide, а не только (не столько) даташит.
Цитата(Shtirlich @ Dec 15 2009, 15:26) *
я понимаю, что прерывание АЦП генериться при установке IFG? и флаг при выполнении прерывания обнуляется? видимо я чегото недопонимаю..
Да, вполне правильно. ADC10IFG устанавливается по окончании преобразования АЦП и сбрасывается при переходе по вектору ADC10_VECTOR или его можно очистить программно.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.