Forum: Mikrocontroller und Digitale Elektronik MSP430: Kontinuierliches Signal ausgeben


von Heiko (Gast)


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

von Tobias K. (kurzschluss81)


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.
1
 const char Tabelle[1000]

von Heiko (Gast)


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!

von Johnny (Gast)


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.

von Rufus Τ. F. (rufus) Benutzerseite


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:
1
#define ANZAHL 123
2
3
const unsigned int Tabelle[ANZAHL] = { 1, 2, 3, --- etc}
4
unsigned int index = 0;
5
6
// Syntax je nach Compiler
7
8
// #pragma vector=TIMERA1_VECTOR
9
// __interrupt void Timer_A(void)
10
void handle_Timer_A_interrupt(void) __interrupt[TIMERA1_VECTOR]  
11
{
12
  // Interruptquelle auswerten
13
  switch (TAIV)
14
  {
15
    case 2:
16
      // capture/compare 1
17
      CCR1 += RELOAD_CCR1;
18
      DAC12_0DAT = Tabelle[index++];
19
20
     if (index == ANZAHL)
21
       index = 0;
22
     break;
23
  }   
24
}

von Heiko (Gast)


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!

von Sebastian B. (mircobolle)


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

von Tobias K. (kurzschluss81)


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

von Wolfgang-G (Gast)


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

von Johnny (Gast)


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

von Christian R. (supachris)


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.

von Wolfgang-G (Gast)


Lesenswert?

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

wieder etwas dazugelernt

von Heiko (Gast)


Lesenswert?

Danke Leute für all euere Hilfe!

Läuft jetzt alles wie geschmiert :-)

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.