bonjour a tous ,
voila j'ai crée un signal carré de 40khz dans un micrcontroleur ( PIC16F1508) pour que mon émetteur a ultrason émette un signal , mon recepteur le recois, je l'amplifie avec un aop et avec un comparateur je renvoie a mon microcontroleur un signal carré dephasé par raport au temps que met l'onde sonore pour atteindre mon recepteur a ultrason.
mais probleme mon code ne marche pas , le voici:
j'ai testé mon afficheur 7 segments et il fonctionne , le probleme est que pour tester sans tenir compte de l'ultrason je met 5 v a mon entrée ultrason et ca devrait m'afficher 0 sur mes digits car compteur n'a pas le temps de s'incrementer mais la ca m'affiche 14 ou 2 et des fois > 10000 dans mes digits et je ne comprend pas pourquoi la variable compteur arrive a monter jusqu'a 7.Code:#define SORTIE_ULTRASON RA4 #define ENTREE_ULTRASON RA5 int i=0; long int compteur=0,chrono=0; void init_pic() { OSCCON=0b01111010; //Oscillateur interne à 16MHZ T0CS=0; // comptage quartz: FOSC/4=4MHz GIE=1; // autorisation générale IT T0IE=1; //valide IT en cas de débordement de TMR0 T0IF=0; // initialise T0IF a 0, T0IF=1 quand debordement de TMR0 PSA=1; // On active PAS les prediviseurs TMR0=219; // TMR0 reglé pour avoir une frequence de 80KHZ //configuration des PORTS ANSELA=0; TRISA=0b00100110; //RA5 en entré ---> consacré au Recepteur a ultrason //RA2 en entré ---> bouton poussoir qui active l'ultrason //RA1 en entré ---> bouton poussoir qui desactive l'ultrason PORTA=0x00; //PORT consacre a l'afficheur 7 segments ANSELB=0; TRISB=0x00; // en sorties PORTB=0x00; ANSELC=0; TRISC=0x00; PORTC=0x00; void interrupt sous_programm() { if(T0IF==1)//80 khz { T0IF=0; if(i==1)//appuie bouton poussoir { SORTIE_ULTRASON=!SORTIE_ULTRASON;//frequence reglé a 40KHZ compteur++; // compteur=80000 --> 1 seconde } chrono++; TMR0=219;// pour avoir une frequence d'environ 80khz } } init_pic(); int tab[11]={0xC0,0xCF,0x92,0x86,0x8D,0xA4,0xA0,0xCE,0x80,0x84,0xB0};// pour les digits , ca correspond aux chiffres de 0 a 9 et de E int millimetre=0,centimetre=0,decimetre=0,metre=0; int b=0; float distance=0,a; DIGIT_1 = 1;//RB4 a 1 while(1) { if(RA2==1){ //appuie bouton poussoir compteur=0; while(RA2==1); // on attend le relachement du bouton poussoir while(chrono<400);// contre le rebond : attente de 5 ms chrono=0; i=1;//on active l'oscillation de l'ultrason b=1; } if( b==1 ) { if(ENTREE_ULTRASON==1) { b=0;i=0; //on desactive l'ultrason // calcul de distance distance = (0.00425363 * (float)compteur ) /2 ; } else{ //on active l'afficheur 7 segments } }
avez vous une idée?
merci d'avance car le code est long
-----