Bonsoir,
J'ai voulu faire un compteur de tours/s d'un ventilateur de pc pour une futur application mais je bloque au niveau de l'utilisation des timers, j'arrive à compter le nombre de tours depuis l'allumage du circuit mais pas le nombre de tours depuis 1 seconde.
J'utilise un pic 16F88 avec une horloge externe de 20MHz, un ventilateur et un afficheur LCD classique pour afficher le nombre de tours/s.
Le capteur de tour du ventilateur est un capteur à collecteur ouvert et est branché sur la broche RB5 du pic avec bien sûr une résistance de rappel pour imposer le niveau haut, il produit 2 périodes par tour.
Voici donc le code source, je programme en C sous MikroC :
D'après ce que j'ai compris le TMR0 compte de 0 à 255 en s'incrémentant de 1 toutes les 12,8µs dans mon cas (J'ai mis le prescaler sur 64 si j'ai bien mis).Code:// LCD module connections sbit LCD_RS at RA1_bit; sbit LCD_EN at RB4_bit; sbit LCD_D4 at RB0_bit; sbit LCD_D5 at RB1_bit; sbit LCD_D6 at RB2_bit; sbit LCD_D7 at RB3_bit; sbit LCD_RS_Direction at TRISA1_bit; sbit LCD_EN_Direction at TRISB4_bit; sbit LCD_D4_Direction at TRISB0_bit; sbit LCD_D5_Direction at TRISB1_bit; sbit LCD_D6_Direction at TRISB2_bit; sbit LCD_D7_Direction at TRISB3_bit; // End LCD module connections char ligne; unsigned int temps=0; unsigned int tours=0; char colonne; char centaine; char dizaine; char unite; long acquisition; void timer(){ if(TMR0 >= 250) {TMR0 = 0; temps++;} if(temps>=312){ acquisition = tours/2; tours = 0; temps = 0; } } void main() { // ADCON1 = 0x0E; // Configuration du registre ADCON1 AN0 actif Lcd_Init(); // On initialise le LCD Lcd_Cmd(_LCD_CLEAR); // On efface l'affichage Lcd_Cmd(_LCD_CURSOR_OFF); // On désactive l'affichage du cuseur. PORTB = 0; PORTA = 0; TRISA = 0; TRISB = 0b00100000; //RB5 en entrée OPTION_REG = 0b01100101; TMR0 = 0; acquisition=0; ligne = 2; colonne = 6; while(1){ while(RB5_bit==1){timer();} while(RB5_bit==0){timer();} timer(); tours++; centaine = ((acquisition-(acquisition % 100))/100)+0x30; // Récupération du nombre de centaines. dizaine = (((acquisition % 100) - ((acquisition % 100)%10))/10)+0x30; // Récupération du nombre de dizaines. unite = ((acquisition % 100)%10)+0x30; // Récupération du nombre d'unitées. Lcd_Chr(ligne,colonne,centaine); Lcd_Chr(ligne,colonne + 1,dizaine); Lcd_Chr(ligne,colonne + 2,unite); } // Fermeture while } // Fermeture main
Il faut donc que je le laisse monter 312 fois jusqu'à 250 pour faire 12,8 * 10^-6 * 250 * 312 = 0,9984s ce qui correspond quasiment à 1s.
Là dans l'état actuelle l'afficheur LCD m'affiche tout le temps 000, je me doute bien que j'ai mal utiliser le TMR est-ce que vous pourriez donc m'aider ?
Merci d'avance pour vos réponses.
-----