pyu Postat Februarie 21, 2009 Partajează Postat Februarie 21, 2009 Am o problema. Am pus un senzor IR pe pickit2, nu functioneaza bine deloc. Codul este urmatorul (pentru TSOP1738): // This is code for an IR remote control decoder // using the 12 bit SIRC protocol. Based on code // by Aurelian Nichita. // Hardware - TSOP1738 to GP2 of 12F675. Two LEDs // on GP4 and GP5 as indicators. // Sample signal at TSOP data output (taken using // PICKit2 as a logic analyzer): // // ??????\________/??\__/??\__/??\__/??\__/??\__/??\__/??\__/??\____/??\__/??\__/??\__/??\__/????? // (idle)| (start) | bit0| bit0| bit0|bit0| bit0| bit0| bit0| bit1 | bit0| bit0| bit0|bit0|(idle) // // example for remote button "1" // // TSOP data is inverted; it idles high. // [??\_ : negative going edge; _/?? : positive going edge] // // Rohit de Sa // 15Aug08 // v1.0 #include <16f887.h> #fuses INTRC_IO,NOWDT,NOCPD,NOPROTECT,PUT,NOMCLR,NOBROWNOUT #use delay(clock=4000000) #use fast_io(B) #zero_ram #include "Flex_LCD.c"#define one_min 1450 //no of counts to safely detect bit1 #define one_max 2200 //optimal @4 MHz is 1800 #define zero_min 600 //no of counts to safely detect bit0 #define zero_max 1440 //optimal @4 MHz is 1200 int16 irframes[14]; //holds incoming IR data int8 ircount =0; //counts no if bits received int1 irdone=false; //flag bit #int_timer1 //(is this isr necessary? I dont really know) void timer1_isr() { disable_interrupts(int_timer1); } #INT_RB //IR bits detected by edge triggering void ext_isr() { if(irdone) return; for(ircount=0;ircount<=13;ircount++) { irframes[ircount]=get_timer1(); } //irframes[ircount++]=get_timer1(); if(ircount>=13) //if 13 triggers(ie 12 bits+start) found irdone=true; //set "done" flag set_timer1(0); //restart timer for new bit enable_interrupts(int_timer1); //(is this necessary? I dont really know) } int1 decode_ir(int8 &addr,int8 &cmd) //IR decoding function { int8 i; int8 mask; int1 bits[12]; addr=0; cmd=0; irframes[13]=1200; //last bit is always zero for(i=2;i<=13;i++) { if((one_min<=irframes[i])&&(irframes[i]<=one_max)) bits[i-2]=0x01; //if the sampled signal lies within limits else //set to 1 if((zero_min<=irframes[i])&&(irframes[i]<=zero_max)) bits[i-2]=0x00; //if the sampled signal lies within limits else //set to 0 return false; //otherwise clear flag } mask=0x01; //format command for (i=0;i<=6;i++) { if (bits[i]) cmd=cmd|mask; mask<<=1; } mask=0x01; //format address for (i=7;i<=11;i++) { if(bits[i]) addr=addr|mask; mask<<=1; } return true; //set flag } void start_ir() { ircount=0; // memset(irframes,0x00,sizeof(irframes)); irdone=false; } void main() { int8 addr, cmd; int1 ok; delay_ms(100); //setting up PIC setup_adc_ports(no_analogs); setup_adc(adc_off); //set_tris_b(0b00000011); lcd_init(); delay_ms(100); //timer prescaler dependent on oscillator speed setup_timer_1(t1_internal|t1_div_by_1); ext_int_edge(0,h_to_l); enable_interrupts(INT_RB1); enable_interrupts(global); start_ir(); while(1) { if (irdone) { ok= decode_ir(addr,cmd); if(!ok) //if bad bits or out of synch, reset processor reset_cpu(); //(can I avoid this?) else { if (addr==1) { switch (cmd) { case (0x07)://Remote button "8" { output_high(pin_a5); output_low(pin_a4); break; } case (0x04)://Remote button "5" { output_high(pin_a4); output_low(pin_a5); break; } case (0x01)://Remote button "2" { output_high(pin_a5); output_high(pin_a4); break; } default: //any other button { output_a(0x00); break; } } } } start_ir(); } } } Senzorul este legat la pinul RB1 (la pickit2, B0 este deja legat la un buton, care il folosesc pentru altceva). In momentul cand apas o tasta, intra in functia asociata intreruperii pe pinul B1 (#INT_RB - ext_isr() ). Rezultatul este prezentat in imaginile de mai jos. Are cineva idee ce nu am facut bine? Link spre comentariu
pyu Postat Februarie 25, 2009 Autor Partajează Postat Februarie 25, 2009 Chiar nu s-a mai intalnit cineva cu problema asta? Am reusit sa reduc timpii aia, dar dupa cum vedeti in img de mai jos, elementul [2] din vector e pe departe a fi cuprins intre 600 si 2200. Link spre comentariu
pyu Postat Martie 10, 2009 Autor Partajează Postat Martie 10, 2009 Anyone?Nu a facut nimeni un receptor ir cu pic?O idee, un sfat ceva? Link spre comentariu
Postări Recomandate
Creează un cont sau autentifică-te pentru a adăuga comentariu
Trebuie să fi un membru pentru a putea lăsa un comentariu.
Creează un cont
Înregistrează-te pentru un nou cont în comunitatea nostră. Este simplu!
Înregistrează un nou contAutentificare
Ai deja un cont? Autentifică-te aici.
Autentifică-te acum