Forum: Mikrocontroller und Digitale Elektronik UART MSP430F413


von Torsten M. (totti)


Lesenswert?

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

von Zimmi (Gast)


Lesenswert?

Welchen Wert hat OUTMOD2 ?

von Torsten M. (totti)


Lesenswert?

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

von Torsten M. (totti)


Lesenswert?

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
Noch kein Account? Hier anmelden.