Salve,
ho un microcontrollore PIC16F690 che è collegato a 8 convertitori A/D(12 bit di risoluzionie e 2 canali ognuno),dovrei interfacciarlo a matlab.
Questo pic è connesso ad una porta com e funziona così:
-devo inviare un carattere di sincronismo 's' per aspettare i numero di canali
-inviare il carattere 'a' per inizio trasmissione
-inviare il carattere 'b' di fine trasmissione
il seguente codice è scritto in c ed è quello del pic(metto solo per il primo canale):
come notate invia prima il bit meno significativo e poi quello più significativo.
il codice invece implementato in matlab è il seguente:
Ma non funzione bene..
cosa sbaglio??
grazie mille
ho un microcontrollore PIC16F690 che è collegato a 8 convertitori A/D(12 bit di risoluzionie e 2 canali ognuno),dovrei interfacciarlo a matlab.
Questo pic è connesso ad una porta com e funziona così:
-devo inviare un carattere di sincronismo 's' per aspettare i numero di canali
-inviare il carattere 'a' per inizio trasmissione
-inviare il carattere 'b' di fine trasmissione
il seguente codice è scritto in c ed è quello del pic(metto solo per il primo canale):
Codice:
while(1){
//Inizializzo le variabili
c=0;
canali=0;
d=0;
//Attendo il carattere di sincronismo
while(d!='s'){
if(kbhit()){
d=fgetc(pc);
}
}
//Attendo il numero di canali da cui acquisire
while(canali==0){
if(kbhit()){
canali=fgetc(pc);
}
}
num_canali=canali-48; //48 è il codice ascii di 0
//Attendo il carattere di start (inizio acquisizione)
while(c!='a'){
if(kbhit()){
c=fgetc(pc);
}
}
//Inizio l'acquisizione
while(c!='b'){
for(i=0;i<num_canali;i++){
switch(i){
//Acquisisco dal primo canale
case 0:
set_adc_channel(5);
delay_us(10);
value=read_adc();
delay_us(30);
low=value;
high=value>>8;
fputc(low,pc);
fputc(high,pc);
break;
case 1: ...........
il codice invece implementato in matlab è il seguente:
Codice:
rs232='COM3';
s=serial(rs232,'BaudRate',19200,'DataBits',8,'StopBits',1);
fopen(s);
pause(2);
fwrite(s,'s');
pause(1);
fwrite(s,1);
pause(1);
fwrite(s,'a');
i=1;
j=1;
k=1;
while i<10
vett=fread(s,s.BytesAvailable,'uint8');
pause(2);
while j<lenght(vett)
low(k)=vett(j);
j=j+1;
high(k)=vett(j);
k=k+1;
end
i=i+1
end
fwrite(s,'b');
fclose(s);
z=1;
vbe=0.0048875855327468230694037145650049; //risoluzione(5/(2^12))
while z<length(high)
% Quanto di un campione del primo canale
quanto1=high(z)*256+low(z);
signal1(z)=vbe*double(quanto1);
%Incremento variabile di conteggio
z=z+1;
end
plot(signal1,'*b'), title('Primo canale')
Ma non funzione bene..
cosa sbaglio??
grazie mille