реклама на сайте
подробности

 
 
2 страниц V   1 2 >  
Reply to this topicStart new topic
> Проблемы с инициализацией или еще с чем-то, MSP430F149
addi
сообщение Oct 8 2013, 15:39
Сообщение #1


Знающий
****

Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422



Здравствуйте !

Нужна помощь новичку в 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);
  
  }
}
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 9 2013, 08:59
Сообщение #2


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Телепатирую проблему в init().
Если нет, то в Usets()
sm.gif
Остальное вроде нормально.
Хотя и непонятно, чего вы ожидаете и что не так.


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
addi
сообщение Oct 9 2013, 15:01
Сообщение #3


Знающий
****

Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422



Цитата(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.

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

Заранее благодарен!
Go to the top of the page
 
+Quote Post
igorle
сообщение Oct 9 2013, 16:58
Сообщение #4


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Я по существу ответить не могу. Под рукой нет ничего. Но для начала - я бы причесал код. Чтобы было видно, что вы понимаете что делаете. Например, Ваш код насамом деле выглядит так:
Код
#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, а альтернативные. Я, к сожалению, не смог этого понять из даташита.
Go to the top of the page
 
+Quote Post
addi
сообщение Oct 10 2013, 05:56
Сообщение #5


Знающий
****

Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422



Цитата(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 можно купить.

Заранее благодарен
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 10 2013, 06:06
Сообщение #6


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



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

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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post
addi
сообщение Oct 10 2013, 06:16
Сообщение #7


Знающий
****

Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422



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


без прерывания тоже самое, нмчего не понимаю(
Может он в слипе и его както надо разбудить?
Go to the top of the page
 
+Quote Post
igorle
сообщение Oct 10 2013, 06:58
Сообщение #8


Местный
***

Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753



Цитата(MrYuran @ Oct 10 2013, 09:06) *
На самом деле, там ещё __enable_interrupt(); , хотя ни одного обработчика не видно...

Этот вызов никакой смысловой нагрузки не несет. Поэтому я его и предлагал вычистить. Подозреваю, что проблема не в коде, а в окружении. На начальных этапах это сплошь и рядом бывает. Думаешь, что прожег код, а на самом деле загрузил его в эмулятор. Или вообще никуда...
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 10 2013, 07:01
Сообщение #9


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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




--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
addi
сообщение Oct 10 2013, 19:46
Сообщение #10


Знающий
****

Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422



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

Спасибо большое за поддержку.
Проблема в том что я с помощью ИАР и отладчика(аля FET debugger) думаю запрограммировать микроконтроллер и делаю это следующим образом:
Вышеописанный код компилирую, собираю и далее в Release наживаю на "Download and Degug" и далее вроде как "Download application" и после загружается отладчик.
Далее выхожу из отладки полагая что сброс контроллера уже прошел и код исполняется, т.е ожидаю увидеть высокие уровни на ножках.
В результате на нажках 0.
Посльку питание от отладчика то POR с отладчиклом. Убеждаюсь что на Reset 1, смотрю на ножках, на ножках 0.
Вопрос, - почему нет исполнения программы после подачи питания и нактивном сбросе.
Ежели я не выхожу из отладчика и в отлдачике нажимю на "GO" то на ножках единицы и вроде все как надо.
Складывается впечатления что отладчик ничего не прошивает, вопрос как это сделать?
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 10 2013, 20:54
Сообщение #11


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



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. Я уже лет пять как с ними не работаю, мог и подзабыть что-нибудь.


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
addi
сообщение Oct 11 2013, 07:00
Сообщение #12


Знающий
****

Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422



Цитата(Сергей Борщ @ 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
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Oct 11 2013, 07:50
Сообщение #13


Гуру
******

Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095



Рискуете схватить предупреждение за избыточное цитирование.

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

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


--------------------
На любой вопрос даю любой ответ
"Write code that is guaranteed to work, not code that doesn’t seem to break" (C++ FAQ)
Go to the top of the page
 
+Quote Post
addi
сообщение Oct 15 2013, 11:54
Сообщение #14


Знающий
****

Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422



Цитата(Сергей Борщ @ 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  
}

Надеюсь на Вашу поддержку.
Go to the top of the page
 
+Quote Post
MrYuran
сообщение Oct 15 2013, 12:20
Сообщение #15


Беспросветный оптимист
******

Группа: Свой
Сообщений: 4 640
Регистрация: 26-12-07
Из: Н.Новгород
Пользователь №: 33 646



Цитата
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


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


--------------------
Программирование делится на системное и бессистемное. ©Моё :)
— а для кого-то БГ — это Bill Gilbert =)
Go to the top of the page
 
+Quote Post

2 страниц V   1 2 >
Reply to this topicStart new topic
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 


RSS Текстовая версия Сейчас: 22nd July 2025 - 10:13
Рейтинг@Mail.ru


Страница сгенерированна за 0.0153 секунд с 7
ELECTRONIX ©2004-2016