Bonjour,
Alors voila, je fais actuellement un projet avec mon école sur la perception de l'environnement pour les malvoyants.
Le but est de récoté les informations de 5 télémètre par la pin CCP1, de les traiter avec le PIC18F4550 et, en fonction de la position de l'objet envoyer des bip sonore plus ou moin rapproché et avec hauteur plus ou moin grande (si l'obstacle est loin et a gauche, les bip sont espacé et grave, si l'osbtacle est proche et à droite, les bip sont rapproché et aigue).
En parallèle, un bargraphe a 10 segments allume ces led avec le meme principe.
Le programme testé sous Proteus Isis fonctionne bien, j'obtiens des bips plus ou moin espacé avec un panel de fréquence allant de 300 à 700 Hz.
Le probleme est que lorsque je teste le programme sur un vrai microcontroleur, le PIC fonctionne comme au ralenti, comme 25 fois plus lentement... sauriez vous pourquoi ?
Je ne sais pas si j'ai été assez clair, merci en tout cas
Voici le code ( un peu long j'en suis désolé)
Bonne soirée à tous.
Code:#include <p18f4550.h> #include <stdio.h> #include <capture.h> #include <timers.h> #include <math.h> #include <delays.h> /*---------------------------------bits de configuration----------------------------------------*/ #pragma config PLLDIV = 5 #pragma config CPUDIV=OSC3_PLL4 #pragma config USBDIV = 1 #pragma config FOSC = HSPLL_HS #pragma config FCMEN = ON #pragma config BOR = OFF #pragma config VREGEN = ON #pragma config WDT = OFF #pragma config PBADEN = OFF #pragma config LPT1OSC = OFF #pragma config MCLRE = ON #pragma config STVREN = ON #pragma config LVP = OFF #pragma config ICPRT = OFF #pragma config XINST = OFF #pragma config DEBUG = ON /*---------------------------------fin bits de configuration------------------------------------*/ /*---------------------------------déclaration variable ----------------------------------------*/ unsigned char config1=0x00; //initialisation de la configuration de capture '0000 0000' unsigned int a=0,b=0,c=0,d=0,e=0; // variable correspondant respectivement au télémetre 1,2,3,4,5 unsigned int telemetre; //variable qui sert à avoir la valeur de la mesure dans la fonction mesure() unsigned int minimum; // variable dans laquelle il y a la plus petite valeur entre a,b,c,d,e unsigned int i,j; // variable qui sert à déterminer le temp des 'bip' sonore /*----------------------------------fin déclaration variable -----------------------------------*/ /*----------------------------------déclaration de fonctions------------------------------------*/ unsigned int mesure(void); //fonction mesure qui calcule à l'aide du timer1 le nombre de cycle que fait une pulsation void bargraph(void); //alumage du bargraph en fonction des donnée des télémètres (ne clignote pas, s'allume juste) void clignote_bargraph_son(void); // fait clignoter le bargraphe en fonction de la distance de l'obstacle unsigned int MIN(void); //fonction qui détermine le minimum entre a,b,c,d,e void son(void); //création du signal sonore en fonction de la position de l'obstacle (grave aigue) /*-------------------------------------fin déclaration de fonctions-----------------------------*/ /*------------------------------------programme principal---------------------------------------*/ void main(void) { //intialisation des E/S du microcontrôleur et attente d'au moins 175ms pour la mise en route des télémètres TRISA=TRISA&0b0110000; //TRISA=0xx0000 0=sortie 1=entrée TRISB=TRISB&0b11111000; //TRISB=xxxxx000 TRISC=TRISC&0b0111111; //TRISC=0xxxxxx TRISC=TRISC|0b0000100; //TRISC=0xxx1xx TRISD=TRISD&0b11000000; //TRISD=xx000000 PORTBbits.RB1=1; //LED jaune allumé pour montrer la phase d'initialisation ADCON1=0x0F; // par défaut, les port A sont en mode analogique, il faut alors initialisé le registre ADCON1 pour les mettre en mode digital PORTA=PORTA&0b11110000; //mise à '0' des sorties RA0,RA1,RA2,RA3, PORTB=PORTB&0b11111110; // mise à '0'et '1' des sorties RB0 et RB2 (=led rouge BF du micro) PORTB=PORTB|0b00000100; PORTC=PORTC&0b0111111; //initialisation du port RC6 ( broche qui active les télémètre) PORTD=PORTD&0b11000000; //mise à '0' des sortie RD0,RD1,RD2,RD3,RD4,RD5 // initialisation des TIMERS T0CON=0b00000111; //intialisation du timer0 pour le clignotement du bargraph postcaler 256 INTCONbits.TMR0IE=1; //autorise les interruption du timer0 INTCONbits.TMR0IF=0; // mise à zéro du flag d'interruption du timer0 TMR0H=0x0; // initialisation du conmpteur TMR0L=0x0; T3CON=0b10000000; //initialisation du timer3 pour le signal sonore (postcale 1) TMR3H=0; TMR3L=0; PIR2bits.TMR3IF=0; PIE2bits.TMR3IE=1; Delay10KTCYx(0); // attente de 1,281 seconde pour laisser le temps au télémètre de démarrer Delay10KTCYx(0); // et de voir la led jaune s'allumer et s'éteindre Delay10KTCYx(0); PORTBbits.RB1=0; //led jaune éteinte, fin de l'initialisation // envoi du signal de déclenchement des télémètre, il faut un '1' durant au moin 20µs, on va prendre 30µs pour être sur PORTCbits.RC6=1; //mise à '1' Delay10TCYx(18); // on attend 18 fois 10 cycle d'horloge., ce qui fait 180 fois l'horloge qui est de 167ns. 180*167=30µs PORTCbits.RC6=0; //on la remet à '0' // capture du signal des télémètre et mémorisation dans 5 variables différentes a=mesure(); //l'unité de a,b,c,d et e est 'nombre de cycle' il faut multiplier par 8 pour avoir la valeur réel du nombre de cycle d'horloge b=mesure(); //la valeur max de a,b,c, et e est de : 33234 cycle du timer1 ce qui correspond a c=mesure(); //265872 cycles d'horloge soit à 44,4ms . d=mesure(); e=mesure(); MIN(); //met la valeur minimum de a,b,c,d,e dans la variable minimum while(1) { clignote_bargraph_son(); //fait clignoter le bargraph en fonction des valeurs de a,b,c,d,e // et activer le son. Cette fonction en appelle 2 autres... } } /*---------------------------------------fin programme principal----------------------------------*/ /*--------------------------------------------fonctions-------------------------------------------*/ unsigned int MIN(void) { if(a<b && a<c && a<d && a<e) { minimum=a; } if(b<a && b<c && b<d && b<e) { minimum=b; } if(c<a && c<b && c<d && c<e) { minimum=c; } if(d<a && d<c && d<b && d<e) { minimum=d; } if(e<a && e<c && e<d && e<b) { minimum=e; } } unsigned int mesure(void) { telemetre=0; //initialisation de la variable telemtre SetTmrCCPSrc(T1_SOURCE_CCP); //on prend le timer 1 comme source pour le CCP config1 = CAP_EVERY_RISE_EDGE ; //on config la capture sur un front montant //autrement dit, ici, config1= 00000101 OpenCapture1(config1); //on démarre la capture avec la config1 while(!PIR1bits.CCP1IF); //tant que ccp1iF est à 0, on fait rien, quand il passe à 1, on sort du while et on démarre le timer1 OpenTimer1(10110001); //le timer compte avec la config T1CON=10110001 POSTCALER 8 !!!! PIE1bits.CCP1IE=0; //on éteint la capture pour éviter une fausse interruption PIR1bits.CCP1IF=0; // purification de ce bit pour etre sur de ne as avoir de fausse interruption config1= CAP_EVERY_FALL_EDGE; // on change le mode de capture pour capturer le front descendant, le compteur compte toujours PIE1bits.CCP1IE=1; //on re-autorise les interruptions. OpenCapture1(config1); //on demarre la capture avec la config sur le front descendant cette fois ci while(!PIR1bits.CCP1IF); //on attend un front descendant telemetre=ReadTimer1(); //une fois le front descendant passer, on enregistre la valeur du timer dans la variavble telemetre CloseTimer1(); //on éteint le timer return(telemetre); // on retourne la valeur du telemetre (en nombre de cycle) } void clignote_bargraph_son(void) { if(minimum>29134) { T0CONbits.TMR0ON=1; // on démarre le compteur qui va 256 (postcale = '111') fois moins vite que la clock de 24Mhz et compte jusqu'a 65535 (16bits) if(INTCONbits.TMR0IF==1) // si le le compteur est arrivé a 65535 { bargraph(); //allumage du bargraph en fonction des valeurs de a,b,c,d,e for(i=0;i<2808;i++) //activation du signal sonore pendant environ 50ms, le temp d'entendre ce bip { son(); //fonction qui produit le son d'un fréquence qui dépend si l'osbtacle est a droite ou a gauche... } TMR0L=0x0; // on remet le compteur a 0 TMR0H=0x0; T0CONbits.TMR0ON=0; // on arrete le compteur INTCONbits.TMR0IF=0; // on remet le flag d'interruption a 0. } PORTA=PORTA&0b11110000; // on rééteint le bargraphe PORTDbits.RD1=0; //on remet les port de sortie sonore à 0 PORTDbits.RD2=0; i=0; //on remet i et j à 0 j=0; } if(minimum>24972 && minimum<29134) { T0CON=0b10000110; // on démarre le compteur qui va 128 (postcale = '110') fois moins vite que la clock de 24Mhz et compte jusqu'a 65535 (16bits) if(INTCONbits.TMR0IF==1) // si le le compteur est arrivé a 65535 { bargraph(); //allumage du bargraph en fonction des valeurs de a,b,c,d,e for(i=0;i<2808;i++) //activation du signal sonore pendant environ 50ms, le temp d'entendre ce bip { son(); //fonction qui produit le son d'un fréquence qui dépend si l'osbtacle est a droite ou a gauche... } TMR0L=0x0; // on remet le compteur a 0 TMR0H=0x0; T0CONbits.TMR0ON=0; // on arrete le compteur INTCONbits.TMR0IF=0; // on remet le flag d'interruption a 0. } PORTA=PORTA&0b11110000; // on rééteint le bargraphe PORTDbits.RD1=0; //on remet les port de sortie sonore à 0 PORTDbits.RD2=0; i=0; //on remet i et j à 0 j=0; } if(minimum>20810 && minimum<24972) { T0CON=0b10000101; // on démarre le compteur qui va 64 (postcale = '101') fois moins vite que la clock de 24Mhz et compte jusqu'a 65535 (16bits) if(INTCONbits.TMR0IF==1) // si le le compteur est arrivé a 65535 { bargraph(); //allumage du bargraph en fonction des valeurs de a,b,c,d,e for(i=0;i<2808;i++) //activation du signal sonore pendant environ 50ms, le temp d'entendre ce bip { son();
-----