Pagina 1 di 3

microcontrollore PIC 16f690 connesso attraverso spi con ad78

Inviato: 19 mar 2011, 0:27
da Jackn
Salve,
ho connesso un PIC 16f690 con un convertitore analogico digitale ad7887,e ho creato una connessione spi,dove il primo funziona come master e il secondo come slave.
Ho messo in ingresso all' ad una sinusoide con valore picco picco di 5 volt,in base alla tensione che ho,dopo avere convertito il valore in digitale,devo accendere uno dei 4 led presenti sul PIC.
Il convertitore ad7887 ha una risoluzione di 12bit quindi valori compresi da 0 a 4095.
Quello che succede è che il led si accendo sì in maniera periodica(1 led acceso altri 3 spenti,2 acceso e altri tre spenti...),ma il tempo di accensione del quarto è nettamente superiore agli altri(circa 1 sec).
Secondo il mio parere,è vero che il quarto deve stare acceso di più,ma in uguale misura con il primo,dove sbaglio??
P.S. se aumento la frequenza della sinusoide le accensioni delle luci,ovviamente,aumentano di velocità.
Questo è il codice:

#include <16F690.H>
#define CLOCK_SP 8MHZ
#fuses NOPROTECT,NOWDT
#use delay(clock=CLOCK_SP)


void main(void){
int16 b,x;
int8 high,low;
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_64);
b=0;
while(1){
output_bit(PIN_A0,0); //attivo lo slave(si attiva negandolo)
spi_write(0);
high=spi_read(); //leggo i bit più significativi
x=high<<8; //mi servono solo 4 e le shifto per sommarli poi con i meno significativi
output_bit(PIN_A0,0);
spi_write(0);
low=spi_read(); //leggo i bit meno significativi
b=x+low; //sommo

if(b<=1024){
output_bit(PIN_C1,0);
output_bit(PIN_C2,0);
output_bit(PIN_C3,0);
output_bit(PIN_C0,1); //primo led acceso

}
else if(b>1024 & b<=2048){
output_bit(PIN_C1,1);
output_bit(PIN_C2,0);
output_bit(PIN_C3,0);
output_bit(PIN_C0,0);

}
else if(b>2048 & b<=3072){
output_bit(PIN_C1,0);
output_bit(PIN_C2,1);
output_bit(PIN_C3,0);
output_bit(PIN_C0,0);

}
else if(b>3072 & b<=4095){
output_bit(PIN_C1,0);
output_bit(PIN_C2,0);
output_bit(PIN_C3,1);
output_bit(PIN_C0,0);

}

}
}

Re: microcontrollore PIC 16f690 connesso attraverso spi con ad78

Inviato: 19 mar 2011, 1:19
da TardoFreak
La prima cosa che vedo e' che attivi il CS due volte con output_bit(PIN_A0,0) ma non lo disattivi mai. Almeno, questo mi pare.
La seconda cosa che noto e' che e' molto difficile leggere un programma cosi'. Dovresti racchiuderlo fra i tags "Code" (quinto pulsante in alto a sinistra nella finestra di editing del messaggio).

Re: microcontrollore PIC 16f690 connesso attraverso spi con ad78

Inviato: 19 mar 2011, 10:41
da Jackn

Codice: Seleziona tutto

#include <16F690.H>
#define CLOCK_SP 8MHZ
#fuses NOPROTECT,NOWDT
#use delay(clock=CLOCK_SP)


void main(void){
int16 b,x;
int8 high,low;
setup_spi(SPI_MASTER|SPI_L_TO_H|SPI_CLK_DIV_64);
b=0;
while(1){
output_bit(PIN_A0,0);                  //attivo lo slave(si attiva negandolo)
spi_write(0);
high=spi_read();                              //leggo i bit più significativi
x=high<<8;                         //servono solo 4 e shifto per
                                        // sommarli poi con i meno significativi
output_bit(PIN_A0,0);
spi_write(0);
low=spi_read();                              //leggo i bit meno significativi
b=x+low;                                       //sommo

if(b<=1024){
output_bit(PIN_C1,0);
output_bit(PIN_C2,0);
output_bit(PIN_C3,0);
output_bit(PIN_C0,1);                         //primo led acceso

}
else if(b>1024 & b<=2048){
output_bit(PIN_C1,1);
output_bit(PIN_C2,0);
output_bit(PIN_C3,0);
output_bit(PIN_C0,0);

}
else if(b>2048 & b<=3072){
output_bit(PIN_C1,0);
output_bit(PIN_C2,1);
output_bit(PIN_C3,0);
output_bit(PIN_C0,0);

}
else if(b>3072 & b<=4095){
output_bit(PIN_C1,0);
output_bit(PIN_C2,0);
output_bit(PIN_C3,1);
output_bit(PIN_C0,0);

}

}
}

Re: microcontrollore PIC 16f690 connesso attraverso spi con ad78

Inviato: 19 mar 2011, 10:47
da Jackn
Dovrei disattivare lo slave ogni volta che leggo??

Re: microcontrollore PIC 16f690 connesso attraverso spi con ad78

Inviato: 19 mar 2011, 11:37
da Paolino
Ma lo hai letto il datasheet del dispositivo?!? Da pagina 17 in poi c'è tutta la spiegazione di come fare per comunicare su linea seriale SPI...
I diagrammi di timing sono chiari: il CS va posto a valore logico 0 ogni volta che si inizia la comunicazione e va poi posto a "1 logico" al termine.

Ciao.

Paolo.

Re: microcontrollore PIC 16f690 connesso attraverso spi con ad78

Inviato: 19 mar 2011, 11:40
da TardoFreak
A pagina 17 del datasheet (dove si trova tutto :mrgreen: ) c'e' il diagramma temporale della comunicazione SPI. Come puoi notare il CS viene messo a 0 e funge da sincronismo per la comunicazione. Va poi quindi riportato ad 1 al termine della stessa.

Re: microcontrollore PIC 16f690 connesso attraverso spi con ad78

Inviato: 19 mar 2011, 12:03
da Jackn
grazie l'ho letto però nn ci ho fatto caso.
quindi leggo i bit più significativi,disattivo,poi leggo i bit meno significativi e infine lo ridisattivo.giusto?

Re: microcontrollore PIC 16f690 connesso attraverso spi con ad78

Inviato: 19 mar 2011, 12:07
da TardoFreak
Nel datasheet c'e' anche la risposta a questa domanda.
Ti suggerisco di leggerlo bene ed a fondo altrimenti prenderai sempre e solo cantonate. ;-)

Re: microcontrollore PIC 16f690 connesso attraverso spi con ad78

Inviato: 19 mar 2011, 12:33
da Jackn
scusa tu hai detto a pag 17 del datasheet,ma arriva fino a pag 16..forse ho un altro datasheet,dove l'hai preso?

Re: microcontrollore PIC 16f690 connesso attraverso spi con ad78

Inviato: 19 mar 2011, 12:38
da Jackn
forse intendevi pag 11 :D