Forum: Mikrocontroller und Digitale Elektronik MSP430G2231 - UART 26 Bit übertragen/empfangen


von Bertram W. (bertram)


Angehängte Dateien:

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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Bertram W. schrieb:
> Ihr erkennt deutlich die Pause von ca. 2 Bit zwischen den Bytes.
Welche Taktfrequenz hast du?
Könnte das der Verwaltungsaufwand für den Aufruf der Funktionen sein?

von Bertram W. (bertram)


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.

von Bertram W. (bertram)


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.

von Stefan (Gast)


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).

von Bertram W. (bertram)


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.

von Bertram W. (bertram)


Angehängte Dateien:

Lesenswert?

Bertram W. schrieb:
> [...] Ich werde euch auf dem Laufenden halten, ob
> es trotz der Länge richtig erkannt wird.

funktioniert

Habe jetzt nur noch ein programmiertechnisches Problem (Code paßt nicht 
ganz in den Speicher vom MSP430G2231).
Mache aber dafür einen neuen Thread auf, da es hier nicht mehr 
thematisch paßt.

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.