MSP4301232 UART Inerrupt bleibt aus??

Gast #345570
Lesenswert?

Hi Leute,

ich finde meinen Fehler nicht und bin schon gut am verzweifeln.
Bestimmt
ein typischer Anfängerfehler. Dennoch weiss ich nicht wo ich ansetzen
soll. Initialisiert ist der UART wie´s geschrieben steht.. dennoch kein
Interrupt..

INIT--->--------------<-------------->----------------->-

ME2 |= UTXE0 + URXE0;                 //modul2 enable
  IE2 |= URXIE0 + UTXIE0;               // TX- und RX-interrupts
                                            anschalten
  UBR00 = 0x80;                         //  31.25kbaud (32µs time
                                              slices)
  UMCTL0 = 0x00;                        // modulation register keine

                                          integer  divisions
  UCTL0  = CHAR;                        //8 bit charakter
  UTCTL0 = SSEL0;                       //UCLK = ACLK
  P3SEL |=0x30;                         //3.4 3.5 select
  P3DIR |=0x10;                         //3.4 eingang
  UCTL0 &= ~SWRST;                      // USART freigeben

Interrupt--->-------------<------------>--------<

#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)

  {
 _BIC_SR_IRQ(LPM3_bits);               // Clear LPM3 bits from 0(SR)

  LCD_Clear();
  LCD_Cursor_Set(1,0);
  LCD_Awrite("Interrupt kam");
  }

--------------------------------------------------------------------

bin für jeden Tip dankbar....

RIO
Gast #345573
Lesenswert?

31.25kbaud is ein bisschen schnell für den 32kHz Quarz. Den kann man nur
bis 9600Baud verwenden. Dazu sollte sich ich im Manual aber auch eine
schöne Liste befinden.

Am besten aber erst mal Zeichen senden und schauen ob sie ordetlich
ankommen. Dann ist man sicher das es grundlegend funktioniert.
Gast #345577
Lesenswert?

ich gebe die Interrupts durch "__EINT()" in meiner main frei,,



void main(void)

{
  WDTCTL=WDTPW+WDTHOLD;

//---------------------------------------------------------------------- 
----------

  P2DIR |= + RS + E;
  P1OUT = 0x00;                                    //Port1 mit o init
  P1DIR = 0xFF;                                    //Port1 auf ausgang


//---------------------------------------------------------------------- 
-----------
  LCD_Init();                                       // LCD
initialisieren ...
  LCD_Clear();                                      // ... und dann
noch loeschen und cursor an den anfang zurueck


//---------------------------------------------------------------------- 
-----------

  LCD_Cursor_Set(0,0);
  LCD_Awrite("Warte auf Interrupt");

//---------------------------------------------------------------------- 
-----------

   init_uart();

   _EINT();                                    //  interrupts ...

//---------------------------------------------------------------------- 
--------------
  for (;;)                              // Endlosschleife


{
_BIS_SR(LPM3_bits);
  }

}
Gast #345579
Lesenswert?

Oszillatoren wurden nicht initialisiert..

1.Frage: Wofür brauche ich die?? ACKL wurde doch als Source
eingestellt..

2.Frage: Selbst ohne Oszillatoren müsste doch zumindest der Interrupt
kommen... oda??????????????
Gast #345580
Lesenswert?

Wenn du Zeichen sendest und die auch korrekt ankommen, funktioniert der
UART ja grundsätzlich.

Welchen Compiler nutzt du eigentlich?

Du solltest mal schauen ob die Zeichen schon im Input Buffer laden,
oder ob noch was gröberes falsch läuft.
Gast #345583
Lesenswert?

Hallo RIO,
Zwei Punkte sind mir aufgefallen:
Laut TI sollte die Initialisierung bzw. Reinitialisierung des USART
immer nach folgendem Schema ablaufen (Der folgende Auszug stammt aus
dem Datenblatt SLAU049E):

Note: Initializing or Re-Configuring the USART Module
The required USART initialization/re-configuration process is:
1) Set SWRST (BIS.B #SWRST,&UxCTL)
2) Initialize all USART registers with SWRST = 1 (including UxCTL)
3) Enable USART module via the MEx SFRs (URXEx and/or UTXEx)
4) Clear SWRST via software (BIC.B #SWRST,&UxCTL)
5) Enable interrupts (optional) via the IEx SFRs (URXIEx and/or
UTXIEx)
Failure to follow this process may result in unpredictable USART
behavior.

Der zweite Punkt ist die Einstellung des Port3:
Die Codezeile:
P3DIR |=0x10;                         //3.4 eingang
bewirkt, dass der Port 3.4 als Ausgang geschaltet wird.

Die anderen Portpins (insbesondere Portpin 3.5)werden von diesem Befehl
nicht beeinflusst.

Entweder musst Du
P3DIR = 0x10; // Alle Portpins bis auf 3.4 als Eingang
oder zusätzlich zur bestehenden Zeile noch
P3DIR &= ~0x20; // Port 3.5 als Eingang definieren
ergänzen.

MfG
Scuba
Gast #345584
Lesenswert?

Danke Scuba,

das "failure to follow.....unpredictable behavior" gibt mir fast ein
wenig Zuversicht :-)

also wenn ich das richtig verstanden haben könnte das abgespeckt so
aussehen???

Punkt1:
        UCTL0 |= SWRST;
  ME2 |= UTXE0 + URXE0;
  UCTL0 &= ~SWRST;
  IE2 |= URXIE0  + UTXIE0;

Punkt2:
 heisst ich habe bisher Port 3.5 nicht explizit als Ausgang definert

MfG
RIO
Gast #345585
Lesenswert?

Hallo Rio,

ich weiß nicht welchen Controller Du verwendest,
beim 169er, den ich verwende ist 3.5 der RXD Eingang sowie 3.4 der TXD
Ausgang.
Mit |= wird der entsprechende Portpin gesetzt, bzw. als Ausgang
beschalten.

Hier nochmal ein Auszug aus dem SLAU049E:

Direction Registers PxDIR
Each bit in each PxDIR register selects the direction of the
corresponding I/O
pin, regardless of the selected function for the pin. PxDIR bits for
I/O pins that
are selected for other module functions must be set as required by the
other
function.
Bit = 0: The port pin is switched to input direction
Bit = 1: The port pin is switched to output direction

Ich denke da könnte dein Fehler liegen.

MfG
Scuba

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren