Boujour à tous,
Je cherche à réaliser un compte tour à led avec 8 Leds.
Je mets en pièce jointe le fichier "mesures et fonctionnement" dans lequel il y a le tableau de mesure réalisé avec un oscillo entre les Tr/min et la fréquence. Puis les mêmes mesures mais linéarisé afin de m'éviter d'aller jusqu'à 7000tr/min et enfin le fonctionnement et l'ordre d'eclairage que je souhaites réaliser.
Pour cela j'utilise un pic 18f2550 et le mode capture de ce pic. J'ai acheté la platine "start usb" avec bootloader afin de ne pas avoir à acheter de programmateur.
Je mets en pièce jointe le fichier "montage" dans lequel il y a le cablage que j'ai réalisé.
Enfin dans le fichier "signal sur RC2 par rapport au GND" je visualise le signal entrant dans la borne RC2 par rapport à la borne GND du pic. C'est ce signal qui me donne une fréquence en fonction des Tr/min.
Voici mon code, fonctionnant sur proteus :
Mon pic est bien alimenté en 5v continu.Code:#include "p18f2550.h" //------------------------------------ES et Variable------------------------------ unsigned int periode; char maj; //------------------------------------Interruption----------------------------- #pragma interrupt itercapt void itercapt(void) { unsigned static int ancien; if(PIR1bits.CCP1IF) { periode = CCPR1 - ancien; ancien = CCPR1; maj = 1; } PIR1bits.CCP1IF = 0; } #pragma code interruption=0x8 void ma_fonction (void) { _asm goto itercapt _endasm } //-----------------------------------Fonction principale------------------------ #pragma code void main(void) { PORTCbits.RC2 = 1; // confuguration en E/S des ports C TRISB = 0b00000000; PORTB = 0b00000000; TRISA = 0b00000000; PORTA = 0b00000000; T1CON = 0b00000001; //démarre TMR1, avec PreScaler = 1 T3CONbits.T3CCP2 = 0; // active Timer1 avec mode capture CCP1CON = 0b00000101; // configue de ccp à chaque front montant PIE1 = 0b00000100; //activation interruption de ccp1 RCONbits.IPEN = 1; // Interruption prioritaires activées INTCON = 0b10000000; // activation interruptions périphériques while(1){ if(maj){ if (periode>=9900 && periode<19100){PORTB=0b00000000;PORTA=0b00000001;} if (periode>=7990 && periode<9900){PORTB=0b00000000;PORTA=0b00000011;} if (periode>=6675 && periode<7990){PORTB=0b00000000;PORTA=0b00000111;} if (periode>=5730 && periode<6675){PORTB=0b00000000;PORTA=0b00001111;} if (periode>=5020 && periode<5730){PORTB=0b00000000;PORTA=0b00011111;} if (periode>=4450 && periode<5020){PORTB=0b00000000;PORTA=0b00111111;} if (periode>=4025 && periode<4450){PORTB=0b00000001;PORTA=0b00111111;} if (periode>=3360 && periode<4025){PORTB=0b00000101;PORTA=0b00111111;} if (periode>=3000 && periode<2885){PORTB=0b00000000;PORTA=0b00111000;} maj=0;} } }
Je souhaiterais que mes leds s'allument une par une dans chacune de ces plages :
1000-2000
2000-2500
2500-3000
3000-3500
3500-4000
4000-4500
45000-6000
6000 et plus
Sauf que la réalité est tout autre, mes leds s'allument de manière progressive mais sur des plages beaucoup plus courte. La 1er et la derniere led vont s'allument en une centaine de Tr/min.
D'ou vient le problème? est ce utile que dans mon programme je travail avec les fréquences plutot qu'avec les périodes?
Voici une video du résultat :http://www.dailymotion.com/video/xhy...urs-a-led_auto
Merci de votre aide
-----