Thông báo

Collapse
No announcement yet.

Đo độ rộng xung hồng ngoại bằng PIC 16F877a

Collapse
X
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • Đo độ rộng xung hồng ngoại bằng PIC 16F877a

    Vào thẳng vấn đề nhé. Mình có mạch như thế này
    Click image for larger version

Name:	Proteus.jpg
Views:	1
Size:	84.1 KB
ID:	1414403

    mình dự định dùng 1838 thu sóng từ chiếc remote, xung thu dc là xung đảo, đưa vào PIC 16F877a, dùng chức năng ccp bắt xung và đo độ rộng cả T on và T off lưu vào 1 biến mảng, khi hoàn thành sẽ có 1 led nhấp nháy 3 lần rồi xuất lần lượt ra 3 led 7 đoạn, mạch dùng thạch anh 20 MHz, đo dc từ 0.2 us -> 13 ms, trong mạch mình mô phỏng xung vào bằng 1 bộ phát 10 xung có T on=5ms, T off=2ms. Nhưng chưa thành công, mình code bằng CCS, các bác xem code giúp mình nhé


    Code:
    #include <main.h>
    #include <math.h>
    #include <def_877a.h>
    
    int16 on,off;     //on: T on, off: T off
    int8 count=0;     //bien dem xung (on: tang 1, off: tang 1, nghia la: moi chu ky xung tang 2) 
    int8 a[]={};      //mang chua gia tri do rong xung
    int8 const b[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};// ma led 7 doan 0-9
    
    
    void xuat7seg (int8 x, int8 y, int8 z) //ct con xuat 3 con so ra led 7 doan
    {
       int8 i;
       for(i=0;i<=25;i++)
       {
          PORTB=0b11111110;
          PORTD=b[z];
          delay_ms(13);
          PORTD=255;
          PORTB=0b11111101;
          PORTD=b[y];
          delay_ms(13);
          PORTD=255;
          PORTB=0b11111011;
          PORTD=b[x];
          delay_ms(13);
          PORTD=255;
       }
    }
    
    #int_TIMER1                   //khi xay ra ngat tmr1: xoa co ngat ->led o RA0 nhay 3 lan
    void  TIMER1_isr(void)        //->lan luot xuat cac gia tri da luu trong mang a ra
    {                             // theo thu tu, moi gia tri hien ra trong 1s
       tmr1if=0;                  //xuat lien tuc den khi gap ky tu "null" thi reset cpu
       int8 i,x,y,z;              //tiep tuc do tim xung
       RA0=1;
       delay_ms(500);
       RA0=0;
       delay_ms(500);
       RA0=1;
       delay_ms(500);
       RA0=0;
       delay_ms(500);
       RA0=1; 
       delay_ms(500);
       RA0=0;
       delay_ms(500);
       
       for(i=0;i!='\0';i++)
       {
          x=a[i]/100;
          y=(a[i]%100)/10;
          z=(a[i]%100)%10;
          xuat7seg(x,y,z);
       }
       reset_cpu();
    }
    
    #int_CCP1                  //ngat ccp1 do tim canh xuong (do T on)
    void  CCP1_isr(void)       //khi xay ra ngat:
    {
       ccp1if=0;               //xoa co ngat
       on=get_timer1();        //lay gia tri tu tmr1 (gia tri tu 0-65535)
       count++;                //tang bien dem
       a[count]=on/500;        //luu gia tri do, tmr1 tang 1dv sau 0.2us nen lay gia tri *0.2, /1000 ra ms, *10 de lay them 1 so thap phan sau dau ","
       set_timer1(0);          //reset tmr1 do T off
    }
    
    #int_CCP2                  //ngat ccp1 do tim canh len (do T off)
    void  CCP2_isr(void)       //cach do tuong tu nhu tren
    {
       ccp2if=0;
       off=get_timer1();
       count++;
       a[count]=off/500;
       set_timer1(0);
    }
    
    
    
    
    
    void main()
    {
    
       setup_adc_ports(NO_ANALOGS);
       setup_adc(ADC_CLOCK_DIV_2);
       setup_spi(SPI_SS_DISABLED);
       setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
       setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
       setup_timer_2(T2_DISABLED,0,1);
       setup_ccp1(CCP_CAPTURE_FE);
       setup_ccp2(CCP_CAPTURE_RE);
       setup_comparator(NC_NC_NC_NC);
       enable_interrupts(INT_TIMER1);
       enable_interrupts(INT_CCP1);
       enable_interrupts(INT_CCP2);
       enable_interrupts(GLOBAL);
    
       //TODO: User Code
       while(1)
       {
          TRISA0=0;
          RA0=0;
          TRISB=0;
          TRISD=0;
          PORTB=0xff;
          PORTD=0xff;
       }
    }
    http://www.mediafire.com/download.php?79tkzhtxhpxkuk0
    Last edited by giaanthunder; 28-09-2012, 13:22.

  • #2
    mọi ng vào xem thấy có j trục trặc dù nhỏ cũng để lại comment để mình sửa nhé. ct rất đơn giản chỉ có 3 ngắt và dùng CCP đo rộng xung thôi nên mình nghĩ chỉ sai cách sử dụng timer 1 thôi. mọi ng giúp tớ sửa hoàn chỉnh nhé, khi làm xong mình sẽ viết 1 tut đầy đủ về chủ đề này để mọi ng tham khảo

    Comment

    Về tác giả

    Collapse

    giaanthunder Tìm hiểu thêm về giaanthunder

    Bài viết mới nhất

    Collapse

    Đang tải...
    X