Forum: Mikrocontroller und Digitale Elektronik MSP430F169 Interrupt UART


von Sandra (Gast)


Lesenswert?

Liebe Kollegen!

Ich versuche auf einem MSP430F169 via RS232 ein Echo zu bauen. Ich kann 
zwar von dem Board zum PC senden aber der µC geht nicht in den Interrupt 
wenn ich am PC etwas tippe. (Ich verwende den Code Composer und 
Hyperterminal)

Ich hab schon in den Foren gelesen und auch in einem MSP430 Buch 
nachgesehen aber leider ohne Erfolg.

Könnt Ihr mir helfen? Was ist falsch bzw. was fehlt?
1
#include <stdio.h>
2
#include <msp430x16x.h>
3
4
5
6
#define BIT(x) (1 << (x))
7
8
9
10
11
void init_RX (void);
12
13
14
void main(void) 
15
{
16
  
17
  WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
18
  init_RX();
19
  _EINT(); //Global Interrupt enable
20
21
  
22
  while(1);
23
  
24
}
25
26
#pragma vector=USART1RX_VECTOR
27
__interrupt void usart1_rx (void)
28
{
29
  while (!(IFG2 & UTXIFG1));                // USART1 TX buffer ready?
30
  TXBUF1 = RXBUF1;                          // RXBUF1 to TXBUF1
31
}
32
33
void init_RX (void)
34
{
35
  P3SEL |= 0xC0;                            // P3.6,7 = USART1 TXD/RXD
36
  ME2 |= UTXE1 + URXE1;                     // Enable USART1 TXD/RXD
37
  UCTL1 |= CHAR;                            // 8-bit character
38
  UTCTL1 |= SSEL0;                          // UCLK = ACLK
39
  UBR01 = 0x03;                             // 32k/9600 - 3.41
40
  UBR11 = 0x00;                             //
41
  UMCTL1 = 0x4A;                            // Modulation
42
  UCTL1 &= ~SWRST;                          // Initialize USART state machine
43
  IE2 |= URXIE1;                            // Enable USART1 RX interrupt
44
  while (!(IFG2 & UTXIFG1));                // USART1 TX buffer ready?
45
  TXBUF1 = 0x25;                            // %
46
  //_BIS_SR(LPM3_bits + GIE);                 // Enter LPM3 w/ interrupt
47
}

DANKE!

Bussi Sandy

von g. b. (gunb)


Lesenswert?

Sandra schrieb:
> UCTL1 &= ~SWRST;                          // Initialize USART state machine

Hier wird der RESET-Zustand des USART zur Initialisierung durch Löschen 
des Bits verlassen, aber wo aktivierst du ihn?

Setz mal am Anfag der Initialisierung das Bit SWRST in UCTL1 auf HI und 
prüfe, ob er dann läuft.
Beim MSP430 musst du dich hier genau ans Datenblatt halten, sonst zickt 
der rum.

Also: UCTL1 |= SWRST;

GRuß
Gunb

von Sandra (Gast)


Lesenswert?

Nein, geht leider nicht.

Ich hab´s einfach am anfang dazugehängt.

von g. b. (gunb)


Lesenswert?

OK, drin lassen.

Da du das Senden nicht per Interrupt machst, könnte das Interruptflag 
für TX durch das initiale Senden von 0x25 vielleicht noch auf 0 liegen, 
wenn er in die RX-ISR einspringt. Dort hängt er dann in der while-loop 
fest. Versuchweise könntest du das Senden von 0x25 mal unterlassen, also 
in Init folgendes entfernen/auskommentieren:

Sandra schrieb:
> while (!(IFG2 & UTXIFG1));                // USART1 TX buffer ready?
>   TXBUF1 = 0x25;                            // %

von Sandra (Gast)


Lesenswert?

Geht leider auch nicht.

Ich habes auskommentiert.
Zusätzlich habe ich einen Breakpoint in der ISR.

von g. b. (gunb)


Lesenswert?

Sandra schrieb:
> Geht leider auch nicht.
>
> Ich habes auskommentiert.
> Zusätzlich habe ich einen Breakpoint in der ISR.

Breakpoint? JTAG vorhanden? Springt er bei Senden per PC überhaupt in 
die ISR?

Kannst du auch mal weglassen und schauen, was geht:
> while (!(IFG2 & UTXIFG1));                // USART1 TX buffer ready?

von Sandra (Gast)


Lesenswert?

Nein auch nichts.

Ja, ich hab das Ding auf JTAG

Er springt nicht einmal in die ISR.

Danke für die Mühe!

von g. b. (gunb)


Lesenswert?

Sandra schrieb:
> Er springt nicht einmal in die ISR

Optionen:

- Mir schon passiert: RX-Eingang kaputt. Hoffe, du arbeitest mit 3.3V 
Wandler, nicht mit MAX232

-> Gleiches auf 1. USART probieren.

- RxD-Signal nicht vorhanden: mit Scope geprüft?

- Clock: Modulation-Wert weicht ab
-> Senden mit 0x25 muss auch wirklich immer 0x25 ergeben.

Arbeite derzeit am AVR, könnte MSP430F169 heute Abend mal mit 
GCC-Umgebung und JTAG prüfen. Du arbeitest mit IAR Kickstart?

von Erik (Gast)


Lesenswert?

shon mal mit dem Beispiel von der TI seite probiert ?
machen das dort mit P3.4 -5  das kann man ja anpassen .

mfg Erik

von Sandra (Gast)


Lesenswert?

Ja, das TI Programm habe ich schon versucht. Im Grunde ist mein 
Programmteil das TI Programm.

Das mit dem Scope ist eine gute Idee. Ich werde es morgen probieren 
(heute leider keine Zeit).

Den Anderen RX Eingang kann ich leider nicht testen. Mein Kollege hat 
nur einen RX rausgelegt.

Danke und bis morgen!

Bussi Sandy

von LuXXuS 9. (aichn)


Lesenswert?

Guten Morgen!

Gun B. schrieb:
> Springt er bei Senden per PC überhaupt in
> die ISR?

Dann geh doch einen Schritt voraus und gucke, ob das RX-Bit nach dem 
Empfang eines Charakters überhaupt gesetzt wird. Wenn das nämlich nicht 
der Fall ist, dann weißt du schonmal, dass evtl. garnichts ankommt.

Ich weiß jetzt selber nicht genau, wo im Code Composer die CPU-Register 
zu finden sind, aber die wird es da doch sicherlich auch geben.

Schau auch ruhig mal vor der Übertragung, ob das Bit auf '0' steht, dann 
ruhig mehrere Charakter senden und schauen, ob das Bit gesetzt wird.

Und nochwas nicht ganz unwichtiges: Du kannst in den UART-Einstellungen 
i.d.R. auch das Verhalten im Falle eines fehlerhaft übertragenen 
Zeichens einstellen (ist zumindest bei den neueren Derivaten so - den 
169er habe ich noch nie verwendet). Es kann also sein, dass deine 
Baudrateneinstellung fehlerhaft ist und das Zeichen daher als Fehler 
erkannt wird und dadurch garnicht als "Empfang" gekennzeichnet wird. 
Aber auch für einen Fehler gibt es ein Bit, das überprüft werden kann.

Alles mal unter Vorbehalt, da ich den 169er noch nie in den Händen 
hatte...

Sandra schrieb:
> Bussi Sandy

Zurück

von LuXXuS 9. (aichn)


Angehängte Dateien:

Lesenswert?

So, ich hab mir mal den Family-Guide angeguckt und dir die entsprechende 
Stelle rausgesucht.

Wie du siehst, ist das Bit für den Empfang trotz eines fehlerhaften 
Zeichens per default auf '0', das Zeichen wird also zurückgewiesen und 
kein Bit gesetzt.

Das wäre zumindest eine Möglichkeit, woran es liegen könnte. Also 
erstmal würde ich auf das Fehler-Bit achten und dann, falls gesetzt, an 
der Baudrate drehen.

von g. b. (gunb)


Lesenswert?

LuXXuS 909 schrieb:
> Gun B. schrieb:
>> Springt er bei Senden per PC überhaupt in
>> die ISR?
>
> Dann geh doch einen Schritt voraus und gucke,

??? Ich habe kein Problem mit dem USART des MSP430.

Nebenbei schon erwähnt.

von LuXXuS 9. (aichn)


Lesenswert?

Gun B. schrieb:
> ??? Ich habe kein Problem mit dem USART des MSP430.

Ist mir schon klar, wollte nur auf deinen Beitrag aufbauen. Wenn du dich 
dadurch jetzt auf den Schlips getreten fühlst, dann bitte ich natürlich 
vielmals um Entschuldigung.

von g. b. (gunb)


Lesenswert?

LuXXuS 909 schrieb:
> Ist mir schon klar, wollte nur auf deinen Beitrag aufbauen. Wenn du dich
> dadurch jetzt auf den Schlips getreten fühlst, dann bitte ich natürlich
> vielmals um Entschuldigung.

Natürlich nicht ;-)

von LuXXuS 9. (aichn)


Lesenswert?

Gun B. schrieb:
> Natürlich nicht ;-)

Na dann bin ich ja beruhigt ;)

von Sandra (Gast)


Lesenswert?

Guten Morgen!

Ich habs mir einfacher gemacht und den Code geändert.
1
  while(1)
2
    {
3
        while (!(IFG2 & UTXIFG1));                // USART1 TX buffer ready?
4
        TXBUF1 = RXBUF1;
5
    }

Im Hyper Terminal sehe ich zwar mein lokales Echo aber sonst kommt 
nichts zurück. Ich würde sagen, dass gar nichts beim µC ankommt.

Die Boudrate ist richtig. Ich sende ein "Hallo World" um zu sehen ob der 
TX funktioniert und es erscheint auch auf dem HyperTerminal.

Ich fürchte ich muss mir ein Oszi organisieren und messen ob beim µC 
überhaupt was ankommt.

Bussi Sandy

von LuXXuS 9. (aichn)


Lesenswert?

Sandra schrieb:
> Ich habs mir einfacher gemacht und den Code geändert.

Aber was genau soll der Code bringen? Jetzt sendest du ja immer wieder 
den RX-Buffer, egal was in der Zeit beim Empfang passiert.

Wenn, dann sollte der Code ja irgendwie eher so sein:
1
while(1)
2
{
3
  while (!(IFG2 & URXIFG1)); // Zeichen empfangen?
4
  TXBUF1 = RXBUF1;
5
}

Verbinde doch mal dein TxD mit dem RxD direkt am uC.

von Sandra (Gast)


Lesenswert?

ich sehe keinen Unterschied zu meinem Code!?

von LuXXuS 9. (aichn)


Lesenswert?

Die Abfrage nach dem RX-Bit, nicht das TX-Bit. OK, das jetzt eben daraus 
zu erkennen...würde ich wahrscheinlich auch übersehen.

von Sandra (Gast)


Lesenswert?

Ah, da ist der Unterschied.

Nein, da kommt gar nichts raus.

Ich habe inzwischen das 2. Board getestet. Genau das selbe Resultat. 
Vielleicht ist beim Schaltungsdesign was schiefgegangen.

von g. b. (gunb)


Lesenswert?

Sandra schrieb:
> Ah, da ist der Unterschied.
>
> Nein, da kommt gar nichts raus.
>
> Ich habe inzwischen das 2. Board getestet. Genau das selbe Resultat.
> Vielleicht ist beim Schaltungsdesign was schiefgegangen.

Was sagt das Scope? Du musst messen, das ist normalerweise einer der 
ersten Schritte, wenn etwas absolut nicht gehen will.

Nun ja, Schaltungsdesign. Im einfachsten Fall schaust du mal mit einem 
Durchgangsprüfer nach, ob der Pin des Controllers bis zum Pegelwandler 
leitend ist. Wenn nicht und sollte wer woanders liegen, kannst du lange 
an der Firmware basteln.

Wenn der 2. USART nicht geroutet sein sollte, wie du schreibst, 
versuch's mit ner Lupe und Fädeldraht, bei den engen Pins des MSP430 
aber aufpassen.

Ich würde aber erst einmal messen, ob beim Senden vom PC am RxD 
überhaupt ein Signal zu sehen ist. Alles andere hast du eigentlich schon 
probiert.

Ich habe vor Jahren schon mal einen RX-Pin zerstört, weil ich den 
falschen Wandler mit 5V-Logik aus Versehen genommen hatte. Da kannst du 
dann suchen bis der Arzt kommt - kaputt ist kaputt, also messen und ggf. 
anderen USART nutzen.

Kein Demoboard zur Verfügung?

Gruß
Gunb

von Sandra (Gast)


Lesenswert?

Ich habe gerade den Schaltplan kontrolliert. Die Volt sind richtig 
eingestellt.

Ein Scope habe ich auch gerade bekommen. Ich muss nur noch messen.

Melde mich wenn ich fertig bin

von Sandra (Gast)


Lesenswert?

RX und TX funktionieren und kommen beim µC an.

Wenn ich mich einfach unterm Schreibtisch verstecke und hoffe, dass es 
ein anderer macht?

von g. b. (gunb)


Lesenswert?

Sandra schrieb:
> RX und TX funktionieren und kommen beim µC an.
>
> Wenn ich mich einfach unterm Schreibtisch verstecke und hoffe, dass es
> ein anderer macht?

Tja, wahrscheinlich feierst du dann Weihnachten unter'm Schreibtisch ;-)

Gibt's doch nicht, dass das nicht geht. Habe mein Demoboard zu Hause, 
sollte ich am WE Zeit finden, probier ich's aus.

Du nutzt nochmal welchen Quarz? Uhrenquarz mit 32,768kHz?

IAR-IDE?

von Sandra (Gast)


Lesenswert?

JA, Uhrenquarz

Code Composer.

Das ist lieb von Dir, danke!

Wünsche dir ein schönes WE!!!

P.S.: Naja Weihnachten ist vielleicht nicht so toll unterm Tisch. Da 
liegen irgendwan die Manager drunter gg.

von Sandra (Gast)


Lesenswert?

Es geht!!!

Ich hab mir das dritte Board von meinem Kollegen geholt. Das geht.

Der hat wirklich bei 2 etwas falsch gemacht.

Ich danke Euch (Gun B. ganz speziell) sehr!!!!

Auch wenn der Fehler nicht bei mir lag habe ich sehr viel von Euch 
gelernt.

Wünsche Euch allen ein wunderschönes Wochenende!!!

BUSSI
Sandy

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.