#include <16F877.h> #use delay(clock=16000000) #fuses XT, NOPUT, NOPROTECT, BROWNOUT,LVP, NOCPD, NOWRT,NOWDT #use rs232(baud=38400,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,errors) // // Décodage des télecommandes compatibles camé // Sortie du code sur le port rs232, necessite de cabler un max232 // Double détection du start bit pour éviter les parasites // ELECTRONIKA.FR/BLOG/ // // //cle du tableau int n_tab = 0; int i=0; //data en ram int tab[13] = {0,0,0,0,0,0,0,0,0,0,0,0,0}; int full=0; int start=0; //nombre de passage en timer0 int nb_timer=0; int16 code=0; #int_EXT void EXT_isr(void){ disable_interrupts(INT_EXT); start=1; } void main() { set_tris_b(0x01); port_b_pullups(TRUE);//resistance tirage à 5v ext_int_edge(0,L_TO_H);// interruption sur front montant enable_interrupts(INT_EXT);//valide interruption externe //setup_timer_0(RTCC_INTERNAL); //enable_interrupts(INT_TIMER0);//active timer0 enable_interrupts(GLOBAL); //visualise un reboot output_bit(PIN_C2,0); delay_ms(1000); output_bit(PIN_C2,1); delay_ms(1000); output_bit(PIN_C2,0); delay_ms(1000); output_bit(PIN_C2,1); delay_ms(1000); while(true){ if(start==1){ disable_interrupts(INT_EXT); n_tab=0; delay_us(294); if (input(PIN_B0)){//test l'état haut avant la fin du bit de start delay_us(10); delay_us(250); if (!input(PIN_B0)){ // test l'état bas aprés le bit de start delay_us(250); //stockage while(n_tab<12){ if (input(PIN_B0)){ tab[n_tab]=1; }else{tab[n_tab]=0; } delay_us(1000); //passe au bit suivant n_tab++; } full=1; start=0; } } } if ((full==1)){ disable_interrupts(INT_EXT); //decharger data sur rs232 code=0; for (i=0; i<12 ;i++){ //transforme en decimal if(tab[i]==1){code=code+1;} if(tab[i]==1){code=code+2;} if(tab[i]==1){code=code+4;} if(tab[i]==1){code=code+8;} if(tab[i]==1){code=code+16;} if(tab[i]==1){code=code+32;} if(tab[i]==1){code=code+64;} if(tab[i]==1){code=code+128;} if(tab[i]==1){code=code+256;} if(tab[i]==1){code=code+512;} if(tab[i]==1){code=code+1024;} if(tab[i]==1){code=code+2048;} } printf("%Lu",code); printf("end "); full=0; n_tab=0; start=0; //delay_ms(1000);//attendre 1secondes enable_interrupts(INT_EXT); } }//while }//main