|
не заводится msp430 |
|
|
|
May 6 2011, 13:04
|
Группа: Участник
Сообщений: 13
Регистрация: 6-05-11
Пользователь №: 64 829

|
всем привет. решил попробовать продукцию ti. не могу запустить msp430f415. такой код, - CODE
//#include <msp430f415.h> #include "msp430x41x.h"
#define TRUE 1 #define FALSE 0 #define XTALL 8.0 // #define delay_us(us) __delay_cycles (XTALL * us); #define delay_ms(ms) delay_us (1000 * ms)
int main( void ) { // Stop watchdog timer to prevent time out reset WDTCTL = WDTPW + WDTHOLD; // P6DIR |= 0xff; // 0 = input, 1 = output. P6DIR = 0xff; while(TRUE) { delay_us(100); P6OUT = 0xff; delay_us(100); P6OUT = 0x00; } }
что ему не хватает?
|
|
|
|
|
May 6 2011, 21:49
|
Группа: Участник
Сообщений: 13
Регистрация: 6-05-11
Пользователь №: 64 829

|
не запускается, это в смысле прошиваешь и никакой реакции. на выходе светодиоды. код компилируется. прошиваю тхт из папки release/exe. программатор beeprog+ через jtag. пошагово в иаровском симуляторе работает. там собственно не работать нечему  не пойму почему в железе не работает. может что-то надо в опциях компилятора донастроить?
Сообщение отредактировал Hugo Schmeisser - May 6 2011, 21:51
|
|
|
|
|
May 7 2011, 13:11
|
Группа: Участник
Сообщений: 13
Регистрация: 6-05-11
Пользователь №: 64 829

|
Цитата(Сергей Борщ @ May 7 2011, 15:06)  А он точно понимает формат ti-txt? ну типа того  может там смещение задавать надо, или ещё чего?
заработало. убрал галку с автоопределения и поставил ti txt. странно сделано, сначала грузишь ti txt, потом указываешь что это ti txt
Сообщение отредактировал Hugo Schmeisser - May 7 2011, 12:52
|
|
|
|
|
May 9 2011, 18:31
|
Группа: Участник
Сообщений: 13
Регистрация: 6-05-11
Пользователь №: 64 829

|
почему-то в прерывании не могу отключить прерывания глобально. _DINT(); не работает. так задумано?
Сообщение отредактировал Hugo Schmeisser - May 9 2011, 18:31
|
|
|
|
|
May 9 2011, 19:18
|
Группа: Участник
Сообщений: 13
Регистрация: 6-05-11
Пользователь №: 64 829

|
#pragma vector = PORT1_VECTOR __interrupt void PORT1_ISR(void) { _DINT(); P1IFG = 0; P6OUT = 0xff; delay_ms(500); P6OUT = 0; delay_ms(500); } я так думаю по перепаду уровня должен выполниться код в функции. 500ms порт лог1, 500ms порт 0. а на практике если во время выполнения кода есть новый перепад, то код выполняется сначала. вопрос такой, как сделать что-бы при выполнении кода, перепады не обрабатывались
Сообщение отредактировал Hugo Schmeisser - May 9 2011, 19:21
|
|
|
|
|
May 10 2011, 06:43
|

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

|
Цитата(Hugo Schmeisser @ May 9 2011, 23:18)  я так думаю по перепаду уровня должен выполниться код в функции. 500ms порт лог1, 500ms порт 0. а на практике если во время выполнения кода есть новый перепад, то код выполняется сначала. вопрос такой, как сделать что-бы при выполнении кода, перепады не обрабатывались  1. Код ужасен. Задержки в прерываниях - это дурной стиль. Особенно на сотни мс. 2. При входе в прерывание остальные прерывания запрещаются автоматически, если только в теле обработчика не вставить EINT() 3. Ваша ситуация заключается в том, что DINT() в вашем случае не несёт никакой пользы - вложенные прерывания по умолчанию запрещены (уже упоминал). При выходе из прерывания восстанавливается из стека регистр статуса, в котором прерывания разрешены. Если были перепады на входе внешних прерываний, то в регистре порта P1IFG устанавливается флаг , который и вызывает повторное прерывание при выходе из предыдущего обработчика прерываний. Ваши действия: Самое простое (и неправильное) - переместить P1IFG = 0; в конец обработчика. Более правильное - придумать (или срисовать) более изящную защиту от дребезга. И никаких задержек в прерываниях!
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
|
May 10 2011, 11:38
|
Группа: Участник
Сообщений: 13
Регистрация: 6-05-11
Пользователь №: 64 829

|
этот код просто для проверки. если P1IFG = 0; ставим в конец обработчика, то порт на выход стоит всегда. постоянно вызывается обработчик и счётчик 500ms считает с начала. как отключить этот вызов? странно почему в обработчике не отключаются прерывания глобально.
|
|
|
|
|
May 11 2011, 19:57
|
Группа: Участник
Сообщений: 13
Регистрация: 6-05-11
Пользователь №: 64 829

|
Цитата(KARLSON @ May 11 2011, 12:09)  Где строчка разрешения прерывания от изменения порта 1: P1IE = (биты такие-то). спасибо друг, работает  я почему-то думал что можно глобально все прерывания отключить типа _DINT(); ешё два вопроса есть, подскажите если в курсе. нужно таймер на 25us, посоветуйте какой использовать? __interrupt void basic_timer_ISR(void) подойдёт? он вроде на lcd задействован если не путаю. и второй вопрос, побайтно в информационную память писать можно как-нибудь? читал что вроде только весь блок сразу надо.
Сообщение отредактировал Hugo Schmeisser - May 11 2011, 19:57
|
|
|
|
|
May 12 2011, 10:12
|
Участник

Группа: Участник
Сообщений: 71
Регистрация: 10-03-07
Пользователь №: 26 038

|
Цитата(Hugo Schmeisser @ May 11 2011, 23:57)  я почему-то думал что можно глобально все прерывания отключить  типа _DINT(); _DINT() снимает бит GIE и по сути запрещает обработку прерываний, но флаги (типа P1IFG и пр.) все равно будут устанавливаться. В принципе можно по ним отслеживать возникновение событий, но это не лучший вариант. Цитата(Hugo Schmeisser @ May 11 2011, 23:57)  ешё два вопроса есть, подскажите если в курсе. нужно таймер на 25us, посоветуйте какой использовать? __interrupt void basic_timer_ISR(void) подойдёт? он вроде на lcd задействован если не путаю. и второй вопрос, побайтно в информационную память писать можно как-нибудь? читал что вроде только весь блок сразу надо. Можно и basic timer использовать, но надо смотреть от чего он тактируется и сможет ли он обеспечить требуемый интервал. Больше возможностей по настройки дает Timer A и аналогичный Timer B. Что касается записи информации, то писать побайтно можно, но вот стирать данные можно только постранично.
|
|
|
|
|
May 12 2011, 13:54
|

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

|
Цитата(Hugo Schmeisser @ May 11 2011, 23:57)  нужно таймер на 25us, посоветуйте какой использовать? Вам нужен интервал или внешний сигнал сформировать? Если второе, то лучше воспользоваться выходами OUT защёлок таймера А или В. Будет точно, как в аптеке. Цитата(Hugo Schmeisser @ May 11 2011, 23:57)  спасибо друг, работает  я почему-то думал что можно глобально все прерывания отключить типа _DINT(); Действительно, можно. Но только не внутри обработчика прерывания, потому что при выходе из он восстанавливает регистр состояния, который был сохранён на стеке до входа в прерывание. Бит GIO там, естественно, будет таким же, как и был до прерывания.
--------------------
Программирование делится на системное и бессистемное. ©Моё :) — а для кого-то БГ — это Bill Gilbert =)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|