mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik MSP430: Kontinuierliches Signal ausgeben


Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Leute,

ich bin noch Anfänger im Bereich Mikrocontroller. Ich benutze ein 
MSP430F169 und möchte ein kontinuierliches Signal (künstliches EKG) 
analog ausgeben. Ich habe es bereits geschaft, ein analoges Signal 
auszugeben.

Nun bin ich an dem Punkt, an dem ich meine Daten brauche, die das EKG 
beschreiben, um die richtige Kurvenform zu bekommen.

Ich habe eine Tabelle mit ziemlich vielen Zahlen die meine Signal 
beschreiben.

Dieses möchte ich jetzt irgendwie verwenden. Ich benutze IAR und C.

Habe mir überlegt, die Tabelle in Speicher (am besten RAM?) zu schreiben 
und beim Ablauf des Programmes dann kontinuierlich meine Werte dort 
auszulesen. Nur habe ich keine Ahnung, 1. ob es der beste Weg ist und 2. 
wie ich es umsetzen soll.

Kann mir jemand vielleicht ein Tip geben?

Vielen Dank!!!

Heiko

Autor: Tobias Korrmann (kurzschluss81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das sollte nicht das Problem sein.
Der 169 hat einen DA Wandler drin.
Dazu musst du deine Zahlenwerte erstmal so umwandeln das der DA Wandler 
damit arbeitet.

Die Zahlen solltest du aber nicht in den RAM legen.
Wenn du die Zahlen in einer Art Tabelle anlegst und diese Tabelle als 
"const" deklarierst brauchst du keinen RAM dafür.
z.B.
 const char Tabelle[1000] 

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Super Danke für den Hinweis.

Jetzt vielleicht noch eine Frage. Wie kann ich denn in C jetzt die 
eigentlichen 1000 Werte in meine Tabelle schreiben und wie lese ich sie 
danach wieder nacheinander aus?

Vielen Dank!

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Am besten Du machst auf dem PC einen Konverter, der die Daten in das 
richtige format bringt.
So in der Art wie schon geschrieben wurde:
const char Tabelle[1000] = {0x0000, 0x0001, 0x0003, ....};

Der 169 hat doch einen DMA, mit dem kann das ganze wahrscheinlich ohne 
viel Code im Hintergrund an den Timer geschickt werden um es auszugeben.

Sonst halt in einer Schleife:

for (i = 0; i < sizeof(Tabelle); i++)
{
  TimerRegister = Tabelle[i];
  ...warten...
}

Oder besser als in Schleife, in einem Timerinterrupt.

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

Bewertung
0 lesenswert
nicht lesenswert
> Der 169 hat doch einen DMA, mit dem kann das ganze wahrscheinlich
> ohne viel Code im Hintergrund an den Timer geschickt werden um es
> auszugeben.

Besser wäre es vermutlich, die Daten an den DAC zu senden.

Diese Ausgabe kann im Timerinterrupt erfolgen, der Timer ist so zu 
programmieren, daß der Timerinterrupt mit der korrekten Samplerate 
erfolgt.

Das sieht dann in etwa so aus:
#define ANZAHL 123

const unsigned int Tabelle[ANZAHL] = { 1, 2, 3, --- etc}
unsigned int index = 0;

// Syntax je nach Compiler

// #pragma vector=TIMERA1_VECTOR
// __interrupt void Timer_A(void)
void handle_Timer_A_interrupt(void) __interrupt[TIMERA1_VECTOR]  
{
  // Interruptquelle auswerten
  switch (TAIV)
  {
    case 2:
      // capture/compare 1
      CCR1 += RELOAD_CCR1;
      DAC12_0DAT = Tabelle[index++];

     if (index == ANZAHL)
       index = 0;
     break;
  }   
}

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank für eure schnellen und hilfreichen Hinweise!

Ich habe das ganze zum laufen gebracht. Sieht schon sehr gut aus auf dem 
OSSI :-) . Habe es mit dem Timer Interrupt gemacht.

Nur habe ich noch eine Schwierigkeit:

Ich habe eine Excel Tabelle mit ca. 2000 Werten. Und ich muss die ja 
irgendwie in die Form:

Tabelle[2000] = { 1, 2, 3, 10, 5 --- etc} bringen. Per Hand sind 2000 
Werte ein wenig mühsam.

Hättet Ihr noch einen Vorschlag für die schnelle Bearbeitung? Bin nicht 
so fit in C, um mir mal eben ein Programm dafür zu schreiben.

Danke nochmals!

Autor: Sebastian B. (mircobolle)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo heiko,

hab gerade ein ähnliches projekt realisiert:

Dabei geht es darum, dass man eine "Testsequenz" vom PC ins EEPROM 
übertragen kann und diese Sequenz dann im Gerät abgespielt wird.

Also stand ich vor dem gleichen Probleme eine Kurvenform zu erzeugen und 
in das System zu übertragen. Per hand ist das ne Menge Arbeit!

Also habe ich in Excel eine Kurve erzeugt (eine Sinus-Periode mit ca. 
400 Einzelwerten) dies habe ich dann als *.txt gespeichert (mit TAB 
getrennt)

nun steht in der Txt Datei
1<TAB>3210 (für 3.210 V)

nun braucht man noch eine PC Software (am besten selbst geschrieben) die 
diese Txt Datei auswertet in einen RS232-Frame packt und an das Gerät 
sendet!

im gerät kann ich nun einstellen, dass diese Sequenz einfach oder 
zyklisch abgespielt wird!
Stelle ich es auf zyklisch wird ein sich schön periodisch wiederholender 
Sinus am DA Ausgang ausgegeben.


Wenn du es flexibler haben willst, kannst du es so machen wie ich:
Jede Schnittstelle im Gerät bekommt eine ID..
wenn nun so eine Sequenz gespeichert werden soll:
gibt man an
ID und Wert... z.b. ID:4 (für DA Wandler 1) und ein 16 Bit Wert!

Ich habe z.b. 4 digitale, 2 Analoge und 2 PWM Ausgänge!
Über diese Sequenz kann man z.b. den Tastgrad des PWM Signals verändern, 
die analogen Ausgänge einstellen oder die digitalen Eingänge setzen!

Eine weitere Besodnerheit ist auch noch, dass man die Eingänge 
ansprechen kann!
ID:5 (für AD Eingang 1) führt z.b. dazu, dass der Eingang gelesen wird 
und der Wert an den PC übertragen. Somit wäre auch eine Abtastung über 
Analog oder Digital möglich!

MFG

Autor: Tobias Korrmann (kurzschluss81)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sebastian B. wrote:
> hab gerade ein ähnliches projekt realisiert:
>
> Dabei geht es darum, dass man eine "Testsequenz" vom PC ins EEPROM
> übertragen kann und diese Sequenz dann im Gerät abgespielt wird.
>
> Also stand ich vor dem gleichen Probleme eine Kurvenform zu erzeugen und
> in das System zu übertragen. Per hand ist das ne Menge Arbeit!
>
> Also habe ich in Excel eine Kurve erzeugt (eine Sinus-Periode mit ca.
> 400 Einzelwerten) dies habe ich dann als *.txt gespeichert (mit TAB
> getrennt)
>
> nun steht in der Txt Datei
> 1<TAB>3210 (für 3.210 V)
>
> nun braucht man noch eine PC Software (am besten selbst geschrieben) die
> diese Txt Datei auswertet in einen RS232-Frame packt und an das Gerät
> sendet!

Da gibt es noch eine bessere Idee.
Wenn du die, konvertierte, Tabelle schon in einer Textdatei hast kannst 
du diese auch mehr oder weniger als C Datei in dein Projekt mit 
einbinden.
Dazu must du die txt Datei in .c umbenen, die Werte mit Kommas trennen 
und dann halt noch
 const char tabelle [2000] 
davor schreiben.

Dann must du nur noch eine Headerdatei mit dem gleichen Namen wie diene 
neue C-Datei anlegen und in dieser Headerdatei diene Konstante Variable 
deklarieren.

Autor: Wolfgang-G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich habe eine Excel Tabelle mit ca. 2000 Werten.
kleiner Hinweis: der MSP430F169 hat nur einen 2kB großen RAM. Ein Teil 
des RAMs wird für das laufende Programm benötigt, sodass es mit 
"Tabelle[2000]= " nichts werden wird.
MfG
Wolfgang

Autor: Johnny (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>> Der 169 hat doch einen DMA, mit dem kann das ganze wahrscheinlich
>> ohne viel Code im Hintergrund an den Timer geschickt werden um es
>> auszugeben.

> Besser wäre es vermutlich, die Daten an den DAC zu senden.

Ja, wenn er den DAC nutzen möchte schon. Mit den Timern kann aber auch 
ein PWM erzeugt werden.
Ich liefere meist nur Hinweise, fertigdenken und fertigstellen kann es 
der Fragesteller dann selber. ;-)

Autor: Christian R. (supachris)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wolfgang-G wrote:
>>Ich habe eine Excel Tabelle mit ca. 2000 Werten.
> kleiner Hinweis: der MSP430F169 hat nur einen 2kB großen RAM. Ein Teil
> des RAMs wird für das laufende Programm benötigt, sodass es mit
> "Tabelle[2000]= " nichts werden wird.
> MfG
> Wolfgang

Deswegen steht da ja const char Tabelle[2000], dann landet´s im Flash, 
und davon ist genug da.

Autor: Wolfgang-G (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Deswegen steht da ja const char Tabelle[2000], dann landet´s im Flash,
>und davon ist genug da.

wieder etwas dazugelernt

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Leute für all euere Hilfe!

Läuft jetzt alles wie geschmiert :-)

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.