interfaçage PIC12F675 et capteur ultrason HC_SR04

KNSFL
dim, 07/25/2021 - 20:05
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;}
}
}
Walter
lun, 07/26/2021 - 16:24
Bonjour,
difficile de t'aider comme ça.
Pourrais tu au moins décrire le comportement que tu constate et celui attendu?
KNSFL
mar, 07/27/2021 - 11:45
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
Walter
mer, 07/28/2021 - 08:40
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;
KNSFL
sam, 07/31/2021 - 02:06
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.
Walter
lun, 08/02/2021 - 18:15
C'est bizarre, il l'associe a un short et le positionne en même temps sur 1 octet?
Walter
lun, 08/02/2021 - 18:12
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
KNSFL
sam, 07/31/2021 - 02:18
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.
KNSFL
dim, 08/01/2021 - 06:20
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."
KNSFL
mer, 08/04/2021 - 11:39
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