UART per USCI zwischen zwei MSP430-F2274

Gast #3115450
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.
Gast #3115654
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.

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.