Forum: Compiler & IDEs MSP430F2618 UART RX-Interrupt löst nicht aus?


von Björn (Gast)


Lesenswert?

Hallo Zusammen,

ich baue eine USB verbindung mit dem MSP430F2618 via HyperTerminal (HT) 
auf.
Daten vom µC werden im HT angezeigt. Nun will ich dort eine Eingabe 
machen (Zahlen) die dann den RX Interrupt auslösen sollen. Weiss der 
Kuku warum, aber es klappt nicht. Ich benutze den MSPGCC. Hier mal ein 
Teil vom Code:


void init(void)
{
   WDTCTL = WDTPW + WDTHOLD;       // Watchdog aus
   UCA0CTL1 |= UCSWRST;            // Software reste enable anschalten
   UCA0CTL1 |= UCSSEL_2;           // SMCLK aktiviert
   P3SEL = 0x30;                   // Secondary peripheral module 
funktion is selectet for P3.4 and P3.5 = USCI_A0 TXD/RXD

  UCA0BR0 = 0x4E;                  // 9k6 baud bei 12MHz aus Tabelle 
15-5, gültig wenn UCOS16 =1
  UCA0BR1 = 0x00;
  UCA0MCTL = UCBRF1 + UCOS16;
  UCA0CTL1 &= ~UCSWRST;          // Parameter übernehmen und 
Schnittstelle aktivieren

  IE2 |= UCA0RXIE ;            // RX  Interrupt anschalten
  IFG2 &= ~UCA0RXIFG;          // initales RX-Interrupt-Flag löschen
}




int main(void)
{
  //Initialisierungen
  init();          // Main Initialisierung
  init_DAC();    // DAC aktivieren
  hf_oszi();    // Kontrollfunktion ob der Oszillator richtig schwingt

 sprint("\r\n Bitte geben Sie den gewuenschten Daempfungswert in 0.5dB 
Schritten zwischen \r\n 0dB und 17dB ein\r\n");

//hier noch ein wenig Programm welcher Uninteressant ist
}



interrupt(USCIAB0RX_VECTOR) usart0_rx(void)
{
        led_fast();
}


So das ist mal der grobe Code. Ich habe ausserdem an XT1 und an XT2 
12MHz anliegen. Macht das evtl. schon Probleme? Zuerst lag nur an XT2 
die 12MHz an und da habe ich ihn nicht ans laufen bekommen und der 
einfachheithalber habe ich dann auch noch an XT1 die 12 MHz anschlossen.

Wenn ich auf der Tastatur tippe, sehe ich dies  dem Oszi.
Was habe ich übersehen? Wo liegt evtl. mein Fehler?

Mit sonnigen Grüßen

Björn

von Christian R. (supachris)


Lesenswert?

Inituialisiere mal erst den Quarz und dann die UART. Wenn du den Takt 
einfach umschaltest, kann das komsiche Effekte verursachen.

von Björn (Gast)


Lesenswert?

Hallo,

ich habe mal die reihenfolge geändert aber führte leider nicht zum Ziel.
In einem beispielcode konnte noch einen Zeile finden die den Genral 
Inerrupt
setzt.

__bis_SR_register(GIE);

und testweise auch

__bis_SR_register(LPM3_bits + GIE);

Danach löst er zwar einen Interrupt aus wenn ich eine Taste drücke, aber

- führt den Rest des Programms nicht mehr aus und wartet nurnoch auf den 
Interrupt

- und wenn ich einen Interrupt auslöse durch eingabe eines Zeichens 
wiederholt der meine Interrupt Routine immer wieder, als wenn der 
Interrupt
ständig ausgelöst wird, bzw nicht zurückgesetzt wird.

Ich habe mal den Befehl zum Rücksetzten des Interrupts in der Routine 
eingefügt
IFG2 &= ~UCA0RXIFG;
aber half auch nichts.

Vielleicht noch eine Idee?

von Christian R. (supachris)


Lesenswert?

Hast du denn überhaupt eine Endlosschleife in deiner main()? Und laufen 
denn die Code-Beispiele von TI mit der UART? Das würde ich erst mal 
testen.

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.