Thông báo

Collapse
No announcement yet.

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
 
  • Lọc
  • Giờ
  • Show
Clear All
new posts

  • 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

  • #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


    • #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


      • #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 PCMPCHPCD 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...
        X