Hugo Schmeisser
May 6 2011, 13:04
всем привет. решил попробовать продукцию 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;
}
}
что ему не хватает?
KARLSON
May 6 2011, 21:22
что означает не запускается?
На выходе портов у Вас что? Осциллограф? Светодиоды?
Код компилируется? По мне так надо int main(void) заменить на void main(void).
В коде вроде проблем нет, кроме int.
Через что программируете?
Пошагово запускать программу пробовали?
Hugo Schmeisser
May 6 2011, 21:49
не запускается, это в смысле прошиваешь и никакой реакции. на выходе светодиоды.
код компилируется. прошиваю тхт из папки release/exe. программатор beeprog+ через jtag.
пошагово в иаровском симуляторе работает. там собственно не работать нечему

не пойму почему в железе не работает. может что-то надо в опциях компилятора донастроить?
Сергей Борщ
May 7 2011, 11:06
QUOTE (Hugo Schmeisser @ May 7 2011, 00:49)

программатор beeprog+ через jtag.
А он точно понимает формат ti-txt? Возможно он воспринимает файл как двоичный. Просто мысль вслух.
Hugo Schmeisser
May 7 2011, 13:11
Цитата(Сергей Борщ @ May 7 2011, 15:06)

А он точно понимает формат ti-txt?
ну типа того

может там смещение задавать надо, или ещё чего?
Нажмите для просмотра прикрепленного файлазаработало. убрал галку с автоопределения и поставил ti txt. странно сделано, сначала грузишь ti txt, потом указываешь что это ti txt
Hugo Schmeisser
May 9 2011, 18:31
почему-то в прерывании не могу отключить прерывания глобально. _DINT(); не работает. так задумано?
Dog Pawlowa
May 9 2011, 19:03
Цитата(Hugo Schmeisser @ May 9 2011, 21:31)

в прерывании не могу отключить прерывания
Разве в прерывании прерывания не запрещены?
Hugo Schmeisser
May 9 2011, 19:18
#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. а на практике если во время выполнения кода есть новый перепад, то код выполняется сначала.
вопрос такой, как сделать что-бы при выполнении кода, перепады не обрабатывались
MrYuran
May 10 2011, 06:43
Цитата(Hugo Schmeisser @ May 9 2011, 23:18)

я так думаю по перепаду уровня должен выполниться код в функции. 500ms порт лог1, 500ms порт 0. а на практике если во время выполнения кода есть новый перепад, то код выполняется сначала.
вопрос такой, как сделать что-бы при выполнении кода, перепады не обрабатывались

1. Код ужасен. Задержки в прерываниях - это дурной стиль. Особенно на сотни мс.
2. При входе в прерывание остальные прерывания запрещаются автоматически, если только в теле обработчика не вставить EINT()
3. Ваша ситуация заключается в том, что DINT() в вашем случае не несёт никакой пользы - вложенные прерывания по умолчанию запрещены (уже упоминал). При выходе из прерывания восстанавливается из стека регистр статуса, в котором прерывания разрешены. Если были перепады на входе внешних прерываний, то в регистре порта P1IFG устанавливается флаг , который и вызывает повторное прерывание при выходе из предыдущего обработчика прерываний.
Ваши действия:
Самое простое (и неправильное) - переместить P1IFG = 0; в конец обработчика.
Более правильное - придумать (или срисовать) более изящную защиту от дребезга.
И никаких задержек в прерываниях!
Hugo Schmeisser
May 10 2011, 11:38
этот код просто для проверки.
если P1IFG = 0; ставим в конец обработчика, то порт на выход стоит всегда. постоянно вызывается обработчик и счётчик 500ms считает с начала.
как отключить этот вызов? странно почему в обработчике не отключаются прерывания глобально.
KARLSON
May 11 2011, 08:09
Что-то я совсем не пойму. Прерывание по порту P1, а обрабатываете шестой. Во-вторых, как оно вообще срабатывает? Где строчка разрешения прерывания от изменения порта 1: P1IE = (биты такие-то). Если она где-то стоит, так после обработки прерывания обнулите значение: P1IE = 0(или обнулите тот бит, по которому прерывания не нужны).
Hugo Schmeisser
May 11 2011, 19:57
Цитата(KARLSON @ May 11 2011, 12:09)

Где строчка разрешения прерывания от изменения порта 1: P1IE = (биты такие-то).
спасибо друг, работает

я почему-то думал что можно глобально все прерывания отключить
типа _DINT();
ешё два вопроса есть, подскажите если в курсе.
нужно таймер на 25us, посоветуйте какой использовать?
__interrupt void basic_timer_ISR(void) подойдёт? он вроде на lcd задействован если не путаю.
и второй вопрос, побайтно в информационную память писать можно как-нибудь? читал что вроде только весь блок сразу надо.
Grigorij
May 12 2011, 10:12
Цитата(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. Что касается записи информации, то писать побайтно
можно, но вот стирать данные можно только постранично.
KARLSON
May 12 2011, 13:38
И писать во флешь через специальные команды: Раздел 7 Flash Memory Controller из книги MSP430x2xx _User Guide.
MrYuran
May 12 2011, 13:54
Цитата(Hugo Schmeisser @ May 11 2011, 23:57)

нужно таймер на 25us, посоветуйте какой использовать?
Вам нужен интервал или внешний сигнал сформировать?
Если второе, то лучше воспользоваться выходами OUT защёлок таймера А или В.
Будет точно, как в аптеке.
Цитата(Hugo Schmeisser @ May 11 2011, 23:57)

спасибо друг, работает

я почему-то думал что можно глобально все прерывания отключить
типа _DINT();
Действительно, можно.
Но только не внутри обработчика прерывания, потому что при выходе из он восстанавливает регистр состояния, который был сохранён на стеке до входа в прерывание.
Бит GIO там, естественно, будет таким же, как и был до прерывания.
Hugo Schmeisser
May 12 2011, 17:47
Цитата(MrYuran @ May 12 2011, 17:54)

Вам нужен интервал или внешний сигнал сформировать?
можно на ты. я не беременный, что-бы ко мне во множественном числе

мне нужен интервал. осциллографом глянул, 30us и 60us если не ошибаюсь ставилось. но времени пока нет заниматься, чуть позже попробую 25 задать.
кстати, как в iar битовая переменная задаётся?

типа int1 или bit.
MrYuran
May 13 2011, 05:10
Цитата(Hugo Schmeisser @ May 12 2011, 21:47)

кстати, как в iar битовая переменная задаётся?

типа int1 или bit.
Так же, как и в стандартном си - никак.
Либо битовая структура, либо накладывать маску на байт или слово.
Код
struct MyBitField{
unsigned Bit1:1;
unsigned Bit2:1;
...
unsigned BitN:1;
}
...
MyBitField.Bit1 = 1;
...
if(MyBitField.Bit2 == 1){...}
term83
Jun 12 2011, 07:07
помогите запустит MSP430F249 ПИСАЛ ВОТ ЭТО НЕ ЗАПУСКАЕТСЯ ОТЛАДЧИК EZ430-F2013
//#include <msp430f415.h>
#include "msp430x24x.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;
}
}
******************************************************************
} MODULE Flash_wb
PUBLIC Flash_wb
RSEG CODE
define _CPU_ 6
#include <Std_def.s43>
******************************************************************
Flash_wb
dint
mov #Flash_wb_ent, R13
mov #Flash_wb_length, R15
mov #0A500h,&FCTL3
copy push @R13
decd R13
dec R15
jnz copy
mov SP, R15
mov #0A540h,&FCTL1
call R15
mov #0A500h,FCTL1
mov #0A510h,FCTL3
add #2*Flsh_wb_length,SP
ret
Flash_wb_start
mov.b R14, 0(R12)
wait_bf bit #1, &FCTL3
jhz wait_bf
Flash_wb_ent
ret
Flash_wb_length EQU (Flash_wb_end-Flash_wb_start+2)\ENDMOD
****************************************************************
MODULE flash_ww
PUBLIC Flash_ww
RSEG CODE
define _CPU_ 6
#include <Std_det.s43>
******************************************************************
Flash_ww
dint
mov #Flash_ww_end, R13
mov #Flash_ww_length, R15
mov #0A500h,&FCTL3
copy push @R13
decd R13
dec R15
jnz copy
mov SP, R15
mov #0A540h, &FCTL1
call R15
mov #0A500h, &FCTL1
mov #0A510h, &FCTL3
add #2*Flash_ww_length,SP
ret
Flash_ww_start
mov R14, 0(R12)
wait_bf bit #1, &FCTL3
jnz wait_bf
Flash_ww_end
ret
Flash_ww_length EQU (Flash_ww_end-Flash_ww_start+2)\2
ENDMOD
*********************************************************
MODULE Flash_clr
PUBLIC Flash_clr
#define _CPU_ 6
#include <Std_def.s43>
*********************************************************
Flash_clr
dint
mov #Flash_ww_end, R13
mov #Flash_ww_length, R15
mov #0A500h, &FCTL3
copy push @R13
decd R13
dec R15
jnz copy
mov SP,R15
mov #0A540h, &FCTL1
call R15
mov #0A500h, &FCTL1
mov #0A510h, &FCTL3
add #2*Flash_clr_length, SP
ret
Flash_clr_start
mov #0, 0(R12)
wait_bf bit #1, &FCTL3
jnz wait_bf
Flash_clr_end
ret
Flash_clr_length EGU (Flash_clr_end-Flash_clr_start+2)\2
END
********************************************************
#define _CPU_6
#include <std_def.h>
#include <flash_prog.h>
********************************************************
void Flash_wb(char *Data_ptr, char byte)
FCTL3=0x0A500
FCTL1=0x0A540
*Data_ptr=bute
FCTL1=0x0A500
FCTL=0x0A510
********************************************************
void Flash_ww( int *Data_ptr, int word)
FCTL=0x0A500
FCTL=0x0A540
*Data_ptr=word
FCTL1=0x0A500
FCTL3=0x0A510
******************************************************
extern unsigned char SegA_last;\*010FFh*\
******************************************************
NAME SegA_last
PUBLIC SegA_Last
ASEG 010FFh
SegA_Last DS 0
ENDMOD
*****************************************************
extern unsigned char SegB_last;\*0107Fh*\
NAME SegB_last
PUBLIC SegB_last
ASEG 0107Fh
SegB_last DS 0
KARLSON
Jun 13 2011, 19:09
Что значит не запускается, до какого места доходит код? Или какие функции не работают?
term83
Jun 15 2011, 14:38
я использую отладчик EZ430-F2013 через JTAG пытаюсь прописать команды результат не какой
rezident
Jun 15 2011, 16:51
Цитата(term83 @ Jun 15 2011, 19:38)

я использую отладчик EZ430-F2013 через JTAG пытаюсь прописать команды результат не какой
EZ430 "умеет" работать только по 2-х проводному интерфейсу Spy-Bi-Wire, а MSP430F249 имеет 4-х проводный JTAG. Так что у вас попросту оборудование несовместимо. Покупайте MSP-FET430UIF или его клон и не морочьте голову ни себе ни людям.
term83
Jun 16 2011, 16:24
Он ведь состоит из эмулятора по 2-х проводному интерфейсу Spy-Bi-Wire про который вы сказали и целевой платы?
rezident
Jun 17 2011, 09:09
Цитата(term83 @ Jun 16 2011, 21:24)

Он ведь состоит из эмулятора по 2-х проводному интерфейсу Spy-Bi-Wire про который вы сказали и целевой платы?
У производителя на сайте есть вся интересующая вас информация.
http://focus.ti.com/docs/toolsw/folders/pr...z430-f2013.htmlhttp://processors.wiki.ti.com/index.php/EZ430-F2013http://focus.ti.com/docs/toolsw/folders/pr...-fet430uif.htmlhttp://focus.ti.com/docs/prod/folders/print/msp430f249.htmlИзучите ее для начала, чтобы не задавать "ламерские" вопросы.
term83
Jun 19 2011, 13:13
Спасибо большое, я все понял. Мой отладчик поймал статику