Thông báo

Collapse
No announcement yet.

cac bac oi giup dzùm mình cái hàm ngắt rs232 nhan chuoi ki tu trong 16f877a

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

  • cac bac oi giup dzùm mình cái hàm ngắt rs232 nhan chuoi ki tu trong 16f877a

    minh dung ham ngat rs232 , nhưng mún cho nó nhận cả chuỗi kí tự lun, phải viết thế nào đây, mình dùng pic16f877a.
    các bác giúp với.

    #int_rda
    {
    ////////////////
    }
    ....
    while(1)
    {
    getc();
    .....
    yahu: kevinloc90

  • #2
    Thì đơn giản làm 1 cái mảng mà lưu vào .... ví dụ store[20] ....
    for(i=0........ i++ ) ... store[i]= gét bla bla
    Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

    Comment


    • #3
      queduong cho minh hỏi là khi nhận dc chuỗi kí tự thì nó sẽ nhảy vào hàm ngắt và làm việc đến khi nào không còn kí tự để nhận nữa phải không, hay là nhận đc 1 kí tự rùi văn ra, sao đó nhảy vào tiếp vì còn kí tự để nhận nữa, mình đinh xử lý trong hàm ngắt này lun, nhưng chưa hỉu lắm.
      vd:
      #int_rda
      {
      //
      so sánh chuỗi nhận dc với string[]="kevin" , nếu giống nhau thì cho portb sáng.
      }
      ....
      while(1)
      {
      getc();
      .....
      }



      mình mô phỏng proteus hàm ngắt như thế này thấy cũng dc, nhưng dc một lúc thì bị đơ.
      #int_rda
      {
      nhan[i]=getc();
      i++;
      }
      ....
      ....
      while(1)
      {
      getc();
      ...
      }
      yahu: kevinloc90

      Comment


      • #4
        Nguyên văn bởi kevin_loc Xem bài viết
        queduong cho minh hỏi là khi nhận dc chuỗi kí tự thì nó sẽ nhảy vào hàm ngắt và làm việc đến khi nào không còn kí tự để nhận nữa phải không, hay là nhận đc 1 kí tự rùi văn ra, sao đó nhảy vào tiếp vì còn kí tự để nhận nữa, mình đinh xử lý trong hàm ngắt này lun, nhưng chưa hỉu lắm.
        vd:
        #int_rda
        {
        //
        so sánh chuỗi nhận dc với string[]="kevin" , nếu giống nhau thì cho portb sáng.
        }
        ....
        while(1)
        {
        getc();
        .....
        }



        mình mô phỏng proteus hàm ngắt như thế này thấy cũng dc, nhưng dc một lúc thì bị đơ.
        #int_rda
        {
        nhan[i]=getc();
        i++;
        }
        ....
        ....
        while(1)
        {
        getc();
        ...
        }
        Nếu nhận được ký tự ... mà muốn nhận hết cả chuỗi rồi sau đó mới làm công việc khác thì disable ngắt đi ... sau khi làm xong ( nhận đủ số kí tự ) thì lại enable nó lại !
        Module RF chuyên dụng điều khiển, truyền dữ liệu, thiết kế đề tài, dự án điện tử - chuyển giao công nghệ... ĐT: 0904964977 - email: dientuqueduong@yahoo.com

        Comment


        • #5
          mọi ng ơi, giúp mình với. mình học sp nhưng có học sơ qua về điện tử. giúo mình trả lời câu hỏi này nhé : vai trò của IC 555 trong mạchđiều chế tần số , vai trò của các biến áp tai đầu vào của Diode trong mạch điều chế biên độ. thanhk nha

          Comment


          • #6
            Cái này chỉ là ngắt nhận dữ liệu thôi . Cái này bạn nên đọc về asm cái đi đã . Vấn đề nhận dữ liệu trên pic bạn cần quan tâm thanh ghi rsr và các bít cho phép nhận dữ liệu cren va bít cho phép ngắt nhận dữ liệu rcif và bít báo tràn dữ liệu ,bit phát hien dc bit stop của dữ liệu đưa vào và thanh ghi rcreg .quá trình nhận dữ liệu như sao :
            + thiết lập tốc độ baud lưu ý tốc độ bên nhận và bên gửi phải giống nhau nhé
            + xóa bít sync va set bit spen để chọn giao tiếp bất đồng bộ
            + set bít rcie để cho phép ngắt nhận
            + set bit rx9 để nhận dữ liệu 9 bit
            + cái nảy rất quan trọng sét bit cren đễ có thể nhận dữ liệu từ bộ dệm đưa vào thanh ghi rsr sau khi phát hiện dc bit stop đưa vào rsr thì lúc này dữ liệu dc đẫy xuông thanh ghi rcreg thì lúc này cờ ngắt nhận sẻ duoc bật là rcif và nếu bít toàn cục dc set thì tức là xảy ra ngắt nhận . Tức nói tóm lại nếu pic nhận dc môt ký tự sẻ xảy ra ngắt một lần và tư dông xóa bộ đệm sao mổi lần ngắt để cho phép lưu ký tự mới.
            Thật ra mục dích của hàm ngắt nhận giúp chúng ta nhận biết đuoc ky tự đến khi nào và củng có thể dể dàng kiểm tra dc ký tự cuối cùng của một chuồi ký tự dc truyền xuống . Mổi lần ngắt bạn dùng lệnh getc(); getchar();... để dọc dữ liệu đó để hiện ra cái gì đó .còn nếu là chuổi thì mỗi lần nhận dc một ký tự thì kiểm tra xem ký tự cuối củng của chuổi truyền xuống chưa nếu chưa thì ta lưu nó vào mảng nào đó lưu ý ở đây phải dụng mảng động nhé ví dụ
            #define index 32
            char mang[index]; // mảng kỷ tự
            nếu nhận dc ký tự cuối cùng thì đọc dữ liệu trong mảng để hiển thị cái gì đó nhé . Nhớ xóa mảng để nhận ký tự mới.

            Comment


            • #7
              Mấy bạn cho mình hỏi ngắt RS232 như thế này đúng chưa mà sao hki chạy mô phỏng nó chẳng chịu nhảy vào ngắtClick image for larger version

Name:	Untitled.jpg
Views:	1
Size:	120.3 KB
ID:	1376988
              Đây là mô phỏng..mình dùng matlab giao tiếp máy tính

              #include <16f877A.h>
              #include <defs_16f877A.h>
              #fuses HS,NOLVP,NOWDT
              #use delay(clock=12000000)
              #use rs232(baud=9600,Parity=N,Stop=1,xmit=pin_C6,rcv=pi n_C7)
              //#use fast_io(B)
              //#use fast_io(D)

              char value;
              int t;

              #INT_RDA
              void RS232()
              {
              if(kbhit())
              {
              value=getc();
              rd0=0;
              }
              if(value=='x')
              t=1;
              if(value=='v')
              t=2;
              if(value=='d')
              t=3;



              }

              void main()
              {

              enable_interrupts(GLOBAL);
              enable_interrupts(INT_RDA);
              SET_TRIS_C( 0xff );
              set_tris_D(0x00);
              while(1)
              {



              if(t=1)
              {
              output_low(pin_D0);
              output_high(pin_D1);
              output_high(pin_D2);
              //putc('a');
              delay_ms(1000);
              //output_high(pin_D0);
              }

              if(t=2)
              {
              output_low(pin_D1);
              output_high(pin_D0);
              output_high(pin_D2);
              delay_ms(1000);
              }



              if(t=3)
              {
              output_low(pin_D2);
              output_high(pin_D1);
              output_high(pin_D0);
              delay_ms(1000);
              }
              }
              }

              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