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

 
 
3 страниц V  < 1 2 3 >  
Reply to this topicStart new topic
> MSP430F169D зависает когда работает от XT2, UART работает ~ 1 час, потом процессор зависает....
NoName
сообщение Feb 6 2008, 16:59
Сообщение #16


Участник
*

Группа: Участник
Сообщений: 36
Регистрация: 4-03-05
Из: Киев
Пользователь №: 3 078



Цитата(Dog Pawlowa @ Feb 4 2008, 18:50) *
UART от DCO .....от часового кварца больше 1200 не получить.


{ U1CTL = 0x10; U1TCTL= 0x50; U1BR1 = 0x00; U1BR0 = 0x03; U1MCTL = 0x4A; } // 9600
больше 9600 на 32 кГц действительно не получить.
Go to the top of the page
 
+Quote Post
cornflyer
сообщение Feb 7 2008, 08:51
Сообщение #17


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



У меня как раз 9600 - скорость UART'а )))
Кроме SVS, WatchDOG у меня еще есть синхронизация UART.
Т.е. если какой-либо пакет не пришел вовремя, счетчик приемника сбрасывается по таймауту в ноль.
Для этого у меня работает TIMERA.
Более того, у меня многобайтовые посылки:
адрес утройства, код команды, параметры команды, CRC16
Так что кроме всего прочего у меня есть CRC проверка...
Проверял по всякому - дело было в железе. Повесил на XIN/XOUT часовой кварц - больше проц намертво не виснет. Вообще не виснет. Даже байты не теряюца.
Хотя прошивку оставил без изменений - т.е. ту, когда был только XT2.
Просто припаял на ноги часовой кварц, который у меня не используеца.
И все теперь работает без глюков.
Go to the top of the page
 
+Quote Post
Dog Pawlowa
сообщение Feb 7 2008, 16:14
Сообщение #18


Гуру
******

Группа: Свой
Сообщений: 2 702
Регистрация: 14-07-06
Пользователь №: 18 823



Цитата(cornflyer @ Feb 7 2008, 12:51) *
Хотя прошивку оставил без изменений - т.е. ту, когда был только XT2.
Просто припаял на ноги часовой кварц, который у меня не используеца.
И все теперь работает без глюков.

Очень интересная информация. Поверить трудно.
Может, все-таки XT1 используется как-то в прошивке ?
У меня несколько приборов с разными комбинациями генераторов, но действительно наиболее устойчиво работают приборы с синхронизацией от часового кварца. Хотя эти кварцы чаще отказывают.
Но другие приборы работают тоже месяцами не выключаясь.

А по 9600 - похоже, перебдел smile.gif


--------------------
Уходя, оставьте свет...
Go to the top of the page
 
+Quote Post
cornflyer
сообщение Feb 8 2008, 09:08
Сообщение #19


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



Цитата(Dog Pawlowa @ Feb 7 2008, 19:14) *
Может, все-таки XT1 используется как-то в прошивке ?


void app_Init ( void )
{
WDTCTL = WDTPW + WDTHOLD ; // stop watchdog
IFG1 |= OFIFG ;
IE1 |= OFIE ;
watch_dog_Reset () ;
_DINT () ; // disanable interrupts
/////////////////////////
svs_Init () ;
port_Init () ;
select_HV_U () ; // select data source connected to ADS1100
clock_Init () ;
serial_Init () ;
adc_Init () ;
HV_Init () ;
var_Init () ;
comparator_Init () ;
flash_init () ;
_EINT () ; // enable interrupts
adc_Start () ;
}


void clock_Init ( void )
{
//asm ( " xor SR, 0x20 " ) ;
_BIS_SR ( 0x20 ) ; // disable XT1

// Timer_A setup
TACTL = 0x00; // stop timer before config
TACCR0 = 0xFFFF ; // 0xFFFF ;
TACCTL0 = BIT4 ; // Timer_A compare interrupt enable
TAR = 0x0000 ;
TACTL = BIT4 | // Up mode: the timer counts up to TACCR0
BIT7 | BIT6 | // CLK/8
BIT9 ; // Timer_A clock source = SMCLK


// Timer_B setup
TBCTL = 0x00; // stop timer before config
TBCCR0 = 0xFFFF ;
TBCCTL0 = BIT4 ; // Timer_B compare interrupt enable
TBR = 0x0000 ;
TBCTL = BIT4 | // Up mode: the timer counts up to TBCCR0
BIT7 | BIT6 | // CLK/8
BIT9 ; // Timer_B clock source = SMCLK
}


#pragma vector = NMI_VECTOR
__interrupt void osc_fault (void)
{

BCSCTL1 = 0 ; // &= ~XT2OFF; // XT2 = HF XTAL

do
{ IFG1&=~OFIFG;
} while ((IFG1&OFIFG)!=0); //Îæèäàåì ñòàáèëèç. êîëåáàíèé

BCSCTL2 |= BIT7 | // MCLK = XT2CLK when XT2 oscillator present on-chip
BIT4 | BIT5 | // ACLK = MCLK/8
BIT3 ; // SMCLK = XT2

IE1|=OFIE;
}
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 8 2008, 09:30
Сообщение #20


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



В моем примере выше не зря первой командой в обработчике ошибки кварцевого осциллятора стоит
Код
BCSCTL2=SELM_0|DIVM_0|DIVS_0;                   //перейдем на такт. DCO

Это не чистая блажь и не перестраховка. Я уже неоднократно здесь обращал внимание, что при сбое кварца MCLK переходит на тактирование от DCO автоматически. А вот SMCLK - нет. Нужно сначала переключить его тактирование на DCO, а затем можно переключать снова на тактирование от кварцевого генератора. Не помню описано ли это в errata, но этот глюк известен еще с давних времен. По-моему впервые я про него прочитал в сообщениях Сергея Борща. А потом уже и сам с этим встречался.
Go to the top of the page
 
+Quote Post
Сергей Борщ
сообщение Feb 8 2008, 11:07
Сообщение #21


Гуру
******

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



Цитата(rezident @ Feb 8 2008, 11:30) *
Не помню описано ли это в errata, но этот глюк известен еще с давних времен. По-моему впервые я про него прочитал в сообщениях Сергея Борща. А потом уже и сам с этим встречался.
Угу, было дело. Как я понимаю, механизм там такой - при сбое кварца происходит переключение MCLK на DCO, но на битах SELM это не отражается. И когда потом в эти биты записывается то же значение, переключения обратно не происходит - я думаю, что там переключение происходит по изменению битов, а поскольку изменения нет, то нет и переключения.


--------------------
На любой вопрос даю любой ответ
"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
aag
сообщение Feb 8 2008, 11:29
Сообщение #22


Частый гость
**

Группа: Свой
Сообщений: 81
Регистрация: 8-04-06
Из: Новосибирск
Пользователь №: 15 939



Цитата
переходит на тактирование от DCO автоматически. А вот SMCLK - нет. Нужно сначала переключить его тактирование на DCO, а затем можно переключать снова на тактирование от кварцевого генератора

Хм. интересное замечатие. Не знал.

2 cornflyer: У вас теперь получается два кварца используется или с XT2IN/XT2OUT резонатор убрали?
Go to the top of the page
 
+Quote Post
cornflyer
сообщение Feb 8 2008, 12:51
Сообщение #23


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



Цитата(aag @ Feb 8 2008, 14:29) *
2 cornflyer: У вас теперь получается два кварца используется или с XT2IN/XT2OUT резонатор убрали?

используеца только XT2IN/XT2OUT, а на XIN/XOUT просто повешен часовой кварцевый резонатор 32768 Гц.
Go to the top of the page
 
+Quote Post
shasik
сообщение Feb 8 2008, 13:12
Сообщение #24


Местный
***

Группа: Свой
Сообщений: 319
Регистрация: 3-09-05
Из: Беларусь, Новополоцк
Пользователь №: 8 188



Цитата(Dog Pawlowa @ Feb 6 2008, 08:56) *
Дело в том, что реально повышает помехоустойчивость не столько watchdog, сколько супервизор питания, которого в 149 и 449 не было.

А когда у F449 убрать "Supply Voltage Supervisor/Monitor With Programmable Level Detection" успели?
Люди его используют, а его нет оказывается. Странно как то...
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 8 2008, 14:00
Сообщение #25


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(shasik @ Feb 8 2008, 18:12) *
А когда у F449 убрать "Supply Voltage Supervisor/Monitor With Programmable Level Detection" успели?
Люди его используют, а его нет оказывается. Странно как то...

У MSP430F149 SVS не было и нет, у MSP430F449 был и есть. Dog Pawlowa, перепутал чего-то.
Go to the top of the page
 
+Quote Post
cornflyer
сообщение Feb 21 2008, 10:42
Сообщение #26


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



несмотря на все усилия - svs, watchdog, UART sync, часовой кварц на XIN/XOUT, обработчик NMI (восстанавливает настройки basic timer, timerA, timerB) - все равно проц завис !!!!!!!!
так что скорее всего это что-то программное....
буду смотреть стэк - может он переполняеца....
у меня один раз был такой глюк - если слишком много прерываний возникает - проц зависает
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 21 2008, 12:04
Сообщение #27


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(cornflyer @ Feb 21 2008, 15:42) *
у меня один раз был такой глюк - если слишком много прерываний возникает - проц зависает
Такое не может быть, если только вы не используете вложенные прерывания. ИМХО скорее всего у вас имеется какое-то разрешенное прерывание у которого не описан обработчик. Вы бы определили все имеющиеся в кристалле вектора прерываний и NOPами или запретом соответствующего прерывания их забили. Так проще баг выловить.
Go to the top of the page
 
+Quote Post
cornflyer
сообщение Feb 21 2008, 12:41
Сообщение #28


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



похоже глюк может быть в опциях оптимизации компилятора.
я использую IAR C/C++ Compiler for MSP430 V3.41
в опциях компилятора я поставил галочку Optimizations / Area -> High (Maximum optimization)
видимо так лучше не делать smile.gif
поставил Optimizations / Speed -> High (Maximum optimization)
уже 30 минут работает без глюков

если опять взглюкнет - откомпиляю свой проект в mspgcc
Go to the top of the page
 
+Quote Post
rezident
сообщение Feb 21 2008, 13:00
Сообщение #29


Гуру
******

Группа: Свой
Сообщений: 10 920
Регистрация: 5-04-05
Пользователь №: 3 882



Цитата(cornflyer @ Feb 21 2008, 17:41) *
похоже глюк может быть в опциях оптимизации компилятора.
При высоких уровнях оптимизации я отключаю некоторые опции, по крайней мере опцию Code motion всегда.
Go to the top of the page
 
+Quote Post
cornflyer
сообщение Feb 28 2008, 09:12
Сообщение #30


Частый гость
**

Группа: Свой
Сообщений: 166
Регистрация: 11-07-06
Из: Dubna
Пользователь №: 18 729



написал тестовую программу и откомпилировал ее mspgcc
загрузил MSPFET'ом в проц и теперь смотрю сколько проработает....
Итак, программа состоит из 4-х файлов:
main.c
app.с
uart.c
clock.c

/////// main.c //////////////////////////////////////////////////////////////////////////////

#include "io.h"
#include "app.h"

int main(void)
{
app_Init(); // setup device
app_Loop(); // start events processing FSM
return 0 ;
}

/////// app.с ////////////////////////////////////////////////////////////////////////////////

#include "io.h"
#include "app.h"
#include "clock.h"
#include "uart.h"
#include "signal.h"

static unsigned char i = 0 ;

void app_Init (void)
{
WDTCTL = WDTPW + WDTHOLD; // stop watchdog

_BIS_SR(0x20); // OSCOFF - Oscillator Off. This bit, when set, turns off the LFXT1 crystal oscillator.

IFG1 |= OFIFG ; // setup clock failure NMI interrupt flag
IE1 |= OFIE ; // enable NMI interrupt
for (i = 0xFF; i > 0; i--) __no_operation(); // Time to debounce

dint();

uart_Init(); // first init UART
TIMERA_Init();

eint(); // enable interrupts
}

void app_Loop (void)
{
for (;;)
{
__no_operation();
}
}

/////// uart.c ////////////////////////////////////////////////////////////////////////////////

#include "io.h"
#include "uart.h"
#include "signal.h"

void uart_Init ( void )
{
UCTL1 |= SWRST ; // Set SWRST
UCTL1 = CHAR ;
UTCTL1 = BIT5 ; // SMCLK
UBR01 = 0x80 ; // 3.6864 Mhz / 9600 - 384
UBR11 = 0x01 ;
UMCTL1 = 0x00 ; // no modulation
URCTL1 = URXEIE ; // Receive interrupt enable
ME2 |= UTXE1 + URXE1; // Enable USART0 TXD/RXD
P3SEL |= BIT6 | BIT7 ; // P2.4,5 = USART0 TXD/RXD
UCTL1 &= ~SWRST ; // clear SWRST
//IE2 |= URXIE1 ; // Enable USART0 RX/TX interrupt
}

/*
interrupt (UART1RX_VECTOR) usart1RcvIsr(void)
{
while ( !( IFG2 & UTXIFG1 ) ) __no_operation () ; // Дождаться готовности передатчика к приему новых данных
TXBUF1 = RXBUF1 ;
}
*/

/////// clock.c ////////////////////////////////////////////////////////////////////////////////

#include "io.h"
#include "clock.h"
#include "signal.h"

static unsigned char i = 0 ;

void TIMERA_Init (void)
{
TACTL = 0x00; // stop timer before config
TACCR0 = 0xFFFF ;
TACCTL0 = BIT4 ; // Timer_A capture/compare interrupt enable
TAR = 0x0000 ;
TACTL = BIT4 | // Up mode: the timer counts up to TACCR0
BIT7 | BIT6 | // CLK/8
// BIT1 | // This bit enables the TAIFG interrupt request
BIT9 ; // Timer_A clock source = SMCLK

// HV LED
P5DIR |= BIT5 ; // output
P5SEL &= ~BIT5 ; // port
}

void toggle_HV_LED ( void )
{
P5OUT ^= BIT5 ;
}

interrupt (TIMERA0_VECTOR) timerA0Isr (void) // T = 1.5 sec
{
if ( ++ i > 10 )
{
i = 0 ;
TXBUF1 = 0x78 ; // x
toggle_HV_LED () ;
}
}

interrupt (NMI_VECTOR) osc_fault (void)
{
BCSCTL2=SELM_0|DIVM_0|DIVS_0;
BCSCTL1 = 0 ; // &= ~XT2OFF; // XT2 = HF XTAL
do
{
IFG1 &= ~OFIFG ;
for (i = 0xFF; i > 0; i--) __no_operation(); // Time for flag to set
}
while ((IFG1 & OFIFG)!=0);

BCSCTL2 |= BIT7 | // MCLK = XT2CLK when XT2 oscillator present on-chip
BIT4 | BIT5 | // ACLK = MCLK/8
BIT3 ; // SMCLK = XT2
IE1|=OFIE;
}


/////// makefile ////////////////////////////////////////////////////////////////////////////////

# makfile configuration
NAME = bpv
OBJECTS = main.o uart.o clock.o app.o
CPU = msp430x169

ASFLAGS = -mmcu=${CPU} -D_GNU_ASSEMBLER_
CFLAGS = -mmcu=${CPU} -O2 -Wall -g

#switch the compiler (for the internal make rules)
CC = msp430-gcc
AS = msp430-gcc
LD = msp430-ld

.PHONY: all FORCE clean download download-jtag download-bsl dist

#all should be the first target. it's built when make is run without args
all: ${NAME}.elf ${NAME}.a43 ${NAME}.lst

#confgigure the next line if you want to use the serial download
download: download-jtag
#download: download-bsl

#additional rules for files
${NAME}.elf: ${OBJECTS}
${CC} -mmcu=${CPU} -o $@ ${OBJECTS}

${NAME}.a43: ${NAME}.elf
msp430-objcopy -O ihex $^ $@

${NAME}.lst: ${NAME}.elf
msp430-objdump -dSt $^ >$@

download-jtag: all
msp430-jtag -e ${NAME}.elf

download-bsl: all
msp430-bsl -e ${NAME}.elf

clean:
rm -f ${NAME}.elf ${NAME}.a43 ${NAME}.lst ${OBJECTS}

#backup archive
dist:
tar czf dist.tgz *.c *.h *.txt makefile

#dummy target as dependecy if something has to be build everytime
FORCE:

#project dependencies

main.o: main.c app.h
uart.o: uart.c uart.h
clock.o: clock.c clock.h
app.o: app.c clock.h uart.h



Открыл hyperterminal и наблюдаю как мой проц шлёт с периодом T~1.5 сек букву "x" (ASCII 0x78)
Go to the top of the page
 
+Quote Post

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

 


RSS Текстовая версия Сейчас: 27th July 2025 - 23:51
Рейтинг@Mail.ru


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