Usando programación integrada, Code Composer Studio 6.0.1,
Intentando configurar UART para comunicarse entre MSP430F6736A y mi PC. Usando convertidor USB/RS485 (2 vires (A,B)).
Para enviar datos usando HERCULES (aplicación para probar la comunicación).
#include <msp430.h>
#include <msp430f6736.h>
/*
* main.c
*/
int main(void) {
WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
P4DIR |= BIT6;
P4OUT &= ~BIT6;
//clock
//UCSCTL0 |= DCO_0 | MOD_0;
//UCSCTL1 |= DCORSEL_0;
// Config pinov P2.2 a P2.3 na ich funkciu(Rx a Tx)
P2SEL |= BIT2 + BIT3; // RX and TX pins
// config comm
UCA1CTLW0 |= UCSWRST; // reset UCA1 for config
UCA1CTLW0 |= UCSSEL_1 ; // ACLK as source clock
UCA1MCTLW |= UCBRS0;
// Baudrate from datasheet
UCA1BR0 = 1; // 1200 Baud
UCA1BR1 = 11; // 1200 Baud
UCA1CTLW0 &= ~UCSWRST; // UCA1 back from reset
// interrupts enabled for RT and TX
UCA1IE |= UCTXIE | UCTXIE;
__bis_SR_register(GIE); // global interupt enabled
}
#pragma vector=USCI_A1_VECTOR
__interrupt void Recieve_ISR(void)
{
while (!UCA1IFG) // USCI_A0 TX buffer ready?
{
P4DIR |= BIT6;
P4OUT &= ~BIT6;
UCA1RXBUF = UCA1TXBUF; // TX -&gt; RXed character
}
}
Todo lo que quiero es cuando envío datos (por ejemplo, el número 5) desde HERCULES (configuración igual: 1200 baudios, sin paridad, 1 bit de parada), quiero recibirlos y encender el LED. Pero no funciona.
En algún lugar de este código falta algo o algo está mal escrito. , . Tengo la cabeza grande de las hojas de datos, ¿alguien puede ayudarme?
Toda la función del controlador de interrupciones es incorrecta.
while (!(UCA1IFG & UCA1IV)); // UCA1 TX buffer ready?
UCA1IV es un registro vectorial, no un indicador de interrupción. Para esperar a que el búfer TX esté listo, debe verificar que el bit UCTXIFG esté configurado.
UCA1TXBUF = UCA0RXBUF;
Esta línea pasa a ser correcta.
if (UCA1TXBUF == UCA0RXBUF)
Acceder a los registros tiene efectos secundarios. La lectura de UCA1TXBUF podría funcionar, pero la lectura de UCA0RXBUF elimina el siguiente byte del búfer, si existe.
Y esta comparación no tiene sentido; repitió el byte recibido en la línea anterior, por lo que esta condición, si funcionó, siempre sería cierta.
P4DIR |= BIT6;
No necesita reinicializar este bit.
P4OUT &= ~BIT6; // turn on LED
Esto no cambia el estado del LED, porque el bit tiene el mismo valor con el que lo inicializaste.
La función de interrupción debería verse algo así:
while (!(UCA1IFG & UCTXIFG)); // UCA1 TX buffer ready?
UCA1TXBUF = UCA0RXBUF;
P4OUT ^= BIT6; // toggle LED
CL.
usuario5939530
CL.
usuario5939530