Sari la conținut
ELFORUM - Forumul electronistilor

TSOP 1740 & pic 16F887


pyu

Postări Recomandate

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
  • Răspunsuri 2
  • Creat
  • Ultimul Răspuns

Top autori în acest subiect

  • pyu

    3

Top autori în acest subiect

  • pyu

    pyu 3 postări

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.

 

Posted Image

Posted Image

Link spre comentariu
  • 2 săptămâni mai târziu...

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 cont

Autentificare

Ai deja un cont? Autentifică-te aici.

Autentifică-te acum



×
×
  • Creează nouă...

Informații Importante

Am plasat cookie-uri pe dispozitivul tău pentru a îmbunătății navigarea pe acest site. Poți modifica setările cookie, altfel considerăm că ești de acord să continui.Termeni de Utilizare si Ghidări