Plotta data från com-porten (seriel) i realtid?
oJsan: Jag får det inte att funka med teminal. Vill du förklara lite närmare hur man gör? Om du vet.
RDX*: Har testat din kod, och den funkar inte så bra för mig (modifierat de två raderna lägre ned lite). Ibland funkar det... men oftast inte. Får en massa felmeddelanden *ibland*. Dessa är dels något felmeddelande om "buffer overrun", vilket gör att hela matlab stängs ned. Sedan får jag även felmeddelanden om att inte den baudrate (38400) kan sättas.
Sedan undrar jag om du kan förklara dessa två rader:
Hur skall man skicka ut från uC?
pos1 mellanslag setpoint
funkar inte...
/ Jonas
RDX*: Har testat din kod, och den funkar inte så bra för mig (modifierat de två raderna lägre ned lite). Ibland funkar det... men oftast inte. Får en massa felmeddelanden *ibland*. Dessa är dels något felmeddelande om "buffer overrun", vilket gör att hela matlab stängs ned. Sedan får jag även felmeddelanden om att inte den baudrate (38400) kan sättas.
Sedan undrar jag om du kan förklara dessa två rader:
Kod: Markera allt
data(i,1)=str2double(fscanf((s1))); %pos1
data(i,2)=str2double(fscanf((s1))); %setpoint
pos1 mellanslag setpoint
funkar inte...
/ Jonas
Ok, då börjar jag med att förklara raden "data(i,1)=str2double(fscanf((s1)));"
"S1" är serieportsobjektet, i detta objektet finns tex Baudrate:en mm.
"fscanf((s1)" läser av serie porten i ASCI format. Detta konverteras sedan med "str2double" till siffror. Den bara lägger jag siffrorna i data matrisen.
Mitt program i µC ser väldigt förenklat ut så här:
Om jag tittar i en vanlig terminal så ser det ut så här:
var0
var1
var0
var1
...
Det är alltså dessa rader jag läser av med
data(i,1)=str2double(fscanf((s1))); %pos1
data(i,2)=str2double(fscanf((s1))); %setpoint
Det är viktigt att både µC och matlab hinner med att skicka och läsa varje rad. Börja med något enkelt tex att skicka 5 värden per sekund från µC. Med en hastighet på tex 19200 Baud.
Kolla sedan i en vanlig RS-232 terminal att texten ser ut som ovan.
Där efter kan du testa med matlab.
Nu har matlab en timeout också så modifiera matlab så den läser in värdena i tex 5s:
for i= 1 :25 %acquisition of 25 points
data(i,1)=str2double(fscanf((s1))); %var0
data(i,2)=str2double(fscanf((s1))); %var1
end
Om matlab drabbas av en time-out eller låser sig, så är det svårt att radera hela S1 objektet. Även om det inte finns i workspace så håller den linjen öppen och reserverad. Om detta händer är det säkrast att starta om matlab. Alternativt att vara säker på att S1 har raderats och att en ny länk kan öppnas på com-porten.
Om bitrate:en blir för stor så att matlab inte hinner med så kan ett tal missas vilket resulterar i att var1 hamnar i data(i,1) och viceversa. Eller så klarar inte matlab läsa alls så time-out:en aktiveras.
Slutligen var fick du felmedelandet i matlab eller från µC?
"S1" är serieportsobjektet, i detta objektet finns tex Baudrate:en mm.
"fscanf((s1)" läser av serie porten i ASCI format. Detta konverteras sedan med "str2double" till siffror. Den bara lägger jag siffrorna i data matrisen.
Mitt program i µC ser väldigt förenklat ut så här:
Kod: Markera allt
$regfile = "m8def.DAT"
$crystal = 8000000
$baud = 57600
Config ADC...
Main:
var0=läs(ADC0)
print var0
var1=läs(ADC1)
print var1
waitms 200
Goto Main
Om jag tittar i en vanlig terminal så ser det ut så här:
var0
var1
var0
var1
...
Det är alltså dessa rader jag läser av med
data(i,1)=str2double(fscanf((s1))); %pos1
data(i,2)=str2double(fscanf((s1))); %setpoint
Det är viktigt att både µC och matlab hinner med att skicka och läsa varje rad. Börja med något enkelt tex att skicka 5 värden per sekund från µC. Med en hastighet på tex 19200 Baud.
Kolla sedan i en vanlig RS-232 terminal att texten ser ut som ovan.
Där efter kan du testa med matlab.
Nu har matlab en timeout också så modifiera matlab så den läser in värdena i tex 5s:
for i= 1 :25 %acquisition of 25 points
data(i,1)=str2double(fscanf((s1))); %var0
data(i,2)=str2double(fscanf((s1))); %var1
end
Om matlab drabbas av en time-out eller låser sig, så är det svårt att radera hela S1 objektet. Även om det inte finns i workspace så håller den linjen öppen och reserverad. Om detta händer är det säkrast att starta om matlab. Alternativt att vara säker på att S1 har raderats och att en ny länk kan öppnas på com-porten.
Om bitrate:en blir för stor så att matlab inte hinner med så kan ett tal missas vilket resulterar i att var1 hamnar i data(i,1) och viceversa. Eller så klarar inte matlab läsa alls så time-out:en aktiveras.
Slutligen var fick du felmedelandet i matlab eller från µC?
Vilken är maxhastigheten ni lyckas överföra era värden v
Med en ATmega 16 skall ju den snabbaste 65 mikrosekunder. Nu får jag inte överföringen att fungera över 34800 baud. Är ju ingen mening att sampla fort om man inte kan överföra det. Just nu skickar jag in signalerna på min STK 500. Jag använder en extern 16MHZ klocka.
Begränsningar
Stamp plot verkar bara fungera upp till 56000 baud. 
Fasta annars så hade det nog fungerat

Fasta annars så hade det nog fungerat

Re: Vilken är maxhastigheten ni lyckas överföra era värd
jenslager skrev:Med en ATmega 16 skall ju den snabbaste 65 mikrosekunder.
snabbaste vadå? Känns som att en del av meningen fallit bort. Är det ADC:ns omvandlingstid du menar? Max fs skulle isåfall bli 16384Hz.
jenslager skrev:Nu får jag inte överföringen att fungera över 34800 baud.
Det beror förmodligen på att klockgenereringen avviker för mycket från det tänkta värdet. Vid 57600baud ligger du 2,1% ifrån, vid 115200baud ligger du -3,5% ifrån.
Om du byter till en kristall på 18,4320MHz eller 11,0592MHz så kan du uppnå 0% avvikelse på alla "standard"-baudrates från 2400baud upp till 115200baud. Dessa kristaller finns hos t.ex. Elfa.
Vid 115200baud hinner du skicka 11520 samples/sekund (8-bit), vilket tillåter en maximal conversion-time på ~87us om du vill hålla full fart på UART:en.
Vilka möjligheter finns det till komprimering av data? Måste du ha en viss upplösning? Vid 18,432MHz klockfrekvens och fs=11520Hz blir det 1600 klockcykler per sample som kan användas till databehandling.