mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430 UART interface array verarbeitung


Autor: Rizzo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
void main( void )
{  
    WDTCTL = WDTPW + WDTHOLD;             // Stop WDT

  InitializeHardware();
  BIS_SR(LPM0_bits + GIE);         // Enter LPM0 w/ interrupt
  _EINT();                          // Enable interrupts

    while(1)
    {     
    }
}

void InitializeHardware( void )
{

//Setup UART1
  // Enable module pin functions
  P3SEL |= (BIT6);
  P3DIR |= (BIT6);

  // Enable module
  ME2 |= (UTXE1);
  
  // Reset UART
  U1CTL = (CHAR      );
  U1TCTL = (TXEPT+UTCTL_ACLK);

  // Setup 2400 baud with ACLK
  U1BR0 = 0x0D;
  U1BR1 = 0x00;
  U1MCTL = 0x6B;

  // Set Tx Flag
  IFG2 |= (UTXIFG1); 
    
  // Enable module pin functions
  P3SEL |= (BIT7);

  // Enable module
  ME2 |= (URXE1);
  
  // Reset UART
  U1RCTL = (URXEIE);

  IE2 |= (URXIE1);
  
}

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

// UART1 RX interrupt service routine
#pragma vector=UART1RX_VECTOR
__interrupt void UART1RX (void)
{
  
}


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?

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Jörg S. (joerg-s)
Datum:

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

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

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

Autor: Jörg S. (joerg-s)
Datum:

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

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.