Механик08 (02.11.2011 09:47, просмотров: 226) ответил rezident на Давайте код инициализации USCI и портов. В качестве приемника что у вас? ПК? Преобразователь TTLV->RS232 или какой-нибудь мост USB используется?
Вот полный текст программы:
#include "msp430x21x2.h"
#define set_led() P3OUT|=BIT1
#define clr_led() P3OUT&=~BIT1
unsigned char string1[5];
unsigned char j = 0;
unsigned char rfstate=0;
void pins_init(void){
P3DIR = 0x03; //0 - in input mode; 1 - in output mode
P3OUT = 0x03;
P1DIR = 0x00;
P1OUT = 0x00;
P2DIR = 0x00;
P2OUT = 0x00;
}
void uart_init(void){
UCA0CTL1 |= UCSWRST;
UCA0CTL1 |= UCSSEL1+UCSSEL0; //SMCLK
UCA0CTL0 = 0x00;
UCA0BR0 = 0x80; // 7372800Hz/19200 = 0x0180
UCA0BR1 = 0x01;
UCA0MCTL = 0x00; // Modulation UCBRSx = 0
P3DIR |= 0x10;
P3SEL |= 0x30;
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE;
}
void main( void )
{
WDTCTL = WDTPW+WDTHOLD; //отключение watchdog
pins_init();
IE1 |= OFIE; // разрешить прерывание от детектора ошибки резонатора
IFG1 |= OFIFG;
if((rfstate&BIT1)==0) uart_init();
__bis_SR_register(GIE); // Enter LPM0, interrupts enabled
while(1);
}
// USCI A0/B0 Receive ISR
#pragma vector=USCIAB0RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
string1[j++] = UCA0RXBUF;
if (j > 4)
{
if(string1[0]==0x55){set_led();}else{clr_led();};
j = 0;
while (!(IFG2 & UCA0TXIFG));
UCA0TXBUF = 'O';
}
}
#pragma vector = NMI_VECTOR
__root __interrupt void OSCFault (void) {
unsigned char i;
BCSCTL1 = XTS + CALBC1_8MHZ; // ACLK = LFXT1 = HF XTAL, DCOCLK=8MHz
DCOCTL = CALDCO_8MHZ;
BCSCTL2 = 0; //MCLK=DCO;
if((BCSCTL3&LFXT1OF)==0){
BCSCTL3 = LFXT1S1; // 3 – 16MHz crystal or resonator
do
{
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while (IFG1 & OFIFG); // OSCFault flag still set?
BCSCTL2 = SELM_0 + SELS; // MCLK = DCO, SMCLK = LFXT1
IE1 |= OFIE;
rfstate=0; // все в порядке, ошибок нет
}else{
rfstate |= BIT1; //установка ошибки резонатора
UCA0CTL1 |= UCSWRST;
BCSCTL2 = 0;
UCA0CTL1 |= UCSSEL1+UCSSEL0; //SMCLK
UCA0CTL0 = 0x00;
UCA0BR0 = 0xA0; // 8000000Hz/19200 = 0x01A0
UCA0BR1 = 0x01;
UCA0MCTL = 6<<1; // Modulation UCBRSx = 6
P3DIR |= 0x10;
P3SEL |= 0x30;
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine**
IE2 |= UCA0RXIE;
}
}
причём если ставить брекпоинт на строке UCA0TXBUF = 'O'; и далее запускать на выполнение, МК отрабатывает вывод символа 'O'. А вот сразу - нет. В качестве приёмника у меня радиочастотный модуль Radiocrafts RC1081. На другом конце такой же модуль, подключённый к ПК через COM-USB преобразователь. Связь между модулями проверял (оба подключал к ПК через преобразователи) - в порядке.