Forum: Compiler & IDEs Atmel Studio 7 großes array - daten exportieren


von T. (Gast)


Lesenswert?

Hi,
ich habe folgendes Problem: ich möchte gerne 4-5 arrays mit jeweils 4096 
32 bit variablen Plotten (matlab, notfalls auch excel)
ich sample verschiedene Signale und führe ffts durch. Die Ergebnisse 
würde ich gerne in ein paar Plots sehen.

Nun bin ich am testen und wie das so ist, 3 zeilen code ändern, programm 
laufen lassen, daten ansehen und nochmal.
Das Problem hierbei ist, dass wenn ich die Arrays aus dem debugger (data 
watch) raus kopiere, atmel studio für jedes array ca. 20 sekunden 
braucht um mir die daten zu kopieren (rechtsklick copy).

über die Uart und dann kopieren geht schon n bisschen schneller aber 
auch noch recht umständlich.

Gibt es ne möglichkeit die arrays direkt in ner text datei oder .cvs zu 
speichern? sodass ich mit sehr wenig aufwandt meine plots aktualisieren 
kann? kann möglicherweise atmel studio schon einfacheplots erstellen? 
irgend eine extention? ich habe leider nichts gefunden.

gruss

ps: SAMV71 board

von Chris L. (kingkernel)


Lesenswert?

Hast du schonmal den Simulator versucht. Oder die Daten direkt als CSV 
ausgeben lassen und von COM1 direkt in eine Datei schreiben lassen

von nfet (Gast)


Lesenswert?

Also ich habe das Problem mal so gelöst (waren dann doch etwas mehr als 
4096 Werte :D):

Alles als ASCII über einen Virtual Comport geschickt, dabei ein python 
script auf dem PC laufen gehabt, was mir eine neue datei erstellt, wenn 
ein bestimmter String empfangen wird.
Dieses Script war ein 10 Zeiler oder so.

Bei so wenig Werten, sollte sich das anfühlen, als ob es sofort 
passiert.
Dann hast du eine / mehrere Datein, die du nur noch mit einem matlab 
script einlesen muss.

Ich glaube man kann auch mit matlab direkt auf eine serielle 
schnittstelle zugreifen, weiß aber nicht genau wie.

von nfet (Gast)


Lesenswert?

Oh was ich fast vergessen hatte, wenn du rumgeizen willst kann man 
natürlich auch direkt die binärdaten in matlab einlesen.

von T. (Gast)


Lesenswert?

nfet schrieb:
> Alles als ASCII über einen Virtual Comport geschickt, dabei ein python
> script auf dem PC laufen gehabt, was mir eine neue datei erstellt, wenn
> ein bestimmter String empfangen wird.
> Dieses Script war ein 10 Zeiler oder so.


An soetwas habe ich auch gedacht, wär auch ne gute Lösung! Leider habe 
ich keine Ahnung wie das geht... Dann werd ich mich wohl ein wenig 
einlesen, wenn es nicht so Viel Aufwand ist. Danke!

von Markus F. (mfro)


Lesenswert?

In der "guten alten Zeit" (als sogar die Gummistiefel noch aus Leder 
waren), hätte man da einfach im Terminalprogramm eine bestimmte 
Tastenkombination gedrückt, die bei der Gegenstelle eine x-, y- oder 
z-Modem-Dateiübertragungsanforderung ausgelöst hätte. Die Daten werden 
dann als Datei verschickt und danach geht's weiter, als wenn nix gewesen 
wäre.

Das geht heute immer noch (die meisten Terminalprogramme unterstützen 
das), man muß es "nur" auf der µC-Seite implementieren (was ziemlich 
simpel ist, diese Protokolle dienen nur dazu, eine sichere 
Binärdatenübertragung über eine "potentiell steuerzeichenverseuchte" 
Terminalschnittstelle zu realisieren).

von T. (Gast)


Lesenswert?

Danke für die hilfe, habs in matlab gemacht. War echt nicht so schwer :D

wens interessiert:
1
%run('clean');
2
clear all;
3
close all;
4
 
5
delete(instrfindall);
6
s = serial('COM2'); %assigns the object s to serial port
7
8
%fclose(s);
9
set(s, 'InputBufferSize', 256); %number of bytes in inout buffer
10
set(s, 'FlowControl', 'none');
11
set(s, 'BaudRate', 115200);
12
set(s, 'Parity', 'none');
13
set(s, 'DataBits', 8);
14
set(s, 'StopBit', 1);
15
set(s, 'Timeout',10);
16
set(s, 'Terminator', ' ');
17
%clc;
18
 
19
disp(get(s,'Name'));
20
prop(1)=(get(s,'BaudRate'));
21
prop(2)=(get(s,'DataBits'));
22
prop(3)=(get(s, 'StopBit'));
23
prop(4)=(get(s, 'InputBufferSize'));
24
 
25
disp(['Port Setup Done!!',num2str(prop)]);
26
 
27
fopen(s);           %opens the serial port
28
t=1;
29
disp('Running');
30
x=0;
31
while(t < 2048)  %Runs for 200 cycles - if you cant see the symbol, it is "less than" sign. so while (t less than 200)
32
 
33
   a = fgets(s); %reads the data from the serial port and stores it to the matrix a
34
   a = str2num(a);
35
   x =[x  a];  % Merging the value to an array, this is not very computationaly effective, as the array size is dynamic.
36
                 %Consider pre allocation the size of the array to avoid this. But beware, You might loose some important
37
                  %data at the end!
38
 
39
%   disp([num2str(t),'th iteration max= ',num2str(a)]);
40
 %  hold on;
41
   t=t+1;
42
   a=0;  %Clear the buffer
43
end
44
45
fclose(s); %close the serial port
46
disp('done');

anschließend hat man die Werte im Array X

ganz hilfreich:
https://www.youtube.com/watch?v=vepXrSXtqL0

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.