Полная версия этой страницы:
MSP430F2254 проблеммы с UART
0x0D_0x0A_0x0D
Aug 8 2012, 10:49
Всем привет, у меня такая проблема написал программу на IAR в отладчике работает правельно, выключаю IAR ВСЁЁЁЁ ни ацп ни уарт не работают
Написал отдельно передачу по UART таже фигня.... Вот код полностью
#include "io430.h"
unsigned int i;
unsigned int j;
unsigned char txbuffer[16]= {0x0D, 0x0A, 0x09, 0x09,
0x09, 0x09, 0x09, 0x09,
0x09, 0x09, 0x09, 0x09,
0x0A, 0x0D, 0xFF, 0xFF};
unsigned char rxbuffer[16];
int main( void ) {
WDTCTL = WDTPW + WDTHOLD;
P2DIR |= BIT1;
P2OUT = BIT1; // P1.0/1 setup for LED output
P3SEL = 0x30;
IFG2 |= UCA0TXIFG + UCA0RXIFG;
UCA0CTL1 |= UCSSEL_1; // CLK = ACLK
UCA0BR0 = 0x03; // 32kHz/9600 = 3.41
UCA0BR1 = 0x00;
UCA0MCTL = UCBRS1 + UCBRS0; // Modulation UCBRSx = 3
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE + UCA0TXIE; // Enable USCI_A0 TX/RX interrupt
__bis_SR_register(LPM3_bits + GIE); // Enter LPM3 w/ interrupts enabled
}
// USCI A0/B0 Transmit ISR
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{
P2OUT |= BIT1; // P1.0/1 setup for LED output
i = 405; // Delay
do (i--);
while (i != 0);
P2OUT &= ~BIT1; // P1.0/1 setup for LED output
i = 450; // Delay
do (i--);
while (i != 0);
UCA0TXBUF = txbuffer[0]; // Read, justify, and transmit
}
Для нагляднасти отправляю 0 и 1 на Р2.1
rezident
Aug 8 2012, 18:20
У вас не хватает обработчика прерывания от приемника UART. Либо не разрешайте прерывания от него (UCA0RXIE), если не собираетесь использовать и тем более не стоит "насильно" взводить флаг UCA0RXIFG.
Вообще стоит вначале проинициализировать систему тактирования и функции всех пинов явными значениями (без масок), не надеясь на их дефолтные состояния.
0x0D_0x0A_0x0D
Aug 9 2012, 02:51
Код
[code]int main( void ) {
WDTCTL = WDTPW + WDTHOLD;
// Я же тут всё проинициализировал
P3SEL = 0x30;
IFG2 |= UCA0TXIFG;
UCA0CTL1 |= UCSSEL_1;
UCA0BR0 = 0x03; // 32kHz/9600 = 3.41
UCA0BR1 = 0x00;
UCA0MCTL = UCBRS1 + UCBRS0;
UCA0CTL1 &= ~UCSWRST;
IE2 |= UCA0TXIE;
__bis_SR_register(LPM3_bits + GIE); // Enter LPM3 w/ interrupts enabled
}
// USCI A0/B0 Transmit ISR
#pragma vector=USCIAB0TX_VECTOR
__interrupt void USCI0TX_ISR(void)
{
UCA0TXBUF = txbuffer[0];
}
[/code]
Я тут оставил только передачу.. убрал RX он мне щас не нужен
Всё равно работает только в режиме отладки
если ты про P3DIR |= 0x30;
То Я так сделал ничего не изменилось
0x0D_0x0A_0x0D
Aug 9 2012, 07:31
Я щас поигрался с Watchdog Timer там та же проблема в отладчике всё работает а при выходе перестаёт работать
Код
#include "io430.h"
void main(void)
{
WDTCTL = WDT_ADLY_16;
IE1 |= WDTIE;
P3DIR |= 0x10;
__bis_SR_register(LPM3_bits + GIE);
}
// Watchdog Timer interrupt service routine
#pragma vector = WDT_VECTOR
__interrupt void watchdog_timer(void)
{
P3OUT ^= 0x10;
}
Что вообще происходит почему так???
KARLSON
Aug 10 2012, 05:22
По первому сообщению. Вы уверенны что дефолтные значения в модуле DC0 (система тактирования) застявят работать кварц 32 кГц на линию ACLK?
По поводу последнего: без строчки __bis_SR_register(LPM3_bits + GIE);, а лучше в место неё _EINT(); while(1); всё равно не работает?
А ватчдок таймер случайно не от MCLK тактируется? Так если с помощью режимов вы отключаете MCLK как таймер считать будет?
И ещё. уберите #include "io430.h"
напишите конкретно #include "msp430f2254.h" или #include "msp430x22x4.h", это ещё завист от версии компилятора.
вот пример от техаса:
Код
#include "msp430x22x4.h"
void main(void)
{
WDTCTL = WDT_MDLY_32; // Set Watchdog interval to ~27ms
IE1 |= WDTIE; // Enable WDT interrupt
P1DIR |= 0x01; // Set P1.0 to output direction
__bis_SR_register(LPM0_bits + GIE); // Enter LPM0 w/ interrupt
}
// Watchdog Timer interrupt service routine
__interrupt void watchdog_timer (void);
WDT_ISR(watchdog_timer)
__interrupt void watchdog_timer (void)
{
P1OUT ^= 0x01; // Toggle P1.0 using exclusive-OR
}
0x0D_0x0A_0x0D
Aug 10 2012, 07:05
1 Если чесно то не уверен, но это взято из стандартных примеров
2 на счёт _EINT(); while(1); да это удобнее)) Спс
"msp430x22x4.h" поставил..
Всё равно не работает... плату сами собирали
Возможно в схеме гон...
KARLSON
Aug 10 2012, 07:43
проверьте питание, цепь RESET, кварц.
0x0D_0x0A_0x0D
Aug 11 2012, 05:35
Кварц не работает на 1-й ноге 0 а на другой 1
Вот настройка для внешноего
BCSCTL1 |= XTS + XT2OFF;
BCSCTL2 |= SELM_2 + SELS;
Вроде всё так(((
Вернее работает от внутреннего при настройках внешнего...
Остальное работает хорошо
KARLSON
Aug 11 2012, 15:21
Как раз не так.
XTS включение ВЧ режима. У вас 32 кГц кварц. Это НЧ режим.
XT2OFF не обязательно выключать, его и так нет у вас.
В регистре BCSCTL1 вам только интересны биты DIVAx.
Лучше использовать SELM_3, для лучшего переносимости кода. Это первое.
Во-вторых по моемому(читать руководство надо) процессор не может тактироваться от НЧ кварца. Только от 400 кГц.
И зачем SMCLK тактировать от ACLK?
Делайте так. Переферию если вам надо тактируйте от ACLK, а процессор от SMCLK.
Т.е. (я сейчас проверил) в DC0 по умолчанию ACLK настроен на кварц 32768кГц. Настраивать надо только делитель ACLK.
И проверьте, нет ли КЗ с общим прводом у ноги кварца, у которого "0".
0x0D_0x0A_0x0D
Aug 16 2012, 10:50
))))
Дело было всётаки в питании
....
Спасибо
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.