Hallo zusammen, ich hab Probleme mit meiner UART beim MSP430F413. Da ich keine TX-und RX Buffer habe sieht das bei mir schwieriger aus. Als erstes hab ich ein C-Programm geschrieben, das mir über die serielle Schnittstelle Hallo Welt ausgibt. Hat alles wunderbar geklappt. Dann wollte ich das Programm einarbeiten in die eigentliche Funktion - ein Kartenleser. Für den benötige ich das CCR0 und CCR1 Register für den Takt. Also nehm ich CCR2, die Daten werden noch abgespeichert aber nicht übertragen. Hier mein Code: ZUerst die uart.c: void send_char(int c) { RXTXData = c; BitCnt = 0xA; // Load Bit counter, 8data + ST/SP CCR0 = TAR; // Current state of TA counter CCR0 += Bitime; // Some time till first bit RXTXData |= 0x100; // Add mark stop bit to RXTXData RXTXData = RXTXData << 1; // Add space start bit TACCTL0 = OUTMOD0+CCIE; // TXD = mark = idle while ( TACCTL0 & CCIE ); // Wait for TX completion } Dann den Interrupt : interrupt(TIMERA0_VECTOR) Timer_A0 (void) { nop(); switch (state) { case UART : CCR2 += Bitime; // Add Offset to CCR0 // RX if (TACCTL2 & CCIS_1) { // RX on CCI2B? Is configured as RX? if( TACCTL2 & CAP ){ // Capture mode = start bit edge Switch from capture to compare mode, ~CAP means NOT CAP => disable CaptureMode TACCTL2 &= ~CAP; CCR2 += Bitime_5; } else { RXTXData = RXTXData >> 1; if (TACCTL2 & SCCI) // Get bit waiting in receive latch RXTXData |= 0x80; BitCnt --; // All bits RXed? if ( BitCnt == 0){ //>>>>>>>>>> Decode of Received Byte TACCTL2 &= ~ CCIE; // All bits RXed, disable interrupt _BIC_SR_IRQ(CPUOFF); // Clear LPM0 bits from 0(SR) //_BIC_SR_IRQ(LPM0); }//>>>>>>>>>> Decode of Received Byte Here <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< } } // hier fängt Transmit an else { if ( BitCnt == 0) TACCTL2 &= ~ CCIE;// All bits TXed, disable interrupt else { TACCTL2 |= OUTMOD2; // TX Space (0) if (RXTXData & 0x01) TACCTL2 &= ~ OUTMOD2; // TX Mark (1) RXTXData = RXTXData >> 1; BitCnt --; //CCTL0 |= CCIS1; } } break; } Ich hoffe es kann mir jemand helfen, vielen Dank
OUTMOD ist ein Register, das beim MSP430 konfiguriert werden kann nach dieser Tabelle: OUTMOD_0 0 0 0 Output: Die Einheit ist ausgeschaltet. Der Ausgang entspricht dann dem Bit-Wert des Ports. OUTMOD_1 0 0 1 Set: Der Ausgang am Pin wird auf 1 gesetzt, wenn TAR den Compare-Wert der CCU erreicht. Er wird nicht wieder auf 0 rückgesetzt wenn der Timer wieder bei 0 beginnt. OUTMOD_2 0 1 0 Toggle/Reset: Der Ausgang am Pin wird umgekippt wenn TAR den Compare-Wert der CCU erreicht. Er wird auf 0 gesetzt, wenn der Timer CCR0 ist. OUTMOD_3 0 1 1 Set/Reset: Der Ausgang am Pin wird auf 1 gesetzt, wenn TAR den Compare-Wert der CCU passiert. Er wird rückgesetzt, wenn TAR=CCR0 wird. OUTMOD_4 1 0 0 Toggle: Der Ausgang am Pin wird umgekippt, wenn TAR den Compare-Wert der CCU erreicht. Keine Aktion wenn TAR=CCR0. OUTMOD_5 1 0 1 Reset: Der Ausgang am Pin wird auf 0 rückgesetzt, wenn TAR den Compare-Wert der CCU erreicht. Keine Aktion wenn TAR=CCR0. OUTMOD_6 1 1 0 Toggle/Set: Der Ausgang am Pin wirdgekippt, wenn TAR den Compare-Wert der CCU erreicht. Er wird auf 1 gesetzt, wenn TAR=CCR0. OUTMOD_7 1 1 1 Reset/Set: Der Ausgang am Pin wird auf 0 rückgesetzt, wenn TAR den Compare-Wert der CCU erreicht. Er wird gesetzt, wenn TAR=CCR0. Bei Hallo Welt hat es aber mit OUTMOD_2 hingehauen
Es muss irgendwas mit dem CCTLx Register zu tun haben. Wenn ich nämlich CCTL0 eingebe sendet er was, aber nur ausgesprochenen Schwachsinn. Bei CCTL2 speichert er die richtigen Daten in den Speicher, sendet aber nix ;(
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.