Guten Tag,
Ich möchte vom meinem Msp430F248 über Port P3.5 / P3.6 (RX / TX)
serielle Daten senden. Doch irgendwie funktionieren diese Einstellungen
nicht so ganz.
mfg Mathias
#pragma vector=USCIAB1RX_VECTOR
__interrupt void USCI0RX_ISR(void)
{
command = UCA1RXBUF;
/*
if(UCA1RXBUF == 'a'){
UCA1TXBUF = 'V';
}
*/
}
void initsci(){
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF)
{
while(1); // If calibration constants
erased
// do not load, trap CPU!!
}
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
P3SEL = BIT6 + BIT7; // P3.4,5 = USCI_A0
TXD/RXD
UCA1CTL1 |= UCSSEL_2; // SMCLK
UCA1BR0 = 6; // 1MHz 9600
UCA1BR1 = 0; // 1MHz 9600
UCA1MCTL = UCBRF3 + UCOS16; // Modln UCBRSx=1, over
sampling
UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state
machine**
UC1IE |= UCA1RXIE; // Enable USCI_A0 RX
interrupt
// UCA1IE |= UCTXIE + UCRXIE; // Enable USCI_A1 TX/RX interrupt
__bis_SR_register(GIE); // Enter LPM3 w/ int until Byte RXed
Gast
#2152631
Mathias K. schrieb: > UCA1BR0 = 6; // 1MHz 9600 > UCA1BR1 = 0; // 1MHz 9600 Wie errechnet sich denn das zu 9600 bei 1MHz?
Gast
#2152652
Noch was anderes: Mathias K. schrieb: > #pragma vector=USCIAB1RX_VECTOR > __interrupt void USCI0RX_ISR(void) > { > command = UCA1RXBUF; > /* > if(UCA1RXBUF == 'a'){ > > UCA1TXBUF = 'V'; > } > */ > } Wenn du den Buffer schon ausliest, dann arbeite lieber mit der anderen Variable weiter, als ihn nochmal auszulesen. Mathias K. schrieb: > UCA1IE |= UCTXIE + UCRXIE; Wenn du den TX-IR freigeben solltest, dann musst du dafür auch einen Handler haben, zumindest nen leeren - sonst kann es sein, dass ich das Programm verläuft.
BCSCTL1 = CALBC1_1MHZ; // Set DCO
DCOCTL = CALDCO_1MHZ;
P3SEL = BIT6 + BIT7; // P3.6,7 = USCI_A1 TXD/RXD
UCA0CTL1 |= UCSSEL_2; // SMCLK
UCA0BR0 = 6; // 1MHz 9600
UCA0BR1 = 0; // 1MHz 9600
UCA0MCTL = UCBRF3 + UCOS16; // Modln UCBRSx=1, over
sampling
UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state
machine**
UCA1CTL1 &= ~UCSWRST; // Initialize USCI
state machine
UC1IFG &= ~(UCA1TXIFG | UCA1RXIFG); // clear possible
pending interrupts
UC1IE |= (UCA1RXIE | UCA1TXIE); // Enable USCI_A1 TX &
RX interrupt
//_EINT();
__bis_SR_register(GIE); // sleep, leave interrupts on
while(1){};
}
#pragma vector=USCIAB1RX_VECTOR
__interrupt void USCI1RX_ISR(void)
{
UCA1TXBUF = UCA1RXBUF; // TX -> RXed character
}
ich habs mal so gemacht nur verstehe ich deine Antwort zuvor nicht.
mfg Mathias
Gast
#2152984
Wie bist du denn auf UCA0BR0 = 6; gekommen? Und du hast nu immernoch TX-IR freigegeben, aber keinen Handler dafür.
i wie meinst du das mit dem freigeben i weiss echt nicht weiter ? Wie schaut den dieser Handler aus ? Aus dieser Datei habe ich die 6 raus. lg
Mathias K. schrieb: > i wie meinst du das mit dem freigeben i weiss echt nicht weiter ? Du hast dem µC gesagt das er bei leerem TX Buffer einen Interrupt auslösen soll (UC1IE |= (UCA1RXIE | UCA1TXIE);), hast aber keine Interruptroutine dafür geschrieben.
Gast
#2153189
Mathias K. schrieb: > Aus dieser Datei habe ich die 6 raus. Und wo steht da die 6? Rechne doch mal: Du hast nen CLOCK von 1MHz und willst ne Baudrate von 9600. 1.000.000 / 9.600 = 104 Und genauso steht es doch auch in der Tabelle - wo hast du die 6 her? Und dir 104 musst du ins BR0 eintragen, nicht ins BR1, da sich der Prescaler aus (BR0 + 256*BR1) ergibt.
Gast
#2154763
interessant ist es nur das ich diese einstellung aus einem denoprogramm vn ti i habe gg komische sache halt. mfg mathias
Antwort schreiben
Bitte melde dich an, um einen Beitrag zu schreiben.
