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);
}
}
}
microcontrollore PIC 16f690 connesso attraverso spi con ad78
Moderatore:
Paolino
-
TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 10:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
[2] Re: microcontrollore PIC 16f690 connesso attraverso spi con ad78
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).
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).
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
0
voti
[3] Re: microcontrollore PIC 16f690 connesso attraverso spi con ad78
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);
}
}
}-
Paolino
32,6k 8 12 13 - G.Master EY

- Messaggi: 4226
- Iscritto il: 20 gen 2006, 10:42
- Località: Vigevano (PV)
- Contatta:
0
voti
[5] Re: microcontrollore PIC 16f690 connesso attraverso spi con ad78
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.
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.
"Houston, Tranquillity Base here. The Eagle has landed." - Neil A.Armstrong
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-------------------------------------------------------------
PIC Experience - http://www.picexperience.it
-
TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 10:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
[6] Re: microcontrollore PIC 16f690 connesso attraverso spi con ad78
A pagina 17 del datasheet (dove si trova tutto
) 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.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
-
TardoFreak
73,9k 8 12 13 - -EY Legend-

- Messaggi: 15754
- Iscritto il: 16 dic 2009, 10:10
- Località: Torino - 3° pianeta del Sistema Solare
0
voti
[8] Re: microcontrollore PIC 16f690 connesso attraverso spi con ad78
Nel datasheet c'e' anche la risposta a questa domanda.
Ti suggerisco di leggerlo bene ed a fondo altrimenti prenderai sempre e solo cantonate.
Ti suggerisco di leggerlo bene ed a fondo altrimenti prenderai sempre e solo cantonate.
"La follia sta nel fare sempre la stessa cosa aspettandosi risultati diversi".
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.
"Parla soltanto quando sei sicuro che quello che dirai è più bello del silenzio".
Rispondere è cortesia, ma lasciare l'ultima parola ai cretini è arte.

Elettrotecnica e non solo (admin)
Un gatto tra gli elettroni (IsidoroKZ)
Esperienza e simulazioni (g.schgor)
Moleskine di un idraulico (RenzoDF)
Il Blog di ElectroYou (webmaster)
Idee microcontrollate (TardoFreak)
PICcoli grandi PICMicro (Paolino)
Il blog elettrico di carloc (carloc)
DirtEYblooog (dirtydeeds)
Di tutto... un po' (jordan20)
AK47 (lillo)
Esperienze elettroniche (marco438)
Telecomunicazioni musicali (clavicordo)
Automazione ed Elettronica (gustavo)
Direttive per la sicurezza (ErnestoCappelletti)
EYnfo dall'Alaska (mir)
Apriamo il quadro! (attilio)
H7-25 (asdf)
Passione Elettrica (massimob)
Elettroni a spasso (guidob)
Bloguerra (guerra)

