Bonjour,
Je veux réaliser un montage me permettant d'allumer mon PC Media Center depuis une touche précise de la télécommande IR.
En mode apprentissage, le PIC 16F628A enregistrera les durées hautes et basses de la trame dans sa EEPROM.
En temps normal, lorsque qu'une trame sera reçue, les durées hautes et basses seront enregistrées dans un tableau, et les longueurs comparées à celles stockées en EEPROM.
Après le début de la réception d'une trame, je considère qu'elle est finie lorsque l'état est bas pendant plus d'une seconde et j'ajoute un 0 en fin de mon tableau pour spécifier que la trame s'arrête là.
Pour simplifier, la trame ne provient pas d'une télécommande IR mais directement de la sortie d'un 2è PIC qui envoie 5 périodes d'un signal carré de demi période 500ms.
Le problème est que je n'arrive même pas à compter le nombres d'impulsions qui sont reçues!
Voilà mon code sous MikroC (certains #defines servent à d'autres fonctions) :
L'entrée dont je dois enregistrer les impulsions est E_TUNER.
Ensuite, je fais clignoter la led branchée sur RELAIS1 le nombre de fois que j'ai enregistré une durée haute ou basse. (pour l'instant, la durée n'est même pas enregistrée mais est fixée arbitrairement à 50 pour une durée haute et 40 pour une durée basse. Une valeur 0 donne la fin de la trame.
Le problème est que soit ma led ne clignote pas, soit elle clignote 30 fois (taille max du tableau).Code:#define TAILLE_TABLEAU_TRAME 30 // PORT A : sorties #define RELAIS1 PORTA.F0 #define RELAIS2 PORTA.F1 #define S_TUNER PORTA.F2 #define BOOT_PC PORTA.F3 // Port B : entrées avec pull-up #define LPT_R1 !PORTB.F4 #define LPT_R2 !PORTB.F5 #define LPT_R12 !PORTB.F6 #define E_TUNER PORTB.F2 // ! à enlever #define PC_BOOTE !PORTB.F3 // ! à enlever void Afficher_Trame(unsigned char trame[]) { int i; for(i = 0; trame[i] > 0; i++) { RELAIS1 = i % 2; delay_ms(500); } RELAIS1 = 0; delay_ms(1000); } void Recevoir_Trame_2(unsigned char trame[]) { unsigned char no_bit = 0, continuer = 1; int cpt; while(continuer) { // Mesure de la durée de l'état haut while(E_TUNER); trame[no_bit] = 50; no_bit++; if(no_bit >= TAILLE_TABLEAU_TRAME - 1) // Tableau rempli continuer = 0; // Mesure de la durée de l'état bas cpt = 0; while(!E_TUNER && continuer); { delay_ms(100); cpt++; if(cpt > 10) // Timeout de 1s continuer = 0; } no_bit++; if(no_bit >= TAILLE_TABLEAU_TRAME - 1) // Tableau rempli continuer = 0; // Si tableau rempli, la dernière valeur est 0, sinon la dernière valeur est le durée de l'état bas if(continuer) trame[no_bit] = 40; else trame[no_bit] = 0; } } void main() { unsigned char trame_recue[TAILLE_TABLEAU_TRAME]; CMCON = 7; // Pas de comparateur TRISA = 0x0; // Port A en entrée TRISB = 0xFF; // Port B en sortie OPTION_REG = 0b01000010; // Pull-up sur PORTB, prédiviseur par 8, front montant de Fosc/4 PORTA = 0; while(1) { if(E_TUNER) // Entrée du capteur du tuner à 1 { Recevoir_Trame_2(trame_recue); delay_ms(25); Debug_Boot_Pc(); Debug_S_Tuner(); Debug_Boot_Pc(); Afficher_Trame(trame_recue); } } }
Savez vous d'où le problème peut venir ?
Merci d'avance
-----