Sida 2 av 2

Postat: 10 december 2007, 08:40:04
av jenslager
Använder Terminal v1.9 b. Vill använda matlab.

Postat: 8 januari 2008, 22:06:04
av jonte_s
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:

Kod: Markera allt

     
data(i,1)=str2double(fscanf((s1)));     %pos1
data(i,2)=str2double(fscanf((s1)));     %setpoint
Hur skall man skicka ut från uC?

pos1 mellanslag setpoint

funkar inte...

/ Jonas

Postat: 9 januari 2008, 08:56:16
av oJsan
Klicka på knappen "Graph", svårare än så är det inte =)

Postat: 10 januari 2008, 20:42:25
av RDX*
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:

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

Postat: 8 februari 2008, 10:10:21
av jenslager
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.

Postat: 8 februari 2008, 10:35:45
av Fagge

Begränsningar

Postat: 8 februari 2008, 11:38:43
av jenslager
Stamp plot verkar bara fungera upp till 56000 baud. :(
Fasta annars så hade det nog fungerat :)

Postat: 8 februari 2008, 21:34:39
av RDX*
Jag kan köra i 57600Baud utan problem med en Mega8 intern klockad. Låter nästan som om du har dålig kvalitet på signalöverföringen från processor till dator. Kan du öka hastigheten om du kör ett enkelt test mot en vanlig terminal?

Re: Vilken är maxhastigheten ni lyckas överföra era värd

Postat: 8 februari 2008, 21:43:22
av oJsan
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.