|
Проблемы с инициализацией или еще с чем-то, MSP430F149 |
|
|
|
Oct 8 2013, 15:39
|
Знающий
   
Группа: Участник
Сообщений: 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); } }
|
|
|
|
|
Oct 9 2013, 15:01
|
Знающий
   
Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422

|
Цитата(MrYuran @ Oct 9 2013, 12:59)  Телепатирую проблему в init(). Если нет, то в Usets()  Остальное вроде нормально. Хотя и непонятно, чего вы ожидаете и что не так. Спасибо большое за поддержку! Дело в том что я сделал еще проще: Код #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. На входе ножки ресет - высокий уровень, питание есть. Ничего не понимаю, пожайлуста помогите, хотя бы своей инициализацией или проектом под ИАР. Заранее благодарен!
|
|
|
|
|
Oct 9 2013, 16:58
|
Местный
  
Группа: Свой
Сообщений: 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, а альтернативные. Я, к сожалению, не смог этого понять из даташита.
|
|
|
|
|
Oct 10 2013, 05:56
|
Знающий
   
Группа: Участник
Сообщений: 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 можно купить. Заранее благодарен
|
|
|
|
|
Oct 10 2013, 06:06
|

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

|
Цитата(igorle @ Oct 9 2013, 19:58)  Например, Ваш код на самом деле выглядит так: На самом деле, там ещё __enable_interrupt(); , хотя ни одного обработчика не видно, а иар (а ведь это он), как известно, заглушек не ставит. Далее, кварц можно ставить какой угодно, он все равно работать не будет, так как по умолчанию тактирование идет от DCO 100кГц.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
Oct 10 2013, 06:16
|
Знающий
   
Группа: Участник
Сообщений: 679
Регистрация: 9-08-06
Пользователь №: 19 422

|
Цитата(MrYuran @ Oct 10 2013, 10:06)  На самом деле, там ещё __enable_interrupt(); , хотя ни одного обработчика не видно, а иар (а ведь это он), как известно, заглушек не ставит. Далее, кварц можно ставить какой угодно, он все равно работать не будет, так как по умолчанию тактирование идет от DCO 100кГц. без прерывания тоже самое, нмчего не понимаю( Может он в слипе и его както надо разбудить?
|
|
|
|
|
Oct 10 2013, 06:58
|
Местный
  
Группа: Свой
Сообщений: 338
Регистрация: 14-07-12
Пользователь №: 72 753

|
Цитата(MrYuran @ Oct 10 2013, 09:06)  На самом деле, там ещё __enable_interrupt(); , хотя ни одного обработчика не видно... Этот вызов никакой смысловой нагрузки не несет. Поэтому я его и предлагал вычистить. Подозреваю, что проблема не в коде, а в окружении. На начальных этапах это сплошь и рядом бывает. Думаешь, что прожег код, а на самом деле загрузил его в эмулятор. Или вообще никуда...
|
|
|
|
|
Oct 10 2013, 07:01
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Oct 10 2013, 19:46
|
Знающий
   
Группа: Участник
Сообщений: 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" то на ножках единицы и вроде все как надо. Складывается впечатления что отладчик ничего не прошивает, вопрос как это сделать?
|
|
|
|
|
Oct 10 2013, 20:54
|

Гуру
     
Группа: Модераторы
Сообщений: 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)
|
|
|
|
|
Oct 11 2013, 07:00
|
Знающий
   
Группа: Участник
Сообщений: 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
|
|
|
|
|
Oct 15 2013, 11:54
|
Знающий
   
Группа: Участник
Сообщений: 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 } Надеюсь на Вашу поддержку.
|
|
|
|
|
Oct 15 2013, 12:20
|

Беспросветный оптимист
     
Группа: Свой
Сообщений: 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 =)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|