Forum: Mikrocontroller und Digitale Elektronik MSP4301232 UART Inerrupt bleibt aus??


von RIO (Gast)


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

von Jörg S. (Gast)


Lesenswert?

Zeichen senden funktioniert?

ACLK ist hoffentlich nicht 32kHz, oder?

von RIO (Gast)


Lesenswert?

Hi,  senden habe ich noch nicht versucht.. ACLK läuft mit 32KHz...
Wieso hoffentlich nicht mit 32KHz??

von Jörg S. (Gast)


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.

von RIO (Gast)


Lesenswert?

Danke ich werde erstmal eine Ausgabe bauen!!

von RIO (Gast)


Lesenswert?

Hi nochmal,

also die Ausgabe funktioniert, ein char das ausgegeben werden soll wird
ausgegeben..

Irgend eine Idee warum der Interrupt nicht kommt??????????????????????

von szimmi (Gast)


Lesenswert?

Gibst Du irgendwo global die Interrupts frei?

von RIO (Gast)


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);
  }

}

von Daniel L. (bucho)


Lesenswert?

Hast Du den Oszillator richtig initialisiert? Ich seh gar nix davon...

von RIO (Gast)


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??????????????

von Jörg S. (Gast)


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.

von RIO (Gast)


Lesenswert?

Ich benutze den IAR... ein char ausgegeben sieht auf dem Oszi gut aus,,

Wie kann ich mir die Daten im Inputbuffer anschauen????

von Jörg S. (Gast)


Lesenswert?

Den Input Buffer (und auch alle anderen Register inhalte) kannst du dir
im Debugger anzeigen lassen.

von Scuba (Gast)


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

von RIO (Gast)


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

von Scuba (Gast)


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

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.