Forum: Mikrocontroller und Digitale Elektronik MSP430 UART interface array verarbeitung


von Rizzo (Gast)


Lesenswert?

Hallo.

ich bin neu in der µC programmierung und habe Verständisprobleme mit dem 
UART INTERFACE.

Ich hab mir ein testboard gebaut das über ein USB->FTDI232->MSP430 
interface eine datenstrecke realisiert. Die ist mit einem 
beisielprogramm, bereits getestet, die funktioniert.

Jetzt folgende Situation:

Es soll per UART ein auf dem PC vorhandenes Array mit daten sätzen 
übermittelt werden an den MSP

Die anzahl der Datensätze variiert, ich kann im mikrokontroller also 
keine feste array größe angeben, weil ich sie ned weiß.

Ein Datzen Satz besteht immer aus 2 Integerzahlen

1 34455
5 33325
2 234


so zum beispiel. (1 gibt einen last wert an. die große zahl ist ein wert 
in sekunden)

Wie bekomme ich diese im uC gespeichert, bzw wie verarbeitet der die 
Daten die über die schnittstelle kommen?

Prinzipiell hätte ich mir gewünscht, das wenn ich meine Sequenz auf dem 
PC starte, der PC per virtuellem Com port (die treiber dafür von ftdi 
sind installiert und funzen) das komplette array übermittelt, dass ich 
die daten dafür im µC zur verfügung habe.

Der UART ist soweit initialisiert
1
void main( void )
2
{  
3
    WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
4
5
  InitializeHardware();
6
  BIS_SR(LPM0_bits + GIE);         // Enter LPM0 w/ interrupt
7
  _EINT();                          // Enable interrupts
8
9
    while(1)
10
    {     
11
    }
12
}
13
14
void InitializeHardware( void )
15
{
16
17
//Setup UART1
18
  // Enable module pin functions
19
  P3SEL |= (BIT6);
20
  P3DIR |= (BIT6);
21
22
  // Enable module
23
  ME2 |= (UTXE1);
24
  
25
  // Reset UART
26
  U1CTL = (CHAR      );
27
  U1TCTL = (TXEPT+UTCTL_ACLK);
28
29
  // Setup 2400 baud with ACLK
30
  U1BR0 = 0x0D;
31
  U1BR1 = 0x00;
32
  U1MCTL = 0x6B;
33
34
  // Set Tx Flag
35
  IFG2 |= (UTXIFG1); 
36
    
37
  // Enable module pin functions
38
  P3SEL |= (BIT7);
39
40
  // Enable module
41
  ME2 |= (URXE1);
42
  
43
  // Reset UART
44
  U1RCTL = (URXEIE);
45
46
  IE2 |= (URXIE1);
47
  
48
}

DAs hab ich aus dem testprogramm übernommen. Soweit ich das verstehe ist 
nun dieser #pragma teil dafür zuständig, was passiert, wenn daten kommen

1
// UART1 RX interrupt service routine
2
#pragma vector=UART1RX_VECTOR
3
__interrupt void UART1RX (void)
4
{
5
  
6
}


Meine erste idee wäre es gewesen, als erste zahl, die array größe zu 
übermitteln und mit dieser dann das Arrray zu erzeugen, IAR workbench 
nörgelt allerdings, das array nicht mit variablen erzeugt werden dürfen, 
sondern feste werte haben müssen.

Wie wird das normalerweise gehandhabt, mehrere Datensätze gleichen typs 
zu übermitteln abzuspeichern, wenn man die anzahl der datensätze nicht 
vorher kennt?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Um ein Array einer erst zur Laufzeit bekannten Größe anzulegen, 
verwendet man üblicherweise dynamische Speicherverwaltung mit 
Funktionen wie malloc etc.

Allerdings ist das auf einem µC mit doch sehr beschränktem RAM nicht 
sinnvoll - hier steht ja die maximale Arraygröße fest (mehr RAM hat er 
halt nicht, Dein MSP430).

Also kannst Du auch mit einem Array fester Größe arbeiten - die Größe 
ist halt das sinnvolle Maximum, das sich aus dem restlichen 
Speicherbedarf Deines Programmes und dem verfügbaren RAM des Controllers 
ergibt. Mehr als 10 kByte sind sowieso nicht drin.

von Jörg S. (joerg-s)


Lesenswert?

Je nachdem wozu die Daten gut sein sollen könnte man die auch ins Flash 
speichern...

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Das mag sein, aber dabei hilft eine dynamische Speicherverwaltung à la 
malloc erst recht nicht.

von Jörg S. (joerg-s)


Lesenswert?

Im Flash würde man nur so viel Platz verbrauchen wie tatsächlich 
übertragen wurde anstatt im RAM zwangsweise den größt möglichen Platz 
freizuhalten (wenn man malloc nicht nutzt).

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.