microcontrollore PIC 16f690 connesso attraverso spi con ad78
Inviato: 19 mar 2011, 0:27
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);
}
}
}
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);
}
}
}