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
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] |
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!
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.
> 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 | }
|
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!
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
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.
>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
>> 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. ;-)
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.
>Deswegen steht da ja const char Tabelle[2000], dann landet´s im Flash, >und davon ist genug da. wieder etwas dazugelernt
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.