Nhờ xem giúp code cho 12f629

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • hieu98dt
    Thành viên chính thức
    • Jun 2006
    • 59

    #1

    Nhờ xem giúp code cho 12f629

    Chào các bạn !

    Mình tự viết đoạn code cho Pic 12f629 để giải mã tín hiệu hồng ngoại của nút power remote. Code đã nhận đúng tín hiệu và đã chạy, nhưng có 1 lỗi mình ko thể khắc phục được như sau :

    Nhấn nút power lần 1 RA0 = 1 ( đúng như code đã viết )
    Nhấn nút power lần 2 RA1 = 1 ( đúng như code đã viết )
    Nhấn nút power lần 3 RA0 = 0, RA1 = 0 ( đúng như code đã viết )

    Nhưng đến đây thì ko thể điều khiển được nữa. Mình phải nhấn nút reset pic mới có thể điều khiển được.

    Các bạn xem giúp mình đoạn code có sai chỗ nào ko vậy. Code này mình viết đã chạy tốt trên pic 16f84a, mình đã chuyển code sang 12f629 thì bị lỗi như vậy. Mong các bạn giúp đỡ ! Dưới đây là code của mình.

    #include <12f629.h>
    #include <def_12f629.h>

    #fuses XT,NOWDT,NOPUT,NOPROTECT,NOCPD,NOMCLR

    #use delay(clock=4000000)

    unsigned char i,cmd;
    int8 a;
    void nhanma();

    void main()
    {
    Trisa0 = 0;
    Trisa1 = 0;
    Trisa2 = 1;
    RA0 = 0;
    RA1 = 0;
    RA2 = 1;
    a=0;
    while(1)
    {
    if(!input(pin_A2)) {nhanma();}
    }
    }

    void nhanma()
    {
    cmd=0;
    for(i=0;i<3;++i)
    {
    delay_us(750);
    if(input(pin_A2)) return; // thoat khoi vong lap
    }
    while(!input(pin_A2));
    for(i=0;i<7;++i)
    {
    cmd>>=1; // dich sang fai 1 bit
    while(input(pin_A2));
    delay_us(750);
    if(!input(pin_A2))
    {
    cmd|=0x80; // cmd = cmd|0x80 phep OR tung bit cmd voi 0x80(=10000000)
    while(!input(pin_A2));
    }
    }
    cmd>>=1; // dich sang fai 1 bit
    if(cmd==21) // 0x15 or 0010101 ( phim power )
    {
    a++;
    if(a==1) {RA0 = 1;RA1 = 0;} // nhan Power lan 1 RA0 = 1
    if(a==2) {RA0 = 0;RA1 = 1;} // nhan Power lan 2 RA1 = 1
    if(a==3) {RA0 = 0;RA1 = 0;} //
    }
    delay_ms(250);
    }
  • tdm
    Thành viên tích cực
    • Sep 2005
    • 349

    #2
    Nguyên văn bởi hieu98dt Xem bài viết
    Chào các bạn !

    Mình tự viết đoạn code cho Pic 12f629 để giải mã tín hiệu hồng ngoại của nút power remote. Code đã nhận đúng tín hiệu và đã chạy, nhưng có 1 lỗi mình ko thể khắc phục được như sau :

    Nhấn nút power lần 1 RA0 = 1 ( đúng như code đã viết )
    Nhấn nút power lần 2 RA1 = 1 ( đúng như code đã viết )
    Nhấn nút power lần 3 RA0 = 0, RA1 = 0 ( đúng như code đã viết )

    Nhưng đến đây thì ko thể điều khiển được nữa. Mình phải nhấn nút reset pic mới có thể điều khiển được.

    Các bạn xem giúp mình đoạn code có sai chỗ nào ko vậy. Code này mình viết đã chạy tốt trên pic 16f84a, mình đã chuyển code sang 12f629 thì bị lỗi như vậy. Mong các bạn giúp đỡ ! Dưới đây là code của mình.

    #include <12f629.h>
    #include <def_12f629.h>

    #fuses XT,NOWDT,NOPUT,NOPROTECT,NOCPD,NOMCLR

    #use delay(clock=4000000)

    unsigned char i,cmd;
    int8 a;
    void nhanma();

    void main()
    {
    Trisa0 = 0;
    Trisa1 = 0;
    Trisa2 = 1;
    RA0 = 0;
    RA1 = 0;
    RA2 = 1;
    a=0;
    while(1)
    {
    if(!input(pin_A2)) {nhanma();}
    }
    }

    void nhanma()
    {
    cmd=0;
    for(i=0;i<3;++i)
    {
    delay_us(750);
    if(input(pin_A2)) return; // thoat khoi vong lap
    }
    while(!input(pin_A2));
    for(i=0;i<7;++i)
    {
    cmd>>=1; // dich sang fai 1 bit
    while(input(pin_A2));
    delay_us(750);
    if(!input(pin_A2))
    {
    cmd|=0x80; // cmd = cmd|0x80 phep OR tung bit cmd voi 0x80(=10000000)
    while(!input(pin_A2));
    }
    }
    cmd>>=1; // dich sang fai 1 bit
    if(cmd==21) // 0x15 or 0010101 ( phim power )
    {
    a++;
    if(a==1) {RA0 = 1;RA1 = 0;} // nhan Power lan 1 RA0 = 1
    if(a==2) {RA0 = 0;RA1 = 1;} // nhan Power lan 2 RA1 = 1
    if(a==3) {RA0 = 0;RA1 = 0;} //
    }
    delay_ms(250);
    }
    Code:
    if(cmd==21) // 0x15 or 0010101 ( phim power )
    { 
    a++; 
    if(a==1) {RA0 = 1;RA1 = 0;} // nhan Power lan 1 RA0 = 1
    if(a==2) {RA0 = 0;RA1 = 1;} // nhan Power lan 2 RA1 = 1
    if(a==3) {RA0 = 0;RA1 = 0;[b]a=0;[/b]} // 
    }
    |

    Comment

    • duong_act
      Thành viên tích cực
      • Nov 2008
      • 4903

      #3
      2 cái "if" dưới đặt là "else if".

      Comment

      • hieu98dt
        Thành viên chính thức
        • Jun 2006
        • 59

        #4
        Cám ơn các bạn nhiều. Đúng người trong cuộc mù mắt, cứ nghĩ rằng code mình viết đúng rồi nên kiểm tra những cái cao siêu cứ tưởng config sai gì đó. đúng là thiếu a=0, code bên 16f84a thì đúng là có a = 0. Chân thành cám ơn !

        Comment

        Về tác giả

        Collapse

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

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

        Collapse

        There are no results that meet this criteria.

        Đang tải...