ban nào giải thích dzùm mình code này với, mình 16f877a, giao tiếp rs232

Collapse
X
 
  • Giờ
  • Show
Clear All
new posts
  • kevin_loc
    Thành viên mới
    • Apr 2011
    • 13

    #1

    ban nào giải thích dzùm mình code này với, mình 16f877a, giao tiếp rs232

    file ex_sisr.c, cái này sử dụng hàm ngắt rs232 mà mình không hỉu,

    #if defined(__PCM__)
    #include <16F877.h>
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    #use delay(clock=20000000)
    #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

    #elif defined(__PCH__)
    #include <18F452.h>
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    #use delay(clock=20000000)
    #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

    #elif defined(__PCD__)
    #include <30F2010.h>
    #fuses HS, NOWDT, NOPROTECT
    #use delay(clock=20000000)
    #use rs232(baud=9600, UART1A)
    #endif


    #define BUFFER_SIZE 32
    BYTE buffer[BUFFER_SIZE];
    BYTE next_in = 0;
    BYTE next_out = 0;


    #int_rda
    void serial_isr() {
    int t;

    buffer[next_in]=getc();
    t=next_in;
    next_in=(next_in+1) % BUFFER_SIZE;
    if(next_in==next_out)
    next_in=t; // Buffer full !!
    }

    #define bkbhit (next_in!=next_out)

    BYTE bgetc() {
    BYTE c;

    while(!bkbhit) ;
    c=buffer[next_out];
    next_out=(next_out+1) % BUFFER_SIZE;
    return(c);
    }

    void main() {

    enable_interrupts(int_rda);
    #if defined(__PCD__)
    enable_interrupts(intr_global);
    #else
    enable_interrupts(global);
    #endif

    printf("\r\n\Running...\r\n");

    // The program will delay for 10 seconds and then display
    // any data that came in during the 10 second delay

    do {
    delay_ms(10000);
    printf("\r\nBuffered data => ");
    while(bkbhit)
    putc( bgetc() );
    } while (TRUE);
    }
    yahu: kevinloc90
  • nguyende89
    Thành viên mới
    • May 2011
    • 9

    #2
    Nguyên văn bởi kevin_loc Xem bài viết
    file ex_sisr.c, cái này sử dụng hàm ngắt rs232 mà mình không hỉu,

    #if defined(__PCM__)
    #include <16F877.h>
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    #use delay(clock=20000000)
    #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

    #elif defined(__PCH__)
    #include <18F452.h>
    #fuses HS,NOWDT,NOPROTECT,NOLVP
    #use delay(clock=20000000)
    #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)

    #elif defined(__PCD__)
    #include <30F2010.h>
    #fuses HS, NOWDT, NOPROTECT
    #use delay(clock=20000000)
    #use rs232(baud=9600, UART1A)
    #endif


    #define BUFFER_SIZE 32
    BYTE buffer[BUFFER_SIZE];
    BYTE next_in = 0;
    BYTE next_out = 0;


    #int_rda
    void serial_isr() {
    int t;

    buffer[next_in]=getc();
    t=next_in;
    next_in=(next_in+1) % BUFFER_SIZE;
    if(next_in==next_out)
    next_in=t; // Buffer full !!
    }

    #define bkbhit (next_in!=next_out)

    BYTE bgetc() {
    BYTE c;

    while(!bkbhit) ;
    c=buffer[next_out];
    next_out=(next_out+1) % BUFFER_SIZE;
    return(c);
    }

    void main() {

    enable_interrupts(int_rda);
    #if defined(__PCD__)
    enable_interrupts(intr_global);
    #else
    enable_interrupts(global);
    #endif

    printf("\r\n\Running...\r\n");

    // The program will delay for 10 seconds and then display
    // any data that came in during the 10 second delay

    do {
    delay_ms(10000);
    printf("\r\nBuffered data => ");
    while(bkbhit)
    putc( bgetc() );
    } while (TRUE);
    }
    Bạn k hiểu chỗ nào trong đoạn code trên bạn nói rõ thì mới có thể giúp bạn được chứ

    Comment

    • kevin_loc
      Thành viên mới
      • Apr 2011
      • 13

      #3
      mình không hỉu PCM, PCH, PCD là gì.
      trong c định nghĩa byte là "#byte" mà sao cái này khác:
      BYTE buffer[BUFFER_SIZE];
      BYTE next_in = 0;
      BYTE next_out = 0;
      .....


      mình không hỉu hàm ngắt nhận:
      #int_rda
      void serial_isr() {
      int t;

      buffer[next_in]=getc();
      t=next_in;
      next_in=(next_in+1) % BUFFER_SIZE;
      if(next_in==next_out)
      next_in=t; // Buffer full !!
      }
      .....


      mình ko hỉu lệnh kbhit() là gì.
      while(!bkbhit) ; // là khi nào, tại sao lại có dấu ' ; ' ở cuối như vậy nghĩa là gì.
      while(bkbhit) // là khi nào

      mình không hỉu đoạn code này:


      #define bkbhit (next_in!=next_out)

      BYTE bgetc() {
      BYTE c;

      while(!bkbhit) ;
      c=buffer[next_out];
      next_out=(next_out+1) % BUFFER_SIZE;
      return(c);
      }
      yahu: kevinloc90

      Comment

      • vagabondtt
        Thành viên chính thức
        • Jan 2009
        • 56

        #4
        Mình trả lời trong tầm hiểu biết thôi nhé .bạn phải kiểm chứng lại để tránh sai sót.

        PHP Code:
        mình không hỉu PCM, PCH, PCD là gì. 
        
        +PCM, PCH, PCD lần lượt là version của trình biên dịch, tương ứng với version nào thì nó include header file tương ứng.

        PHP Code:
        trong c định nghĩa byte là "#byte" mà sao cái này khác:
        BYTE buffer[BUFFER_SIZE];
        BYTE next_in = 0;
        BYTE next_out = 0; 
        
        Theo mình thì nó không khác nhau, có thể nó có 1 định nghĩa #define BYTE bằng 1 số 8 bit nằm ở đâu đó trong header file.

        PHP Code:
        #int_rda
        void serial_isr() {
        int t;
        
        buffer[next_in]=getc();
        t=next_in;
        next_in=(next_in+1) % BUFFER_SIZE;
        if(next_in==next_out)
        next_in=t; // Buffer full !!
        } 
        
        hàm ngắt này xảy ra khi nhận dữ liệu, dữ liệu được nhận đem bỏ vào buffer để chờ được xử lý, nếu đầy thì bào full, buffer ở đây là cái mảng BYTE bạn định nghĩa ở trên.
        PHP Code:
        mình ko hỉu lệnh kbhit() là gì. 
        
        Đơn giản là nhận 1 ký tự thì bằng 0 và bình thường trả về 1( keyboard hit, đoán vậy ).
        PHP Code:
        mình ko hỉu lệnh kbhit() là gì.
        while(!bkbhit) ; // là khi nào, tại sao lại có dấu ' ; ' ở cuối như vậy nghĩa là gì.
        while(bkbhit) // là khi nào 
        
        #define bkbhit (next_in!=next_out) , câu này chỉ trả lời vậy, đọc lại cái mà bạn đã định nghĩa.

        PHP Code:
        mình không hỉu đoạn code này:
        
        
        #define bkbhit (next_in!=next_out)
        
        BYTE bgetc() {
        BYTE c;
        
        while(!bkbhit) ;
        c=buffer[next_out];
        next_out=(next_out+1) % BUFFER_SIZE;
        return(c);
        } 
        
        Hàm này có tác dụng khá giống hàm ngắt nhận dữ liệu phía trên nhưng dở hơn, nó nhận bằng vòng lặp, không khuyến khích kiểu này.


        Đọc hiểu code + debug là cái hấp dẫn nhất khi lập trình, bạn nên chịu khó 1 chút
        Email:
        Skype: thanhtruong0315

        Comment

        Về tác giả

        Collapse

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

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

        Collapse

        Đang tải...