msp430 и таймерА ...всётаки косяк

Если ваш вопрос не влез ни в одну из вышеперечисленных тем, вам сюда.
Ответить
dzrkot
Открыл глаза
Сообщения: 75
Зарегистрирован: Чт авг 29, 2013 08:02:24

msp430 и таймерА ...всётаки косяк

Сообщение dzrkot »

IDE: IAR , контер - msp430f5435
проблема в том, что я настраиваю сигналы MCLK и SMCLK на работу от DC0CLK , в свою очередь сигнал DC0CLK должен формироваться автоматически при помощи FFL и внешнего часового кварца 32КГц, который сидит на XIN XOUT, эти порты я вкл в альтернативном режиме. Вот таймерА работает от SCLKA , и должен срабатывать примерно каждые 10мс, соответственно в прерывании счётчик, который каждые 100 (ну т.е. 1 с) и каждые 200 (2с) должен вкл и выкл диоды, но онэто делает каждые 2 и 4 с соответственно...Вообщем я уже проверил, все делители отключены, в чём причина я не понимаю... (осцилографа увы у меня тут нет )
сам код:

Код: Выделить всё

#include "io430f5435.h"
#include <string.h>
/*   Pins   */
#define pin0 (0x01)
#define pin1 (0x02)
#define pin2 (0x04)
#define pin3 (0x08)
#define pin4 (0x10)
#define pin5 (0x20)
#define pin6 (0x40)
#define pin7 (0x80)

#define i2cMode (0x06)
/*   State M
#define M1 (0x01)
#define M2 (0x02)
#define M3 (0x04)
#define M4 (0x08)
#define M5 (0x10)
#define M6 (0x20)
*/

void Initialization();

unsigned char state=0x01;              // бит состояния М1 ... М6
unsigned char myAdress=(0x00);         // под адресс (GA0-GA2)
unsigned int blinkCounter=0;

#pragma vector = TIMER0_A0_VECTOR
__interrupt void TIMER_A0(void)                                                 // прерывание по флагу TA0CCR0 CCIFG0
{
    blinkCounter++;
    if (blinkCounter==100)
      P1OUT |= 0xA0;  
      //P1OUT &= (~0xA0);

    if (blinkCounter==300)
    {
    P1OUT &= 0x5F;   
    blinkCounter=0;
    }
}


int main( void )
{
  WDTCTL = WDTPW + WDTHOLD;
  Initialization();
    for(;;)
    { 
    }
}

void Initialization()   // инициализация периферии
{
   
/* настройка модуля синхронизации */
  {
    //UCSCTL1|=DISMOD_L;                                                          // UCSCTL1|=DISMOD_L;
                                                                                // DISMOD_L - откл MODULATION но мб он оключает калибровку DCOCLK
    P7SEL |= 0x03;
    UCSCTL6|=XT1BYPASS;
    
    UCSCTL4|=SELM_3|SELS_3;                                                     // UCSCTL4|=SELM_3|SELS_3;
                                                                                // SELM_3 - MCLK работает от DCOCLK; fDCOCLK = 2.097152 MHz.
                                                                                // SELS_3 - SMCLK работает от DCOCLK;
  }
/*      настрйока таймера А          */
  {
  // TA0R - Регистр счётчика Таймера А, в нём содержится начальное значение таймера, по def =0x0000;
     TA0CCTL0|=CCIE ;                                                           // CCIE - разрешение прерываний по достижении TA0CCR0
     UCSCTL2&=0x8fff;
     TA0CTL|=TASSEL1|MC0|TACLR;                                                 // TA0CTL|=TASSEL1|MC0|TAIE;  TA0CTL - регистр настройки таймера А
                                                                                // TASSEL1 - тактирование от SMCLK
     
                                                                                // MC0 - счет от 0000h до TAxCCR0
                                                                                // TAIE - включаем прерывание .....откл т.к. это видимо при FFFFh
                                                                                // TACLR - обнуление таймера-счётчика
     TA0CCR0|=0x51EC;                                                           // TA0CCR0 - регистр сравнения 51EC = 20972 = 10мс для 2.097МГц
  }
  P1DIR |= 0xA0;
  P1OUT |= 0xA0;
  __enable_interrupt();
}
Реклама
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: msp430 и таймерА ...всётаки косяк

Сообщение Ser60 »

Все правильно, так и быть должно. Читайте внимательнее секцию 5.2: "FLL stabilizes MCLK and SMCLK to 1.048576 MHz and fDCO = 2.097152 MHz". Т.е. с дефолтными установками частота MCLK/SMCLK в 2 раза ниже частоты DCO, отсюда и временные интервалы таймера в 2 раза больше
Реклама
dzrkot
Открыл глаза
Сообщения: 75
Зарегистрирован: Чт авг 29, 2013 08:02:24

Re: msp430 и таймерА ...всётаки косяк

Сообщение dzrkot »

Ser60 писал(а):Все правильно, так и быть должно. Читайте внимательнее секцию 5.2: "FLL stabilizes MCLK and SMCLK to 1.048576 MHz and fDCO = 2.097152 MHz". Т.е. с дефолтными установками частота MCLK/SMCLK в 2 раза ниже частоты DCO, отсюда и временные интервалы таймера в 2 раза больше
да...видимо я перевёл некорректно...
я думал что SMCLK и MCLK я могу тактировать от DC0, и они будут 2.097МГц , т.к. дефолтно они тактируются не от DCOCLK, а от DC0DIV(...не помню как точно, нету под рукой сейчас Guide, там сигнал образуется делителем от DC0, я думаю вы понимаете о чём я), вот поэтому я ставил его от DC0LK в надежде получить эти 2МГц....
Если я не правильно понял, то как тогда мне их получить, иожно как-то или нет?
Таймер то конечно можно и пересчитать, не проблема, но мне необходимо чтобы MCLK работал на 2МГц...
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: msp430 и таймерА ...всётаки косяк

Сообщение Ser60 »

Уберите эту строчку из кода:
UCSCTL2 &= 0x8fff;
Реклама
Эиком - электронные компоненты и радиодетали
dzrkot
Открыл глаза
Сообщения: 75
Зарегистрирован: Чт авг 29, 2013 08:02:24

Re: msp430 и таймерА ...всётаки косяк

Сообщение dzrkot »

Ser60 писал(а):Уберите эту строчку из кода:
UCSCTL2 &= 0x8fff;
всёравно работать не будет, это уж попытка найти в чём причина....
это принудительная попытка выставить делитель в 1, т.к. он выставлен на 2 по дефолту, но в гиде написано что он даже при выставленной 1 всёравно 2, т.е. это его минимум...
я уже просто на всякий случай попробовал
Реклама
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: msp430 и таймерА ...всётаки косяк

Сообщение Ser60 »

А все-же сделайте как я советовал. Этим настройки FLL вернутся к дефолтным за исключением установок SELS и SELM в регистре UCSCTL4. В этом регистре частоты MSCK и SMSCK дефолтно берутся с выхода прескейлера в FLL и равны DCO/2 = 1 мгц (см. рис 5.1 в ДШ). Установив SELS и SELM в 3 эти частоты будут браться с выхода DCO модулятора, которые в 2 раза выше. Т.е. частота тактирования МК будет 2 мгц.

Кстати, строчку
UCSCTL6 |= XT1BYPASS;
тоже удалите. Она там совсем не по делу.
Реклама
dzrkot
Открыл глаза
Сообщения: 75
Зарегистрирован: Чт авг 29, 2013 08:02:24

Re: msp430 и таймерА ...всётаки косяк

Сообщение dzrkot »

Ser60 писал(а):А все-же сделайте как я советовал. Этим настройки FLL вернутся к дефолтным за исключением установок SELS и SELM в регистре UCSCTL4. В этом регистре частоты MSCK и SMSCK дефолтно берутся с выхода прескейлера в FLL и равны DCO/2 = 1 мгц (см. рис 5.1 в ДШ). Установив SELS и SELM в 3 эти частоты будут браться с выхода DCO модулятора, которые в 2 раза выше. Т.е. частота тактирования МК будет 2 мгц.

Кстати, строчку
UCSCTL6 |= XT1BYPASS;
тоже удалите. Она там совсем не по делу.
удалил обе строчки, изменений нет :(
dzrkot
Открыл глаза
Сообщения: 75
Зарегистрирован: Чт авг 29, 2013 08:02:24

Re: msp430 и таймерА ...всётаки косяк

Сообщение dzrkot »

Ser60 писал(а): ... за исключением установок SELS и SELM в регистре UCSCTL4. В этом регистре частоты MSCK и SMSCK дефолтно берутся с выхода прескейлера в FLL и равны DCO/2 = 1 мгц (см. рис 5.1 в ДШ). Установив SELS и SELM в 3 эти частоты будут браться с выхода DCO модулятора, которые в 2 раза выше. Т.е. частота тактирования МК будет 2 мгц.
я так и делаю, выставляю вот этим UCSCTL4|=SELM_3|SELS_3; работу SMCLK и MCLK от DCOCLK
мб всётаки по дефолту где-то делитель выставляется на 2, а не на 1 как указано в гиде, только еслитак...идей больше нет
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: msp430 и таймерА ...всётаки косяк

Сообщение Ser60 »

Кажется, я понял почему у Вас не работает. В дополнение к вышесказанному, замените инструкцию
UCSCTL4 |= SELM_3 | SELS_3;
на
UCSCTL4 = SELM_3 | SELS_3;
Иначе в поля SELM/SELS записывается 7 (по дефолту там уже изначально записано 4), что приводит к тактированию от DCOCLKDIV вместо DCOCLK. Это можно было просто отловить, посмотрев значения регистров в отладчике (внутрисхемном).
dzrkot
Открыл глаза
Сообщения: 75
Зарегистрирован: Чт авг 29, 2013 08:02:24

Re: msp430 и таймерА ...всётаки косяк

Сообщение dzrkot »

Ser60 писал(а):Кажется, я понял почему у Вас не работает. В дополнение к вышесказанному, замените инструкцию
UCSCTL4 |= SELM_3 | SELS_3;
на
UCSCTL4 = SELM_3 | SELS_3;
Иначе в поля SELM/SELS записывается 7 (по дефолту там уже изначально записано 4), что приводит к тактированию от DCOCLKDIV вместо DCOCLK. Это можно было просто отловить, посмотрев значения регистров в отладчике (внутрисхемном).
да вы были правы, огромное вам спасибо, будет мне уроком и полезным опытом))
хотелось бы ещё 1 момент уточнить, касательно прерываний, я так понимаю, что приоритет програмно выставить нельзя, т.е. к примеру у меня по вот этому таймеру генерируется прерывание и в нём опрашиваются порты(меня только I2C интересует), если я получаю стартБит по линии SDA, то там генерируется прерывание и начинается передача данных, а если передача ещё на завершена, а прерывание по таймеру должно произойти(я так понимаю, что таймер же не останавливается?) то там могут быть нехорошие последствия в виде неправильной работы проги...или я не прав? Не очень ещё представляю что там может быть...
Аватара пользователя
Ser60
Друг Кота
Сообщения: 3784
Зарегистрирован: Ср дек 24, 2008 09:58:58

Re: msp430 и таймерА ...всётаки косяк

Сообщение Ser60 »

Да, Вы правы: приоритет прерываний у MS430 фиксирван. По началу обработки маскируемого прерывания все остальные маскируемые прерывания запрещены. В принципе, их можно разрешить, но на С я-бы это делал с большой осторожностью постоянно контролируя дизассемблированный код на предмет возможности потери данных в используемых регистрах.

Однако, если во время отработки I2C прерывания произойдет запрос на прерывание от таймера, то он запомнится (посредством выставленного таймером флага прерывания) и обработается позже по выходу из I2C обаботчика. Если во время обработки текущего I2C прерывания таймер затребует 2 или более прерываний, то его обработчик прерываний сработает всего 1 раз. Пэтому, глобально обработчики прерываний следует делать по возможности короткими.

Я очень рекомендую почитать книгу J. Davies "MSP430 Microcontroller Basics". Это одна из лучших книг по микроконтроллерам вообще, хотя и затрагивает лишь более старые семейства F2xxx/F4xxx. У меня есть бумажный вариант и я ни разу не пожалел о покупке. Видел ее где-то в сети для скачивания.

На будущее: за полное цитирование предыдущих сообщений модераторы не похвалят.
Ответить

Вернуться в «Разные вопросы по МК»