mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART MSP430F413


Autor: Torsten Maier (totti)
Datum:

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

Autor: Zimmi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welchen Wert hat OUTMOD2 ?

Autor: Torsten Maier (totti)
Datum:

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

Autor: Torsten Maier (totti)
Datum:

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

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.