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
Zeichen senden funktioniert? ACLK ist hoffentlich nicht 32kHz, oder?
Hi, senden habe ich noch nicht versucht.. ACLK läuft mit 32KHz... Wieso hoffentlich nicht mit 32KHz??
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.
Hi nochmal, also die Ausgabe funktioniert, ein char das ausgegeben werden soll wird ausgegeben.. Irgend eine Idee warum der Interrupt nicht kommt??????????????????????
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); } }
Hast Du den Oszillator richtig initialisiert? Ich seh gar nix davon...
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??????????????
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.
Ich benutze den IAR... ein char ausgegeben sieht auf dem Oszi gut aus,, Wie kann ich mir die Daten im Inputbuffer anschauen????
Den Input Buffer (und auch alle anderen Register inhalte) kannst du dir im Debugger anzeigen lassen.
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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.