stavolta non riesco ad ottenere la distanza precisa misurata dal modulo HC-SR04.
Vi posto il codice:
main.c
- Codice: Seleziona tutto
int get_SFR04(unsigned char pin_attivo);// prototipo della funzione
double distanza_sensore_esaminato;
unsigned int sensore_esaminato,usDista;
void main (void){
usDista=0;
sensore_esaminato=0;
while(1){
//calcolo della distanza
distanza_sensore_esaminato=(get_SFR04(sensore_esaminato_MASK)*17UL)/1000;
// divido per mille perché ho impostato il TIMER1 per interrupt ogni 10 us
usDista=0;
// delay tra due trigger 10 us
TMR1IF=0;
TMR1H = 255;
TMR1L = 176;
T1CON=0x01;
while(!TMR1IF);
T1CON=0x00;
TMR1IF=0;
}
}
Funzione che si occupa di prendere la distanza dal sensore
- Codice: Seleziona tutto
int get_SFR04(unsigned char pin_attivo){
//configuro il timer1 per un interrupt ogni 10 us //TRIGGER
TMR1IF=0;
TMR1H = 255;
TMR1L = 176;
T1CON=0x01;
PORTA = PORTA | pin_attivo;//TRIGGER , lasciando invariati gli altri BIT
while(!TMR1IF);
PORTA^=pin_attivo;// spengo il trigger
T1CON=0x00;
//Abilito la rilevazione degli interrupt del timer1
PIE1bits.TMR1IE=1;
T1CON=0x01; //accendo il timer1
while(!echo_1 || usDista==6553);//out of Range
T1CON=0x00;//spengo il timer
PIE1bits.TMR1IE=0;
usDista=0;
return usDista;
}
ISR:
- Codice: Seleziona tutto
void interrupt ISR(void){
if (TMR1IF){
// interrupt ogni 10 us
TMR1IF=0;
TMR1H = 255;
TMR1L = 176;
usDista++;
}
/* if (TMR2IF){
//interrupt ogni 100 us
ON_motore_speed++;
TMR2IF=0;
}*/
if(IOCIF){
if(IOCBF0){
IOCBF0=0;
if (echo_1==0){
echo_1=1;
}else{
echo_1=0;
}
}
if(IOCBF1){
IOCBF1=0;
if (echo_2==0){
echo_2=1;
}else{
echo_2=0;
}
}
if(IOCBF2){
IOCBF2=0;
if (echo_3==0){
echo_3=1;
}else{
echo_3=0;
}
}
if(IOCBF3){
IOCBF3=0;
if (echo_4==0){
echo_4=1;
}else{
echo_4=0;
}
}
}
// fine interrupt service routine
}
Il mio probema, secondo me sta nell' operazione
- Codice: Seleziona tutto
distanza_sensore_esaminato=(get_SFR04(sensore_esaminato_MASK)/58);
Con l'oscilloscopio riesco a vedere l' echo di ritorno dal sensore, facendo i calcoli manualmente ottengo un valore congruo con la distanza a cui si trova l' oggetto. Se invece vado , in modalità debug , a verificare il valore di distanza_sensore_esaminato nel pannello watches, ottengo zero, oppure un valore di molto distante da quello letto con l' oscilloscopio.
Il PIC è un 16f1713 con quarzo a 32 MHz, avete idee?

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)






