interfaçage PIC12F675 et capteur ultrason HC_SR04

Portrait de KNSFL

bonjour, je suis un amateur en électronique et programmation des microcontrôleurs.

Je désire mettre sur pied un petit projet à base du pic12F675 pour mesurer la distance à l'aide du capteur ultrason HC-SR04 sous MiKroc pro for pic. Le pic est cadencé en interne à 4Mhz et j'utilise le module TMR1 de ce dernier en mode compteur mais je n'ai pas le résultat souhaité

mon code est le suivant

/*projet utilisation du capteur ultrason HC-SR04 pour mesure de distance avec un
***pic 12F675 dans mikroc Pro for pic frequence interne de 4Mhz et donc une ***
*********************Distance max 2,79 metres*********************************/

#define TRIG GPIO.B0 //
#define ECHOS GPIO.B1 //
#define LED1 GPIO.B2 //
#define LED2 GPIO.B4 //
#define LED3 GPIO.B5 //les apellations propre des diferentes broches

unsigned short TMR1=0; //stockage de la valeur du de registre timer1
unsigned int distance=0; //stockage de la valeur de la distance

void main() {

TRISIO=0x0A; //B3 et B1 en entree autres en sortie
GPIO=0x00; //mise à zero des E/S

CMCON=7; //deactiver les comparateur
ANSEL=0; //bits A/N configurés en digital

T1CKPS0_BIT=0; //
T1CKPS1_BIT=0; //set prescaler 1:1

for(TMR1=0; TMR1<5; TMR1++)
{
LED1=1; //
LED2=1; //
LED3=1; //
delay_ms(500); //
LED1=0; //
LED2=0; //
LED3=0; //verification des connexion des les de signalisation
delay_ms(500);
}
TMR1=0;
for(;;){

TMR1H = 0; // A7A6A5A4A3A2A1A0=00000000 //
TMR1L = 0; // B7B6B5B4B3B2B1B0=00000000 ///Initialisation du registre timer1 à zero/

TRIG = 1; //
Delay_us(10); //
TRIG = 0; //envoi de l'impulsion de 10us sur la pin TRIGGER

while(!ECHOS) //attendre le niveau logic "1" de la part de la pin ECHOS
T1CON.B0 = 1; // si OUI activer le timer 1
while(ECHOS) //attendre que la pin ECHOS passe au niveau logique "0"
T1CON.B0 = 0; //si OUI deactiver le timer 1

TMR1 = (TMR1L | (TMR1H << 8)); //lire la valeur du registre TIMER1 (temps en US)
/*TMR1=// A7A6A5A4A3A2A1A0B7B6B5B4B3B2B1B0*/

distance = TMR1/58.82; //convertir le temps en distance equivalente en centimetre

if(distance > 4 && distance<=60){LED1=~LED1; delay_ms(200);}

else if(distance > 61 && distance<=75){LED2=~LED2; delay_ms(200);}

else if(distance > 75 && distance<=100){LED3=~LED3; delay_ms(200);}

else if(distance > 100 && distance<=279){LED1=1; LED2=1;LED3=1; delay_ms(200);
LED1=0; LED2=0;LED3=0; delay_ms(200);}

else {LED1=1;LED2=1;LED3=1;}

}
}

Portrait de Walter

Bonjour,

difficile de t'aider comme ça.
Pourrais tu au moins décrire le comportement que tu constate et celui attendu?

Portrait de KNSFL

bonjour Walter,

lorsque je lance la simulation sous proteus les LEDs s'allument constamment sans prendre en compte la distance ; donc d'après le code il y a débordement de la mesure (soit la distance est inférieure à 2cm ou alors elle est supérieur à 279cm)

Pourtant dans la plage [3,278] j'aimerai allumer les LEDs proportionnellement à la distance 

Portrait de Walter

Bonjour,
Je n'ai pas regardé ton code avec assez d'attention.
le code suivant ne doit pas faire ce que tu veux, je pense qu'il manque un ";" à la fin du while.
Tel quel tu va activer le timer des la première fois.

while(!ECHOS) //attendre le niveau logic "1" de la part de la pin ECHOS
T1CON.B0 = 1; // si OUI activer le timer 1

a remplacer par 
while(!ECHOS);
T1CON.B0 = 1;

dans les bonnes pratiques ou les extrémistes du codage :), il faut essayer d'enlever toute ambiguïté et ne pas utiliser ce genre de pratique.
le mieux serait
while(!ECHOS) { }
T1CON.B0 = 1;

Portrait de KNSFL

Salut Walter,

merci pour les déférentes corrections ;  il y'avait également un problème avec la variable TMR1 short sous miKroc pro for pic vaut 1 octet or le timer 1  du PIC12F675 s'étend sur 2 octets.

Après les différentes corrections j'ai obtenu les images ci dessous. il ne reste plus que passer à la pratique pour admirer le comportement réel.

hc_sr04pic12f675.jpg

Portrait de Walter

C'est bizarre, il l'associe a un short et le positionne en même temps sur 1 octet?

Portrait de Walter

Bien au contraire, l'idée d'utiliser le PWM pour avoir plus de finesse de restitution est intéressante, par contre KNSFL semble vouloir utiliser un PIC et savoir ce qu'il veut faire avec.
Ton message ne répond peut être pas à sa problématique actuel?
Pourquoi l'effacer?

Merci Chantale0

Portrait de KNSFL

bonjour Chantale0,

J'ai choisi ce micro-contrôleur parce qu'il est à porté de main et et à vil prix par rapport à l'ATMEGA328P de plus ce projet c'est pour gérer juste la lampe de ma table d'étude. 

Merci tout de même.

Portrait de KNSFL

Oui je suis d'accord avec toi, on a aussi des pics plus performant que le 12f675

"Je ne veux pas utiliser un marteau pour tuer un moustique." 

Portrait de KNSFL

Les leds pour ce cas étaient juste pour tester la ''précision'' sur la mesure de la distance. Mon projet a pour but d'automatiser ma lampe de bureau (détecteur de présence à ultrason). 

Merci, Chantale0