RP Store Tìm linh kiện theo mã, gửi BOM nhận báo giá Gửi BOM

Ngắt onchange RB với PIC16F877A

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts

  • duong_act
    replied
    Đây là 1 đoạn chương trình mình viết bằng CCS với chức năng đếm số lần ấn nút rồi hiển thị ra PORTD:
    Code:
    #include <16F877A.h>
    #fuses hs
    #ocs 20M
    
    int m=0;
    
    #int_rb
    void rb_isr(int temp)
    {
       temp=input_b();   // Doc PORTB
       if(input(PIN_B5)==1){    // Nut duoc nhan se co muc LOGIC la 1.
       m++;
       output_d(m);}
    }
    
    void main()
    {
       enable_interrupts(global);
       enable_interrupts(int_rb);
       set_tris_b(0xF0);
       set_tris_d(0x00);
       output_d(0x00);
       while(true)
       {
       }
    }

    Leave a comment:


  • ksclc07i
    replied
    Bạn xem file này nhé, mình mô phỏng và chạy thật rội
    rb.rar

    Leave a comment:


  • hoang_3i
    replied
    Nguyên văn bởi exellence Xem bài viết
    mình đã thử chống rung rồi vẫn ko dc. nó bị chết trong chương trình ngắt ko thoát ra dc
    1.Bệnh này không phải do rung. Giả sử có rung thì rung 1 lúc rồi cũng phải thoát ra khỏi ngắt chứ đúng không?.

    2. chương trình của bạn chết dí trong ngắt -> hãy đặt câu hỏi tại sao?. chỉ có 1 lý do duy nhất đó là luôn có sự thay đổi trên 1 trong các chân từ RB4 -> RB7.

    3. thuốc chữa rất đơn giản là trên các chân từ RB4 -> RB7 bạn hãy nối 1 con trở 10K với dương nguồn, hoặc nối xuống đất.

    Leave a comment:


  • tan955
    replied
    còn trong ngắt thì nên như này
    void ngat_RB()
    {
    static int8 test;
    output_e(test++);

    }

    Leave a comment:


  • tan955
    replied
    sao lại xóa cờ ngắt vì mấy cái ngắt cứng nó tự xóa mà ! bạn xóa hết những lệnh tào lao trong ngắt xem sao
    còn nữa
    while(1)
    {
    output_e(0b000);
    }
    bạn luôn xóa Porte mà ;
    nên như thế lày xem
    output_e(0b000);
    while(1)
    {

    }

    Leave a comment:


  • exellence
    replied
    mình đã thử chống rung rồi vẫn ko dc. nó bị chết trong chương trình ngắt ko thoát ra dc

    Leave a comment:


  • minh_cly
    replied
    Một nút bấm khi bạn bấm ko phải là tạo ra 1 xung, có thể tạo ra hàng chục xung vì nút nhấn khi nhấn xuống cũng ko phải tiếp xúc hoàn toàn, nó cũg gồ ghề, lồi lõm, có lúc dẫn có lúc ko (nhưng phần lớn là dẫn), nên phải phải chống rung nữa, chỉ khi ngắt RB của bạn nối vs các lk điện tử ko phải là nút nhấn thì lúc đó ngắt RB mới chíng xác.

    Leave a comment:


  • exellence
    replied
    Nguyên văn bởi e_fan Xem bài viết
    Bạn lấy đầu vào ngắt qua 1 phím bấm nhưng không có phần xử lý chống rung cho phím,search trên forum về cách xử lý chống rung cho phím bấm nhá.
    m nghĩ đây là ngắt cứng chứ ko phải ngắt mềm nên ko cần chống rung phím

    Leave a comment:


  • exellence
    replied
    Nguyên văn bởi duong_act Xem bài viết
    Bạn nên đọc PORTB khi có ngắt.
    e không hiểu. đọc đề làm gì hả a. a nó rõ hơn dc ko

    Leave a comment:


  • duong_act
    replied
    Bạn nên đọc PORTB khi có ngắt.

    Leave a comment:


  • ksclc07i
    replied
    Bạn thử code này xem
    Code:
    #use delay(clock=20000000)
    #use rs232(baud=115200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8)
    #include <def_877A.h>
    
    /*** Khai bao cac ngat ***/
    //Ngat Ngoai - RB0
    #int_EXT
    void EXT_isr(void) 
    {
    
    }
    //Ngat RB - Ngat tu ban phim 
    #int_RB
    void RB_isr(void) 
    {
       if(!rb4) //Chan RB4
       {
    
          return;
       }
       if(!rb5)//RB5
       {
    
          return;
       }
       if(!rb6)//RB6
       {
    
          return;
       }
       if(!rb7)//RB7
       {
    
       }
    }
    
    
    /*** Chuong trinh chinh ***/
    //Chuong trinh khoi tao
    void init(void)
    {
       
       EXT_INT_EDGE(H_TO_L);      //Ngat ngoai khi co suon xuong
       enable_interrupts(INT_RB); //Cho phep ngat RB4:RB7
       enable_interrupts(INT_EXT);//Cho phep ngat ngoai RB0
       enable_interrupts(GLOBAL); //Cho phep ngat
    }
    
    /*** Khai bao chuong trinh con ***/
    void main()
    {     
       init();
       while(true)
       { 
        
       }
    }

    Leave a comment:


  • e_fan
    replied
    Bạn lấy đầu vào ngắt qua 1 phím bấm nhưng không có phần xử lý chống rung cho phím,search trên forum về cách xử lý chống rung cho phím bấm nhá.

    Leave a comment:


  • sang_dientu
    replied
    Nguyên văn bởi exellence Xem bài viết
    E làm ngắt Rb bằng con Pic16f877a thì nó bị ngắt liên tục mặc dù đã xóa cờ ngắt, cứ ấn nút cái là nó xảy ra ngắt liên tục, ko hiểu cách khắc phục kiều gì. theo e là chip nó ngắt liên tục do nó thầy RB có sự thay đổi liên tục. các bác giúp em với

    Code:
    #include <16f877A.h>
    #device *= 16  ADC = 8
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #byte intcon=0x000B
    #bit RBIF=intcon.0 //dinh nghia co ngat RB
    #bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    #use delay(clock=20000000)
    #INT_RB
    void ngat_RB()
    {
    if((RBIF)&&(RBIE)) 
    {
    output_e(0b001);
    output_e(0b101);
    }
    RBIF=0;
    }
    
    void main() 
    { 
    SET_TRIS_B(0b11111111);
    SET_TRIS_A(0b111111);
    SET_TRIS_E(0b000);
    enable_interrupts(GLOBAL);
    enable_interrupts(INT_RB|H_TO_L);
    while(1) 
       {
       output_e(0b000);
       }
    }
    bạn nên cho nó chống rung nữa

    Leave a comment:


  • exellence
    started a topic Ngắt onchange RB với PIC16F877A

    Ngắt onchange RB với PIC16F877A

    E làm ngắt Rb bằng con Pic16f877a thì nó bị ngắt liên tục mặc dù đã xóa cờ ngắt, cứ ấn nút cái là nó xảy ra ngắt liên tục, ko hiểu cách khắc phục kiều gì. theo e là chip nó ngắt liên tục do nó thầy RB có sự thay đổi liên tục. các bác giúp em với

    Code:
    #include <16f877A.h>
    #device *= 16  ADC = 8
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #byte intcon=0x000B
    #bit RBIF=intcon.0 //dinh nghia co ngat RB
    #bit RBIE=intcon.3 //dinh nghia bit cho phep ngat RB
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    #use delay(clock=20000000)
    #INT_RB
    void ngat_RB()
    {
    if((RBIF)&&(RBIE)) 
    {
    output_e(0b001);
    output_e(0b101);
    }
    RBIF=0;
    }
    
    void main() 
    { 
    SET_TRIS_B(0b11111111);
    SET_TRIS_A(0b111111);
    SET_TRIS_E(0b000);
    enable_interrupts(GLOBAL);
    enable_interrupts(INT_RB|H_TO_L);
    while(1) 
       {
       output_e(0b000);
       }
    }

Về tác giả

Collapse

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

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

Collapse

Đang tải...