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
voidinit_RX(void);
12
13
14
voidmain(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
__interruptvoidusart1_rx(void)
28
{
29
while(!(IFG2&UTXIFG1));// USART1 TX buffer ready?
30
TXBUF1=RXBUF1;// RXBUF1 to TXBUF1
31
}
32
33
voidinit_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
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
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; // %
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?
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?
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
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
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.
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.
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.
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 ;-)
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
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.
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.
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
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
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?
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.
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