MSP430G2231 - UART 26 Bit übertragen/empfangen

#2275528
Lesenswert?

Ich möchte gerne Startbit + 2 Byte Nutzdaten + 1 Byte CRC8 + Stopbit 
über Port 1.1 senden und über Port 1.2 empfangen können.
Zunächst soll es nur mal darum gehen zu senden, denn da fängt schon mein 
Problem an.
Als Grundgerüst habe ich den im Anhang beigefügten Code benutzt, der für 
die Kommunikation mit RS232 für einzelne Zeichen auch ausgezeichnet 
funktioniert.

Rufe ich jetzt in o.g. modifizierten Code die Transmit-Funktion mit 
identischen Testmustern 3x hintereinander auf:
1
//Hauptprogramm
2
TXByte = 0xAA;
3
Transmit(0);
4
TXByte = 0xAA;
5
Transmit(1);
6
TXByte = 0xAA;
7
Transmit(2);
8

9
//Transmit
10
void Transmit(unsigned char zaehler)
11
{ 
12
  while(isReceiving);      // Wait for RX completion
13
    TACCTL0 = OUT;        // Timer A Capture/Compare Control Register
14
                // Output high
15
    TACTL = TASSEL_2 + MC_2;  // Timer A Control Register
16
                // TASSEL: Timer_A clock source select _2 = 0b10 -> SMCLK
17
                // MC: Mode control _2 -> continuous mode
18
                // zählt bis 0xFFFF = 65535
19

20
    if (zaehler == 0) BitCnt = 0x9;        // 8 bits + Startbit
21
     if (zaehler == 1) BitCnt = 0x8;        // 8 bits
22
     if (zaehler == 2) BitCnt = 0x9;        // 8 bits + Stopbit
23
     
24
    TACCR0 = TAR;        // Initialize compare register mit Inhalt Timer A Register
25
  
26
    TACCR0 += Bitzeit;      // Set time till first bit
27
    
28
    if (zaehler == 0) TXByte = TXByte << 1;    // Startbit
29
    if (zaehler == 2) TXByte |= 0x100;      // Stopbit
30
      
31
    TACCTL0 =  CCIS0 + OUTMOD0 + CCIE;  // Timer A Capture/Compare Control Register
32
                    // CCIS: Capture/compare input select. -> 0 = CCIxA
33
                    // OUTMOD: Output mode -> 0 = OUT bit value
34
                    // CCIE: Capture/compare interrupt enable -> 1 = Interrupt enabled
35
                    // Set signal, intial value, enable interrupts
36
                    
37
    while ( TACCTL0 & CCIE );      // Wait for previous TX completion
38
}

erhalte ich die im Anhang beigefügte Übetragung. Ihr erkennt deutlich 
die Pause von ca. 2 Bit zwischen den Bytes.
Meine Frage ist jetzt, wie ich die Pause da herausbekomme?
Angehängte Dateien:
#2275568
Lesenswert?

Danke für die schnelle Antwort.
Ich habe die Taktzeiten gegenüber RS232 unverändert gelassen. D.h. ich 
arbeite mit der SystemClock von 1MHz und mit den Bitzeiten:
1
#define     Bitzeit    104    // 9600 Baud: SMCLK=1MHz (1MHz/9600)=104
2
#define    Bitzeit_5  52    // halbe Bitzeit

Ob die Taktfrequenz zu schnell im Vergleich zum Verwaltungsaufruf für 
den Funktionsaufruf ist, kann ich schwer einschätzen.
Auch meine erste Vermutung ging in diese Richtung.

Am liebsten wäre mir auch, wenn ich Transmit nur einmal aufrufen müsste, 
aber 24 bit (bzw. 26) bekomme ich ja nicht im TXByte untergebracht.
#2275774
Lesenswert?

Ergänzung:
Ich habe den Code testweise dahingehend verändert, dass ich Transmit() 
nur einmal aufrufe und darin eine Schleife für das zu sendende Byte 3x 
durchlaufe. Noch mit dem selben Ergebnis der Pause zwischen den Bytes.
Ich nehme daher an, dass es nicht am Funktionsaufruf liegt, sondern der 
Fehler beim Timeraufruf liegt.
Gast #2276588
Lesenswert?

Bertram W. schrieb:
> Am liebsten wäre mir auch, wenn ich Transmit nur einmal aufrufen müsste,
> aber 24 bit (bzw. 26) bekomme ich ja nicht im TXByte untergebracht.
Definier TXByte als unsigned long, dann passt das.
Ich fürchte aber, dass du dann spätestens bei der Datenübertragung 
zwischen zwei Launchpads Probleme bekommen wirst weil die Taktfrequenz 
des DCO zu ungenau ist um 25 Bit asynchron zu übertragen.
Sende besser drei einzelne Zeichen (jeweils Startbit + 8 Bit Daten + 
Stopbit).
#2283286
Lesenswert?

Danke erst einmal für deinen Tipp als unsigned long zu senden. Das 
klappt jetzt schon mal prima und ich bekomme die einzelnen 8Bit Worte 
(Befehl,Daten, CRC) auch an die richtige Stelle hintereinander in das 
unsigned long geschrieben. Auch Start und Stopbit sind drin und werden 
gesendet. Bei der Oszi-Kontrolle paßt auch alles.
Jetzt geht es ans Empfangen. Ich werde euch auf dem Laufenden halten, ob 
es trotz der Länge richtig erkannt wird.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren