Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблемы с инициализацией или еще с чем-то
Форум разработчиков электроники ELECTRONIX.ru > Сайт и форум > В помощь начинающему > Программирование
addi
Здравствуйте !

Нужна помощь новичку в MSP430.
Не получается выполнить простейшую операцию , думаю проблема в тактировании.
Использую внешний часовой кварц в качестве источника тактирования.

Мой код ниже.
Прошу помочь, кто знает что не так.
Контроллер MSP430F149
Код
#include <stdio.h>
#include "msp430x14x.h"
#include <intrinsics.h>

#include "main.h"

//extern void writeuc_SPI(unsigned char data);
#define iSCO 0x40
#define iSCK 0x20
void main()
{
  init();
  Usets();
  __enable_interrupt();
  for(;;)
  {
    
    P3OUT |= iSCO; // P3.6 MOSI
    P4OUT |= iSCK; // P4.5 MSCK
    //Ureg = 0x55;
    //writeuc_SPI(Ureg);
    //Uucwr(readuc_SPI());
    //Uucwr(0x55);
  
  }
}
MrYuran
Телепатирую проблему в init().
Если нет, то в Usets()
sm.gif
Остальное вроде нормально.
Хотя и непонятно, чего вы ожидаете и что не так.
addi
Цитата(MrYuran @ Oct 9 2013, 12:59) *
Телепатирую проблему в init().
Если нет, то в Usets()
sm.gif
Остальное вроде нормально.
Хотя и непонятно, чего вы ожидаете и что не так.


Спасибо большое за поддержку!

Дело в том что я сделал еще проще:

Код
#include <stdio.h>
//#include <msp430f149.h>
#include <msp430x14x.h>
#include <intrinsics.h>

#include "main.h"

//extern void writeuc_SPI(unsigned char data);

void main(void)
{
  //init();
  WDTCTL = WDTPW + WDTHOLD;  
   P3DIR |= 0x40; // P3.6 MOSI
    P4DIR |= 0x20; // P4.5 MSCK
    P3OUT |= 0x40; // P3.6 MOSI
    P4OUT |= 0x20; // P4.5 MSCK
    //P3OUT &= ~iSCO; // P3.6 MOSI
    //P4OUT &= ~iSCK; // P4.5 MSCK
  //Usets();
  __enable_interrupt();
  for(;;)
  {
    
  
    
    //P3OUT &= ~iSCO; // P3.6 MOSI
    //P4OUT &= ~iSCK; // P4.5 MSCK
    
    //Ureg = 0x55;
    //writeuc_SPI(Ureg);
    //Uucwr(readuc_SPI());
    //Uucwr(0x55);
  
  }
}


Зашиваю Relese через download and debug LPT отладчиком(FET Debugger) смотрю на P3.6 и P4.5 и вижу низкий уровень, когда как должен быть высокий.
Далее через Debug отладку прохожу построчно и ножки соответсвенно устанавливаются в высокий уровень, и только таким образом.
Все оставшиеся манипуляции с Relese/Debug и "download and debug" дают на выходе 0.
Не понимаю что должно тактировать, либо LF, либо внутренний DCO, в итоге такое ощущение что тактирования никакого нет.
32768 покдючен к XIN и XOUT.

Со схемотехникой все ok, ранее была другая прошивка(не моя, я ее стер своими попытками) и все ok.

На входе ножки ресет - высокий уровень, питание есть.
Ничего не понимаю, пожайлуста помогите, хотя бы своей инициализацией или проектом под ИАР.

Заранее благодарен!
igorle
Я по существу ответить не могу. Под рукой нет ничего. Но для начала - я бы причесал код. Чтобы было видно, что вы понимаете что делаете. Например, Ваш код насамом деле выглядит так:
Код
#include <msp430x14x.h>

void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;

    P3DIR |= 0x40; // P3.6
    P4DIR |= 0x20; // P4.5
    P3OUT |= 0x40; // P3.6
    P4OUT |= 0x20; // P4.5
    for(;;);
}


Я бы еще проверил значения PxSEL. Возможно, эти ножки по умолчанию не GPIO, а альтернативные. Я, к сожалению, не смог этого понять из даташита.
addi
Цитата(igorle @ Oct 9 2013, 20:58) *
Я по существу ответить не могу. Под рукой нет ничего. Но для начала - я бы причесал код. Чтобы было видно, что вы понимаете что делаете. Например, Ваш код насамом деле выглядит так:
Код
#include <msp430x14x.h>

void main(void)
{
    WDTCTL = WDTPW + WDTHOLD;

    P3DIR |= 0x40; // P3.6
    P4DIR |= 0x20; // P4.5
    P3OUT |= 0x40; // P3.6
    P4OUT |= 0x20; // P4.5
    for(;;);
}


Я бы еще проверил значения PxSEL. Возможно, эти ножки по умолчанию не GPIO, а альтернативные. Я, к сожалению, не смог этого понять из даташита.


Спасибо большое за поддержку!

Код
#include <stdio.h>
//#include <msp430f149.h>
#include <msp430x14x.h>
#include <intrinsics.h>

#include "main.h"

//extern void writeuc_SPI(unsigned char data);

void main(void)
{
  //init();
  WDTCTL = WDTPW + WDTHOLD;  
    P3SEL &=~0x40;
    P4SEL &= ~0x20;
    P3DIR |= 0x40; // P3.6 MOSI
    P4DIR |= 0x20; // P4.5 MSCK
    P3OUT |= 0x40; // P3.6 MOSI
    P4OUT |= 0x20; // P4.5 MSCK
    //P3OUT &= ~iSCO; // P3.6 MOSI
    //P4OUT &= ~iSCK; // P4.5 MSCK
  //Usets();
  __enable_interrupt();
  for(;;)
  {
    
  
    
    //P3OUT &= ~iSCO; // P3.6 MOSI
    //P4OUT &= ~iSCK; // P4.5 MSCK
    
    //Ureg = 0x55;
    //writeuc_SPI(Ureg);
    //Uucwr(readuc_SPI());
    //Uucwr(0x55);
  
  }
}


к сожалению тоже не помогают.

Может быть я не правильно устанавливаю тип выходного Release файла, у меня сначало установки были по умолчанию, - какой-то msp.txt
Далее я поставил intel-extended и сделал .hex расширение.
Может быть взять более специализированный программатор, чисто для прошивки hexa. Пожалуйста подскажите кто знает, где и какой программатор для msp430 можно купить.

Заранее благодарен
MrYuran
Цитата(igorle @ Oct 9 2013, 19:58) *
Например, Ваш код на самом деле выглядит так:

На самом деле, там ещё __enable_interrupt(); , хотя ни одного обработчика не видно, а иар (а ведь это он), как известно, заглушек не ставит.
Далее, кварц можно ставить какой угодно, он все равно работать не будет, так как по умолчанию тактирование идет от DCO 100кГц.
addi
Цитата(MrYuran @ Oct 10 2013, 10:06) *
На самом деле, там ещё __enable_interrupt(); , хотя ни одного обработчика не видно, а иар (а ведь это он), как известно, заглушек не ставит.
Далее, кварц можно ставить какой угодно, он все равно работать не будет, так как по умолчанию тактирование идет от DCO 100кГц.


без прерывания тоже самое, нмчего не понимаю(
Может он в слипе и его както надо разбудить?
igorle
Цитата(MrYuran @ Oct 10 2013, 09:06) *
На самом деле, там ещё __enable_interrupt(); , хотя ни одного обработчика не видно...

Этот вызов никакой смысловой нагрузки не несет. Поэтому я его и предлагал вычистить. Подозреваю, что проблема не в коде, а в окружении. На начальных этапах это сплошь и рядом бывает. Думаешь, что прожег код, а на самом деле загрузил его в эмулятор. Или вообще никуда...
Сергей Борщ
QUOTE (addi @ Oct 9 2013, 18:01) *
Зашиваю Relese через download and debug LPT отладчиком(FET Debugger) смотрю на P3.6 и P4.5 и вижу низкий уровень, когда как должен быть высокий.
Далее через Debug отладку прохожу построчно и ножки соответсвенно устанавливаются в высокий уровень, и только таким образом.
А после прошивки вы RUN делаете?
Или вы имеете ввиду, что после такой прошивки вы отключаете от программатора и железка не запускается уже без него, самостоятельно? Если вы действительно хотите получить ответ, не ленитесь описать ситуацию максимально подробно. Никому не хочется заниматься тут телепатией.


addi
Цитата(Сергей Борщ @ Oct 10 2013, 11:01) *
А после прошивки вы RUN делаете?
Или вы имеете ввиду, что после такой прошивки вы отключаете от программатора и железка не запускается уже без него, самостоятельно? Если вы действительно хотите получить ответ, не ленитесь описать ситуацию максимально подробно. Никому не хочется заниматься тут телепатией.

Спасибо большое за поддержку.
Проблема в том что я с помощью ИАР и отладчика(аля FET debugger) думаю запрограммировать микроконтроллер и делаю это следующим образом:
Вышеописанный код компилирую, собираю и далее в Release наживаю на "Download and Degug" и далее вроде как "Download application" и после загружается отладчик.
Далее выхожу из отладки полагая что сброс контроллера уже прошел и код исполняется, т.е ожидаю увидеть высокие уровни на ножках.
В результате на нажках 0.
Посльку питание от отладчика то POR с отладчиклом. Убеждаюсь что на Reset 1, смотрю на ножках, на ножках 0.
Вопрос, - почему нет исполнения программы после подачи питания и нактивном сбросе.
Ежели я не выхожу из отладчика и в отлдачике нажимю на "GO" то на ножках единицы и вроде все как надо.
Складывается впечатления что отладчик ничего не прошивает, вопрос как это сделать?
Сергей Борщ
QUOTE (addi @ Oct 10 2013, 22:46) *
Проблема в том что я с помощью ИАР и отладчика(аля FET debugger) думаю запрограммировать микроконтроллер
Это возможно - сам всегда так делал.
QUOTE (addi @ Oct 10 2013, 22:46) *
наживаю на "Download and Degug" и далее вроде как "Download application" и после загружается отладчик.
Далее выхожу из отладки полагая что сброс контроллера уже прошел и код исполняется
Обычно отладчик после загрузки ставит точку останова на входе в main(), делает сброс и дожидается пока управление дойдет до точки останова. После чего предлагает вам самому решать, что делать - запускать программу либо идти ее по шагам. Если вы в этот момент выходите из дебаггера или отключаете отладчик - процессор так и останется стоять на точке останова до следующего сброса.
QUOTE (addi @ Oct 10 2013, 22:46) *
Вопрос, - почему нет исполнения программы после подачи питания и нактивном сбросе.
...
Складывается впечатления что отладчик ничего не прошивает, вопрос как это сделать?
А вот это наводит на мысль, что вы используете скрипт линкера, который располагает код в ОЗУ. Хотя MSP430F149 не позволяет разместить в ОЗУ вектора прерываний, поэтому такой скрипт очень маловероятен. Но всякое бывает - покажите на всякий случай скрипт линкера. Если бы код не загружался в кристалл, то он не исполнялся бы и пошагово. Можете после загрузки посмотреть в окне дизассемблера, на каких адресах остановилось выполнение и прикинуть - эти адреса относятся к ОЗУ или к флеш.

Еще у этой серии (1xx, 1xxx) есть неприятная особенность - он часто впадает в ступор при плавном нарастании питания с неактивным уровнем на ноге сброса. Поэтому в боевой схеме использование супервизора обязательно. Попробуйте кратковременно замкнуть пинцетом ногу сброса на землю. Если не поможет - отключите питание, закоротите питание пинцетом (разрядите емкости), закоротите пинцетом ногу сброса на землю и так и подайте питание с активным ресетом, после чего ресет отпустите.
По результатам этих экспериментов будем думать и звать rezidentа - он у нас главный спец по 430. Я уже лет пять как с ними не работаю, мог и подзабыть что-нибудь.
addi
Цитата(Сергей Борщ @ Oct 11 2013, 00:54) *
Это возможно - сам всегда так делал.
Обычно отладчик после загрузки ставит точку останова на входе в main(), делает сброс и дожидается пока управление дойдет до точки останова. После чего предлагает вам самому решать, что делать - запускать программу либо идти ее по шагам. Если вы в этот момент выходите из дебаггера или отключаете отладчик - процессор так и останется стоять на точке останова до следующего сброса.
А вот это наводит на мысль, что вы используете скрипт линкера, который располагает код в ОЗУ. Хотя MSP430F149 не позволяет разместить в ОЗУ вектора прерываний, поэтому такой скрипт очень маловероятен. Но всякое бывает - покажите на всякий случай скрипт линкера. Если бы код не загружался в кристалл, то он не исполнялся бы и пошагово. Можете после загрузки посмотреть в окне дизассемблера, на каких адресах остановилось выполнение и прикинуть - эти адреса относятся к ОЗУ или к флеш.

Еще у этой серии (1xx, 1xxx) есть неприятная особенность - он часто впадает в ступор при плавном нарастании питания с неактивным уровнем на ноге сброса. Поэтому в боевой схеме использование супервизора обязательно. Попробуйте кратковременно замкнуть пинцетом ногу сброса на землю. Если не поможет - отключите питание, закоротите питание пинцетом (разрядите емкости), закоротите пинцетом ногу сброса на землю и так и подайте питание с активным ресетом, после чего ресет отпустите.
По результатам этих экспериментов будем думать и звать rezidentа - он у нас главный спец по 430. Я уже лет пять как с ними не работаю, мог и подзабыть что-нибудь.

Спасибо большое за поддержку!
Вот что линкер показывает в итоге:
Код
                ****************************************
                *                                      *
                *            MODULE SUMMARY            *
                *                                      *
                ****************************************

Module               CODE      DATA
------               ----      ----
                    (Rel)  (Rel)  (Abs)
?__exit                 2
?_exit                  4
?cstart                12
?exit                   4
?reset_vector           2
main                   44             8
N/A (command line)            80
------                 --     --      -
Total:                 68     80      8


                ****************************************
                *                                      *
                *              CALL GRAPH              *
                *                                      *
                ****************************************

  ->Sub-tree of type: Function tree
                             CSTACK
    | Stack used (prev) :  00000000
  01  main
      | Stack used (prev) :  00000000
      | + function block  :  00000002
  <-Sub-tree of type: Function tree
    | Stack used          :  00000002


  ->Sub-tree of type: Function tree
                             CSTACK
    | Stack used (prev) :  00000002
  01  exit
      | Stack used (prev) :  00000002
      | + function block  :  00000002
  <-Sub-tree of type: Function tree
    | Stack used          :  00000004




                ****************************************
                *                                      *
                *      SEGMENTS IN ADDRESS ORDER       *
                *                                      *
                ****************************************


SEGMENT              SPACE    START ADDRESS   END ADDRESS     SIZE  TYPE  ALIGN
=======              =====    =============   ===========     ====  ====  =====
DATA16_AN                              0019 - 001B               3   rel    0
                                       001D - 001F               3
                                       0120 - 0121               2
CSTACK                                 09B0 - 09FF              50   rel    1
CSTART                                 1100 - 110B               C   rel    1
<CODE> 1                               110C - 1141              36   rel    1
RESET                                  FFFE - FFFF               2   rel    1

                ****************************************
                *                                      *
                *        END OF CROSS REFERENCE        *
                *                                      *
                ****************************************

68 bytes of CODE memory
80 bytes of DATA memory (+ 8 absolute )

Errors: none
Warnings: none
Сергей Борщ
Рискуете схватить предупреждение за избыточное цитирование.

Файл красивый, но я предлагаю вам самим посмотреть в документации, в какую память (ОЗУ или флеш) попадают адреса 0x1100-1141 и исходя из этого сделать соответствующий вывод и переходить либо к выбору правильного скрипта либо к пляскам с питанием и сбросом.

Вы можете также в настройках отладчика отключить загрузку программы, подключиться к процессору и в окне "memory" убедиться, что ваша программа осталась в адресах 0x1100-1141 и 0xFFFE-0xFFFF
addi
Цитата(Сергей Борщ @ Oct 11 2013, 11:50) *
Рискуете схватить предупреждение за избыточное цитирование.

Файл красивый, но я предлагаю вам самим посмотреть в документации, в какую память (ОЗУ или флеш) попадают адреса 0x1100-1141 и исходя из этого сделать соответствующий вывод и переходить либо к выбору правильного скрипта либо к пляскам с питанием и сбросом.

Вы можете также в настройках отладчика отключить загрузку программы, подключиться к процессору и в окне "memory" убедиться, что ваша программа осталась в адресах 0x1100-1141 и 0xFFFE-0xFFFF

Всем большое спасибо, наконецто нашлась причина, - на плате после включения питания ресет не работает.
Теперь новая проблема, с клоками.
Настроил клоки, Юарт, а скорость по ЮАРТу 20 б/с(
Чего бы я не делал , все тоже самое, ЮАРТ значения выдает правильно но время бита 50 мс!
Код
настройка клоков:
  BCSCTL1 = 0x49; // Максимальная частота, делитель отсутствует
  BCSCTL2 = 0;
  WDTCTL = WDTPW + WDTHOLD;  
  DCOCTL = DCO0 + DCO1 + DCO2; // Модулятор запрещен, максимальная частота

  

настройка ЮАРТа:
void Usets()
{
  P3SEL = 0x10|0x20;
  //PSEL &= ~0x20;
  UCTL0 = 0x01|0x10; // 8 bit data
  UTCTL0 = 0x04|0x20; // tx wake-up enable, system clock for baud-rate
  URCTL0 = 0x04; // rx wake-up enable
  UBR00 = 0x01; // 9600
  //UBR10 = 0x33;
  UMCTL0 = 0x4A;
  ME1 = UTXE0;
  
  UCTL0 &= ~0x01;
  U0IE = 0x10; // interrupt enable  
}

Надеюсь на Вашу поддержку.
MrYuran
Цитата
BCSCTL1 = 0x49; // Максимальная частота, делитель отсутствует

Думаете, кому-то интересно лазить по справочникам, искать назначение битов?

У меня, к примеру, так сделано: (для 149)

Код
DCOCTL=DCO0|DCO1|DCO2;                  //DCO около 5МГц
BCSCTL1 = (RSEL0 | RSEL1 | RSEL2);
BCSCTL2 = (DIVS)|(DIVM_0)|(SELM_0)|(SELS);    // SMCLK=XT2CLK, DIVS=1, DIVM=1, MCLK=DCOCLC


Лучше все-таки применять мнемонические обозначения вместо магических цифр. И себе, и другим проще.
addi
Цитата(MrYuran @ Oct 15 2013, 16:20) *
Думаете, кому-то интересно лазить по справочникам, искать назначение битов?

У меня, к примеру, так сделано: (для 149)

Код
DCOCTL=DCO0|DCO1|DCO2;                  //DCO около 5МГц
BCSCTL1 = (RSEL0 | RSEL1 | RSEL2);
BCSCTL2 = (DIVS)|(DIVM_0)|(SELM_0)|(SELS);    // SMCLK=XT2CLK, DIVS=1, DIVM=1, MCLK=DCOCLC


Лучше все-таки применять мнемонические обозначения вместо магических цифр. И себе, и другим проще.

Спасибо большое за поддержку
Сегодня небольшой прогресс, теперь время бита не 50мс а 15мс!), хотя должно быть 104 мкс, согласно настройкам
Вот настройка:
Код
  WDTCTL = WDTPW + WDTHOLD;
  
  
  DCOCTL=DCO0|DCO1|DCO2; //DCO = 7, MOD = 0
  BCSCTL1 = (RSEL0 | RSEL1 | RSEL2 | XTS | XT2OFF); // RSEL = 7, The high-freq oscillator, XT2 not used
  BCSCTL2 = (DIVS_0 )|(DIVM_0)|(SELM_0);    // SMCLK (DIVS.1 .. DIVS.0)=0, DIVS=1, DIVM=1, SELS = 0: DCOCLK, MCLK = DCOCLK  


ЮАРТ:
  P3SEL = BIT4 | BIT5; // UART pins enable
  
  UCTL0 = SWRST|CHAR; //  software reset,8 bit data
  UTCTL0 = TXWAKE|SSEL1; // SMCLOK, TXWAKE
  UBR00 = 0x6D; // 9600
  UMCTL0 = 0x03;
  ME1 = UTXE0; // UART0 enable
  UCTL0 &= ~SWRST;
  U0IE = 0x10; // interrupt enable


Пытаюсь добится работы при максимальной внутренней частоте(...., т.е тактироватся от DCO
Питание от отладчика.
MrYuran
Цитата(addi @ Oct 16 2013, 15:09) *
UBR00 = 0x6D; // 9600

А UBR01?
Делитель-то двухбайтный.

К тому же, если максимальный DCO ~ 4750000 поделить на 9600, то у меня получилось 0x1EE.
Ровно в 4 раза больше, чем у вас.

Чтобы убедиться, какая на самом деле частота, можно вывести наружу MCLK (P5.4, pin48) и SMCLK (P1.4, pin 16 или P5.5 pin49)

DCO использовать для UARTa не совсем правильно, разброс может быть слишком большой. 5% уже критично.
Другое дело, если калибровать частоту по кварцу.

Кстати, а какой байт передаете, чтобы определить битовый интервал?
addi
Сапсибо огромное, с UBR00 = 0xEE;UBR10 = 0x01; скорость стала 9600!!!
Очень странно, потому как я значения бодрейцта брал из даташита(
Теперь последний момент в моем знакомстве с msp, клоки таймера при следующей настройке(настройка осцилятора прежняя, DCO, максимальная частота)


Код
void bit_set()
{
  TACTL = TASSEL1;
  TACCTL0 = 0;
  TACCR0 = 1;
  TAR = 0;
}
void bit_time()
{
  TACTL |= MC0; //  Timer A mode control 0,  Up to CCR0, start timer
  while(!(TACCTL0&CCIFG));
  TACCTL0&=~CCIFG;
  TACTL &= ~MC0;
  TAR = 0;
}


В итоге я вижу на осцилографе время бита 22 мкс, когда как считаю без делителей до 1. Если частота в районе 5 МГц, то у меня время бита должно быть не более 1 мкс.
Прошу помочь в последний раз, далее уменя будет как минимум референс в настройках)
Заранее благодарен!
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.