mikrocontroller.net

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


Autor: RIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zeichen senden funktioniert?

ACLK ist hoffentlich nicht 32kHz, oder?

Autor: RIO (Gast)
Datum:

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

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: RIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke ich werde erstmal eine Ausgabe bauen!!

Autor: RIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi nochmal,

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

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

Autor: szimmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gibst Du irgendwo global die Interrupts frei?

Autor: RIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
  }

}

Autor: Daniel Lancelle (bucho)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast Du den Oszillator richtig initialisiert? Ich seh gar nix davon...

Autor: RIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??????????????

Autor: Jörg S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: RIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze den IAR... ein char ausgegeben sieht auf dem Oszi gut aus,,

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

Autor: Jörg S. (Gast)
Datum:

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

Autor: Scuba (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: RIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Scuba (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.