Перейти к содержанию
    

MSP430F2254 проблеммы с UART

Всем привет, у меня такая проблема написал программу на 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

У вас не хватает обработчика прерывания от приемника UART. Либо не разрешайте прерывания от него (UCA0RXIE), если не собираетесь использовать и тем более не стоит "насильно" взводить флаг UCA0RXIFG.

Вообще стоит вначале проинициализировать систему тактирования и функции всех пинов явными значениями (без масок), не надеясь на их дефолтные состояния.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

[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 он мне щас не нужен

Всё равно работает только в режиме отладки :smile3046:

 

 

если ты про P3DIR |= 0x30;

То Я так сделал ничего не изменилось

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Я щас поигрался с 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;
}

 

Что вообще происходит почему так???

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

По первому сообщению. Вы уверенны что дефолтные значения в модуле 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
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1 Если чесно то не уверен, но это взято из стандартных примеров

 

2 на счёт _EINT(); while(1); да это удобнее)) Спс

 

"msp430x22x4.h" поставил..

 

Всё равно не работает... плату сами собирали

Возможно в схеме гон...

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Кварц не работает на 1-й ноге 0 а на другой 1

Вот настройка для внешноего

 

BCSCTL1 |= XTS + XT2OFF;

BCSCTL2 |= SELM_2 + SELS;

 

Вроде всё так(((

 

Вернее работает от внутреннего при настройках внешнего...

Остальное работает хорошо

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как раз не так.

XTS включение ВЧ режима. У вас 32 кГц кварц. Это НЧ режим.

XT2OFF не обязательно выключать, его и так нет у вас.

В регистре BCSCTL1 вам только интересны биты DIVAx.

Лучше использовать SELM_3, для лучшего переносимости кода. Это первое.

Во-вторых по моемому(читать руководство надо) процессор не может тактироваться от НЧ кварца. Только от 400 кГц.

И зачем SMCLK тактировать от ACLK?

 

Делайте так. Переферию если вам надо тактируйте от ACLK, а процессор от SMCLK.

Т.е. (я сейчас проверил) в DC0 по умолчанию ACLK настроен на кварц 32768кГц. Настраивать надо только делитель ACLK.

 

И проверьте, нет ли КЗ с общим прводом у ноги кварца, у которого "0".

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
К сожалению, ваш контент содержит запрещённые слова. Пожалуйста, отредактируйте контент, чтобы удалить выделенные ниже слова.
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...