Gast
#427242
Hallo.
Ich möchte mit dem MSP430f149 eine USART Kommunikation aufbauen. Durch
die
Hilfe von mathar.com will ich ein einfaches Echo erzeugen. Problem:
nichts passiert. Einstellungen sind bei COM Terminal und beim
Hardwaremanager sind identisch. Wo kann mein Fehler noch liegen.
Ich benutze den ACLK der (7,3728 MHz /2).
mfg
Rico
#include "msp430x14x.h"
unsigned char answer1[] = "Buchstabe ";
unsigned char answer2[] = " gedrueckt\r\n";
char i, j;
void main(void)
{
WDTCTL = WDTPW + WDTHOLD; // watchdog aus
//takt einstellen
BCSCTL1|=XTS+XT2OFF+DIVA_1; //initialisierung von ACLK, XTS
aktiviert den externen quarz
__bic_SR_register(OSCOFF); //löscht das bit(0) OSCOFF im
statusregister> LFXT1 is on
do //do-schleife überprueft ob
OFIFG-flag gesetzt ist
{
IFG1 &=~OFIFG; //löscht OFIFG
for (i=0xFF;i>0;i--);
}
while (IFG1&OFIFG); //abbruchbedinung
BCSCTL2=SELM_3+SELS; //SELM_3 soll den LFXTCLK soll
den MCLK generieren
P2SEL=0x01; //schaltet pin2.0 die
sonderfunktion(ACLK) ein (funktioniert aber nicht)
P5SEL=0x70; //schaltet pin5.4-5-6 (01110000)
die sonderfunktion ein MCLK, SMCLK, ACLK
P1DIR=0x01;
P2DIR=0x01;
P1OUT=0x01;
P3SEL = 0x30; // P3.4 und P3.5 als USART0
TXD/RXD
ME1 |= UTXE0 + URXE0; // TX- und RX-modul erst mal
anschalten
UCTL0 |= CHAR; // 8 data bits, 1 stop bit, no
parity (8N1)
UTCTL0 |= SSEL0; // ACLK als UCLK festlegen
SSEL0 entspricht logisch 01
UBR00 = 0x60; // 19200 baud aus
3,6864MHz(ACLK/2) erzeugen, N=192 ohne rest
UBR10 = 0x00;
UMCTL0 = 0x00; // korrektur der division
UCTL0 &= ~SWRST; // USART freigeben
IE1 |= URXIE0 + UTXIE0; // TX- und RX-interrupts
anschalten
IFG1 &= ~UTXIFG0; // initales interrupt-flag
loeschen
_BIS_SR(LPM3_bits + GIE); // ab in den LPM3 mit interrupts
...
}
#pragma vector=UART0TX_VECTOR
__interrupt void usart0_tx (void)
{
if (i < sizeof answer1-1) // string schon zu ende?
TXBUF0 = answer1[i++]; // string ausgeben
else if (i == sizeof answer1-1) // wenn erster string zu ende
...
{
TXBUF0 = RXBUF0; // ... dann den getippten
buchstaben ausgeben
i++;
}
else if (j < sizeof answer2-1) // wenn auch der ausgegeben ist
...
TXBUF0 = answer2[j++]; // ... dann den zweiten string
ausgeben
}
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void)
{
i = 0;
j = 0;
TXBUF0 = answer1[i++]; // ersten buchstaben von answer1
ausgeben
}