Forum: Mikrocontroller und Digitale Elektronik UART per USCI zwischen zwei MSP430-F2274


von Igor K. (Gast)


Lesenswert?

Hi Leute,
ich kriege es einfach nicht hin eine UART-Kommunikation zwischen zwei 
F2274 aufzubauen. Hab schon viel rumprobiert, aber es funktioniert 
überhaupt nicht so wie ich es mir gedacht habe.
Und zwar sollen erst einmal nur die zwei µCs mit einander reden. Der 
eine sendet dem anderen ein Byte. Im Debugger (IAR) setze ich in einen 
Breakpoint in der Rx ISR. Aber die wird nie angesprungen.

Hier der Code für den Transmitter. Er soll permanent das selbe, 
willkürliche, Byte versenden:
1
#include "msp430x22x4.h"
2
3
void main(void)
4
{
5
  WDTCTL = WDTPW + WDTHOLD;      // Stop watchdog timer
6
  BCSCTL1 = CALBC1_8MHZ;   // DCO auf 12MHz einstellen
7
  DCOCTL = CALDCO_8MHZ;          // DCO auf 12MHz einstellen
8
  P1DIR = 0xFF;
9
  P3SEL = 0x30;                  // P3.4,5 = USCI_A0 TXD/RXD
10
  UCA0CTL1 |= UCSSEL_2;          // CLK = SMCLK
11
  UCA0BR0 = 0x41;                // 8MHz/9600 = 833,33
12
  UCA0BR1 = 0x3;
13
  UCA0MCTL = UCBRS_2;           
14
  UCA0CTL1 &= ~UCSWRST;          // **Initialize USCI state machine**
15
  IE2 |= UCA0RXIE;    // Enable USCI_A0 TX/RX interrupt
16
17
  _EINT();
18
  
19
  while(1);
20
}
21
22
// USCI A0/B0 Transmit ISR
23
#pragma vector=USCIAB0TX_VECTOR
24
__interrupt void USCI0TX_ISR(void)
25
{
26
  UCA0TXBUF = 0x81;           
27
}

Und hier der Code für den Receiver. Dort soll halt ienfach mal die ISR 
angesprungen werden. Im Debugger schaue ich mir dann den RxBuffer an. 
Dort sollte dann ja 0x81 drinstehen, wenn alles geklappt hat:
1
#include "msp430x22x4.h"
2
3
void main(void)
4
{
5
  WDTCTL = WDTPW + WDTHOLD;      // Stop watchdog timer
6
  BCSCTL1 = CALBC1_8MHZ;   // DCO auf 12MHz einstellen
7
  DCOCTL = CALDCO_8MHZ;          // DCO auf 12MHz einstellen  
8
  P1DIR = 0xFF;
9
  P3SEL = 0x30;                  // P3.4,5 = USCI_A0 TXD/RXD
10
  UCA0CTL1 |= UCSSEL_2;          // CLK = SMCLK
11
  UCA0BR0 = 0x41;                // 8MHz/9600 = 833,33
12
  UCA0BR1 = 0x3;
13
  UCA0MCTL = UCBRS_2;            
14
  UCA0CTL1 &= ~UCSWRST;          // **Initialize USCI state machine**
15
  IE2 |= UCA0RXIE;              // Enable USCI_A0 TX/RX interrupt
16
17
  _EINT();
18
  
19
  while(1);
20
  
21
}
22
23
24
25
// USCI A0/B0 Receive ISR
26
#pragma vector=USCIAB0RX_VECTOR
27
__interrupt void USCI0RX_ISR(void)
28
{
29
    P1OUT = 0x01; 
30
}

Bitte Leute, was mache ich falsch? Vielen Dank schon für eure Hilfe.

von Dennis (Gast)


Lesenswert?

Geht den der Sender in den TX-Interrupt überhaupt rein? Du solltest ja 
vielleicht vor deiner Endlosschleife erstmal manuell ein Byte in den 
Puffer schreiben, damit das ganze anläuft. Oder ist das Flag von Anfang 
an gesetzt und er springt rein? Kann auch sein, müsste sogar...


ABER: Darüber hinaus setzt du auch beim Sender das RXIE und nicht TX. 
Insofern kann schon die ISR garnicht funktionieren. Schau mit IAR 
erstmal hier, dann den Empfänger.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.