Hallo µC-Gemeinde,
ich habe beim MSP430F1611 das Problem, dass der Interrupt beim Empfangen
mit UART nur ausgelöst wird, wenn ich mehr als ein Zeichen sende, also
nur bei zwei oder mehr.
Auch werden die Zeichen nicht richtig empfangen (z. B. wenn ich ein
(also zwei) 'a' sende kommt am µC im RXBUF0 0xa7 (§) raus)
Ich habe die Hardware für ein Schulprojekt gestellt bekommen. Es wurden
ein 8MHz- und ein 32768Hz-Quarz verbaut und ich hoffe richtig verbunden
(laut Schaltplan: ja)
hier die Initialisierung von der UART
1 | void initSerial () {
|
2 | // UART Reset für Konfiguration
|
3 | U0CTL |= 0x01;
|
4 | // P3.5 als Input
|
5 | P3DIR &= ~(0x20);
|
6 | // P3.4 als Output
|
7 | P3DIR |= 0x10;
|
8 | // Alternativ-Funktion von P3.5 + 4 auswählen (UART)
|
9 | P3SEL |= 0x20 | 0x10;
|
10 | // 8-MHz-Quarz aktivieren (X2)
|
11 | BCSCTL1 &= ~(0x80);
|
12 | // 8-MHz-Quarz als Quelle für SMCLK auswählen
|
13 | BCSCTL2 |= 0x08;
|
14 | // SMCLK auf 1 MHz runterteilen
|
15 | BCSCTL2 |= 0x40 | 0x20;
|
16 | // keine Parität
|
17 | U0CTL &= ~(0x80);
|
18 | // ein Stoppbit
|
19 | U0CTL &= ~(0x20);
|
20 | // 8-Bit-Daten
|
21 | U0CTL |= 0x10;
|
22 | // kein Listen-Mode
|
23 | U0CTL &= ~(0x08);
|
24 | // UART-Mode auswählen
|
25 | U0CTL &= ~(0x04);
|
26 | // kein Mulitprozessor-Mode
|
27 | U0CTL &= ~(0x02);
|
28 | // SMCLK als UCLK auswählen
|
29 | U0TCTL |= 0x20;
|
30 | U0TCTL &= ~(0x10);
|
31 |
|
32 | // // Baudrate: 115200 mit SMCLK (8 MHz)
|
33 | // UBR10 = 0x00;
|
34 | // UBR00 = 0x45;
|
35 | // UMCTL0 = 0xaa;
|
36 |
|
37 | // // Baudrate: 28800 mit SMCLK (8 MHz)
|
38 | // UBR10 = 0x01;
|
39 | // UBR00 = 0x15;
|
40 | // UMCTL0 = 0xbb;
|
41 |
|
42 | // Baudrate: 28800 mit SMCLK (1 MHz)
|
43 | UBR10 = 0x00;
|
44 | UBR00 = 0x45;
|
45 | UMCTL0 = 0xaa;
|
46 |
|
47 | // Senden aktivieren
|
48 | ME1 |= 0x80;
|
49 | // Empfangen aktivieren
|
50 | ME1 |= 0x40;
|
51 | // UART Reset zurücksetzen
|
52 | U0CTL &= ~(0x01);
|
53 | // UART RX Interrupt aktivieren
|
54 | IE1 |= 0x40;
|
55 | }
|
und die ISR
1 | #pragma vector = USART0RX_VECTOR
|
2 | __interrupt void ser0int () {
|
3 | while (!(IFG1 & UTXIFG0)); // USART0 TX buffer ready?
|
4 | TXBUF0 = RXBUF0; // RXBUF0 to TXBUF0
|
5 | }
|
in der main-Funktion werden alle Interrupts zugelassen (und sobald zwei
Zeichen gesendet bzw. empfangen werden springt der Controller ja auch in
die ISR)
Ach noch nebenbei, das Senden funktioniert einwandfrei (also µC -> PC).
Bitte um schnelle Hilfe!!
Gruss Michael