Thông báo

Collapse
No announcement yet.

hỏi về mạch thu rf bằng module 315Mhz

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

  • #16
    Sync bit có tổng là 128a, bao gồm 4a cao và 124a thấp, nếu chia đều ra 32 phần bằng nhau ( mỗi phần 4a) thì xung cao chiếm 1 phần và thấp chiếm 31 phần ( tổng cộng là 32) . Nếu bắt được xung cao và tiếp theo là 31 thấp thì đó chính là sync bit. Và đương nhiên giá trị ( thời gian ) của xung cao đó chính là 4anpha ( trong datasheet người ta vẽ Xung và clock đó ).
    Cách bắt xung, đếm thời gian thì đơn giản dùng vòng lặp và loại trừ cũng được : Chẳng hạn ( bắt xung ở chân RA1)


    capture_sync :
    while(!RA1); // đợi chân A1 lên mức cao ( để bắt xung cao )
    timer1_value=0; // reset bộ đếm thời gian .... lúc này bộ đếm thời gian bắt đầu đếm timer1_value từ 0 ---> n
    while(RA1); // đợi hết xung cao
    xung_cao = timer1_value; // timer1_value là giá trị trong thanh ghi, đếm thời gian
    timer1_value=0; // reset bộ đếm thời gian .... lúc này bộ đếm thời gian bắt đầu đếm timer1_value từ 0 ---> n
    while(!RA1); // Đợi đến hết xung thấp
    xung_thap = timer1_value;

    // kiểm tra
    if((xung_thap>xung_cao*30)&&(xung_thap<xung_cao*32 )) // nghĩa là tương đương cái xung thấp nó = 31 phần còn xung cao = 1phần
    {
    - nhận được sync_bit
    - giá trị 1 xung cao ( hay 4a ( trong datasheet pt2262 )) = xung_cao;
    }

    else ////// Không nhận được sync
    go to capture_sync; // quay lại và tiếp tục tìm kiếm sync


    Khi đã biết giá trị 4a ( lấy ví dụ đếm được 500us ) ta dễ dàng kiểm tra những bit thu nhận là 1 ( 4a cao - 12a thấp - 4a cao - 12a thấp ) hay 0 ( 12a cao - 4a thấp - 12a cao - 4a thấp ) hay là f ( floating ) : 4a cao - 12a thấp - 12a cao - 4a thấp .
    Những cái này trong datasheet của PT2262 người ta vẽ Xung và chú thích đầy đủ rồ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


    • #17
      vậy dùng 1 con ATtiny13 8 port chắc được rồi hả anh? mà timer của nó không có ngắt khi đếm đến giá trị định trước (CTC) vậy có thể đếm được từ 0 đến 4a ko?

      Comment


      • #18
        Nguyên văn bởi angelhades Xem bài viết
        vậy dùng 1 con ATtiny13 8 port chắc được rồi hả anh? mà timer của nó không có ngắt khi đếm đến giá trị định trước (CTC) vậy có thể đếm được từ 0 đến 4a ko?
        Vấn đề là bạn dùng timer nào với tần số ( thạnh anh - hay dao động là bao nhiêu ? ) ... chẳng hạn khi bạn dùng dao động ( clock ) là 1Mhz ( tức là 1 xung lệnh sẽ mất 1us ... nếu sử dụng timer0 sẽ chỉ đếm được tối đa 0 --> 255us . Timer1 sẽ đếm tận 65535us. Nếu dùng 1Mhz mà sử dụng bộ chia 2 của timer ( TCCR0 ) thì Timer0 sẽ đếm tối đa là 255 x 2 us.
        Do đó set bộ chia của timer0 hay timer1 ( nếu sử dụng timer1) bạn có thể thoải mái đếm đến hàng nghìn ms ( miligiây ) mà chẳng cần dùng đến ngắt.

        Và một điều quan trọng nữa ... viết code thì phải đủ chỗ chứa ... con attiny bộ nhớ rất nhỏ, giá thành cao ... sao không dùng những con có bộ nhớ lớn hơn mà giá cũng không cao hơn ... để viết có thoải mái hơn không ?
        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


        • #19
          Nguyên văn bởi queduong Xem bài viết

          Vấn đề là bạn dùng timer nào với tần số ( thạnh anh - hay dao động là bao nhiêu ? ) ... chẳng hạn khi bạn dùng dao động ( clock ) là 1Mhz ( tức là 1 xung lệnh sẽ mất 1us ... nếu sử dụng timer0 sẽ chỉ đếm được tối đa 0 --> 255us . Timer1 sẽ đếm tận 65535us. Nếu dùng 1Mhz mà sử dụng bộ chia 2 của timer ( TCCR0 ) thì Timer0 sẽ đếm tối đa là 255 x 2 us.
          Do đó set bộ chia của timer0 hay timer1 ( nếu sử dụng timer1) bạn có thể thoải mái đếm đến hàng nghìn ms ( miligiây ) mà chẳng cần dùng đến ngắt.

          Và một điều quan trọng nữa ... viết code thì phải đủ chỗ chứa ... con attiny bộ nhớ rất nhỏ, giá thành cao ... sao không dùng những con có bộ nhớ lớn hơn mà giá cũng không cao hơn ... để viết có thoải mái hơn không ?
          à thật ra em chỉ biết viết avr thôi nên nếu ko dùng attiny thì có lẽ em xài atmega8 thôi! cái em hỏi ở trên là khi biết 4a thì e dùng vòng for để lưu giá trị của các bit tiếp theo sao khi nhận sync bit như thế này:
          buffcurrent=96;
          unsigned int a[96];
          for(buffcurrent=0;buffcurrent<buffcounter;buffcurr ent++)
          {a[buffcurrent]=RA1;
          time1_value=0; //cho timer dem den n=4a
          }
          a thấy có được không.
          nhưng mà nếu ko dùng chế độ đếm đến giá trị chỉ định trong thanh ghi (CTC) thì timer nó đếm đến hết luôn là TOP luôn chứ ko đến giá trị cần ( là 4a)

          Comment


          • #20
            anh chị nào biết chỉ em với...em đang làm mạch đếm 65 về 05 dùng 74192 mà em không biết làm sao để hạn chế số 05 cả..a/c nào pit chỉ em với

            Comment


            • #21
              Nguyên văn bởi HUYDTCNk38 Xem bài viết
              anh chị nào biết chỉ em với...em đang làm mạch đếm 65 về 05 dùng 74192 mà em không biết làm sao để hạn chế số 05 cả..a/c nào pit chỉ em với
              bạn có thể dùng chức năng CTC mode trong timer1 của con atmega8 để đặt giá trị cho thanh ghi ORC1. timer sẽ đếm từ 0->ORC1

              Comment


              • #22
                Nguyên văn bởi angelhades Xem bài viết
                bạn có thể dùng chức năng CTC mode trong timer1 của con atmega8 để đặt giá trị cho thanh ghi ORC1. timer sẽ đếm từ 0->ORC1
                không dùng codevision anh ơi..chỉ là làm mạch kĩ thuật số thôi a...mà em ko pit cách hạn chế về số 05..em dặt dc số 65 rồi..từ 65 vè 05 ak.

                Comment


                • #23
                  Nguyên văn bởi angelhades Xem bài viết

                  à thật ra em chỉ biết viết avr thôi nên nếu ko dùng attiny thì có lẽ em xài atmega8 thôi! cái em hỏi ở trên là khi biết 4a thì e dùng vòng for để lưu giá trị của các bit tiếp theo sao khi nhận sync bit như thế này:
                  buffcurrent=96;
                  unsigned int a[96];
                  for(buffcurrent=0;buffcurrent<buffcounter;buffcurr ent++)
                  {a[buffcurrent]=RA1;
                  time1_value=0; //cho timer dem den n=4a
                  }
                  a thấy có được không.
                  nhưng mà nếu ko dùng chế độ đếm đến giá trị chỉ định trong thanh ghi (CTC) thì timer nó đếm đến hết luôn là TOP luôn chứ ko đến giá trị cần ( là 4a)
                  Timer nó đếm tự động khi bạn cho phép nó chạy ... với timer0 nó sẽ đếm từ 0 đến 255 rồi lại quay về 0, với timer1 sẽ đếm từ 0 đến 65535

                  và nó chẳng liên quan gì đến giá trị TOP . Mặc định đặt giá trị TOP là cao nhất ( 255 với timer0 ), 65535 với timer1.

                  Bài #16 đã nói rõ rồi.

                  Chẳng hạn cách tìm sync dùng dao động nội 8Mhz

                  Code:
                   seek:
                   sync_detect=0;
                   TCCR1B =0x02;    //  set bộ chia timer1 / 8  ===> 1us = 1 count ... timer1 max 65535 ===> Max sẽ đếm được 65,535ms    ( thừa sức 15ms )
                  
                   while(!RX);   //  Đợi chân RX  ( chân gắn module thu RF lên cao )
                   #asm("wdr");       // clear watchdog
                    TCNT1 =0;         // Reset thanh ghi timer1 về 0  ( để tí nữa timer1 tự đếm được bao nhiêu thì biết là cái xung đó có giá trị là bao nhiêu us )
                     while(RX);        // Đợi chân RX lên mức cao.  Hết lệnh này timer1 đã đếm được  Xung cao có giá trị là bao nhiêu us
                     #asm("cli");
                     xung_cao = TCNT1;    // lấy xung cao từ thanh ghi timer1
                     TCNT1=0;                  // Lấy xong rồi thì Reset về 0
                     #asm("sei");
                     while(!RX)
                     #asm("cli");
                     xung_thap = TCNT1;
                     TCNT1=0;
                     #asm("sei");
                  
                  /////////////////////////////////////////// kiểm tra xem có phải là sync bit không //////////////////////
                   if(xung_thap>xung_cao)
                    {
                     if((xung_thap/xung_cao>30) && (xung_thap/xung_cao<32))
                       {
                        sync_detect=1;                   // Nhận được sync bit
                        thoigian_4a = xung_cao;
                  
                      }
                       else goto seek;                    // Không phải là sync bit thì quay lại tìm
                    }
                       else goto seek;                   // Xung thấp = xung cao  hoặc xung thấp nhỏ hơn xung cao ( không hợp lệ ) ... quay lại tìm sync.
                  /////////////////////////////////////////////////
                  Đây là hình họa mô phỏng quá trình diễn ra theo câu lệnh, đếm thời gian sync bit của PT2262 . Nhìn hinhg không phân tích hiểu được nữa thì ... Click image for larger version

Name:	sync.jpg
Views:	1592
Size:	35.2 KB
ID:	1651704


                  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


                  • #24
                    Nếu để ý , mỗi xung của giá trị 1 ( sẽ gồm 2 xung cao và 2 thấp ) , giá trị 0 cũng vậy , giá trị f cũng vậy ... như vậy không kể SYNC thì PT2262 chỉ có tối đa ( 8 địa chỉ x 2 ) + 4 địa chỉ x 2 = 24 xung cao và 24 xung thấp .
                    mỗi giá trị 1 hay 0 hay f ... đều kiểm tra 2 lần ... nếu 2 lần đó kiểm tra giống nhau ( thì đó có thể là 0 hoặc 1 ) nếu 2 lần kiểm tra khác nhau thì đó là f.
                    Lúc đó có thể dùng vòng lặp 12 và kiểm tra 2 lần liên tiếp là biết được bit đó là 1 hay 0 hay f mà thôi.
                    VD : khai báo char dulieu[12]; // để lưu các bit


                    for(i=0;i<12;i++)
                    {
                    for(j=0;j<2;j++)
                    {

                    ////////////////////////// đếm xung cao, đếm xung thấp // thực ra với PT2262 chỉ cần KT xung cao là đủ.
                    while(RX);
                    #asm("cli");
                    xung_cao = TCNT1;
                    TCNT1=0;
                    #asm("sei");
                    while(!RX)
                    #asm("cli");
                    xung_thap = TCNT1;
                    TCNT1=0;
                    #asm("sei");


                    if(j==0) // kiểm tra chu trình đầu tiên
                    {
                    if((xung_cao>thoigian_4a/2)&&(xung_cao<thoigian_4a*2)) ketqua1=0; else ketqua1=1;
                    }
                    if(j==1) // kiểm tra chu trình thứ 2
                    {
                    if((xung_cao>thoigian_4a/2)&&(xung_cao<thoigian_4a*2)) ketqua2=0; else ketqua2=1;
                    }


                    }

                    // Kiểm tra là 1 hay 0 hay f rồi ghi vào bộ đệm dữ liệu
                    if((ketqua1==1)&&(ketqua2==1)) dulieu[i]='1';
                    else
                    if((ketqua1==0)&&(ketqua2==0)) dulieu[i]='0';
                    else dulieu[i]='f';


                    }
                    Last edited by queduong; 26-10-2015, 23:31.
                    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


                    • #25
                      Nguyên văn bởi queduong Xem bài viết
                      Nếu để ý , mỗi xung của giá trị 1 ( sẽ gồm 2 xung cao và 2 thấp ) , giá trị 0 cũng vậy , giá trị f cũng vậy ... như vậy không kể SYNC thì PT2262 chỉ có tối đa ( 8 địa chỉ x 2 ) + 4 địa chỉ x 2 = 24 xung cao và 24 xung thấp .
                      mỗi giá trị 1 hay 0 hay f ... đều kiểm tra 2 lần ... nếu 2 lần đó kiểm tra giống nhau ( thì đó có thể là 0 hoặc 1 ) nếu 2 lần kiểm tra khác nhau thì đó là f.
                      Lúc đó có thể dùng vòng lặp 12 và kiểm tra 2 lần liên tiếp là biết được bit đó là 1 hay 0 hay f mà thôi.
                      VD : khai báo char dulieu[12]; // để lưu các bit


                      for(i=0;i<12;i++)
                      {
                      for(j=0;j<2;j++)
                      {

                      ////////////////////////// đếm xung cao, đếm xung thấp // thực ra với PT2262 chỉ cần KT xung cao là đủ.
                      while(RX);
                      #asm("cli");
                      xung_cao = TCNT1;
                      TCNT1=0;
                      #asm("sei");
                      while(!RX)
                      #asm("cli");
                      xung_thap = TCNT1;
                      TCNT1=0;
                      #asm("sei");


                      if(j==0) // kiểm tra chu trình đầu tiên
                      {
                      if((xung_cao>thoigian_4a/2)&&(xung_cao<thoigian_4a*2)) ketqua1=0; else ketqua1=1;
                      }
                      if(j==1) // kiểm tra chu trình thứ 2
                      {
                      if((xung_cao>thoigian_4a/2)&&(xung_cao<thoigian_4a*2)) ketqua2=0; else ketqua2=1;
                      }


                      }

                      // Kiểm tra là 1 hay 0 hay f rồi ghi vào bộ đệm dữ liệu
                      if((ketqua1==1)&&(ketqua2==1)) dulieu[i]='1';
                      else
                      if((ketqua1==0)&&(ketqua2==0)) dulieu[i]='0';
                      else dulieu[i]='f';


                      }

                      tks a, cách này của a làm tối ưu cho bộ nhớ hơn. em thì định làm là ko cần giải mã nó là 1 hay 0 hay f luôn mà tính 1 bit là 4a rồi lưu vào bộ nhớ luôn nhưng có vẻ như v thì vùng nhớ sẽ rất lớn.

                      Comment


                      • #26
                        Nguyên văn bởi queduong Xem bài viết
                        Nếu để ý , mỗi xung của giá trị 1 ( sẽ gồm 2 xung cao và 2 thấp ) , giá trị 0 cũng vậy , giá trị f cũng vậy ... như vậy không kể SYNC thì PT2262 chỉ có tối đa ( 8 địa chỉ x 2 ) + 4 địa chỉ x 2 = 24 xung cao và 24 xung thấp .
                        mỗi giá trị 1 hay 0 hay f ... đều kiểm tra 2 lần ... nếu 2 lần đó kiểm tra giống nhau ( thì đó có thể là 0 hoặc 1 ) nếu 2 lần kiểm tra khác nhau thì đó là f.
                        Lúc đó có thể dùng vòng lặp 12 và kiểm tra 2 lần liên tiếp là biết được bit đó là 1 hay 0 hay f mà thôi.
                        VD : khai báo char dulieu[12]; // để lưu các bit


                        for(i=0;i<12;i++)
                        {
                        for(j=0;j<2;j++)
                        {

                        ////////////////////////// đếm xung cao, đếm xung thấp // thực ra với PT2262 chỉ cần KT xung cao là đủ.
                        while(RX);
                        #asm("cli");
                        xung_cao = TCNT1;
                        TCNT1=0;
                        #asm("sei");
                        while(!RX)
                        #asm("cli");
                        xung_thap = TCNT1;
                        TCNT1=0;
                        #asm("sei");


                        if(j==0) // kiểm tra chu trình đầu tiên
                        {
                        if((xung_cao>thoigian_4a/2)&&(xung_cao<thoigian_4a*2)) ketqua1=0; else ketqua1=1;
                        }
                        if(j==1) // kiểm tra chu trình thứ 2
                        {
                        if((xung_cao>thoigian_4a/2)&&(xung_cao<thoigian_4a*2)) ketqua2=0; else ketqua2=1;
                        }


                        }

                        // Kiểm tra là 1 hay 0 hay f rồi ghi vào bộ đệm dữ liệu
                        if((ketqua1==1)&&(ketqua2==1)) dulieu[i]='1';
                        else
                        if((ketqua1==0)&&(ketqua2==0)) dulieu[i]='0';
                        else dulieu[i]='f';


                        }

                        tại sao phải dùng các lệnh #asm ("sei") và #asm ("cli") để set và xóa cờ ngắt chi v a? trong các lệnh này đâu thấy có sử dụng ngắt?

                        Comment


                        • #27
                          Nguyên văn bởi angelhades Xem bài viết


                          tại sao phải dùng các lệnh #asm ("sei") và #asm ("cli") để set và xóa cờ ngắt chi v a? trong các lệnh này đâu thấy có sử dụng ngắt?
                          Tôi không biết bạn dùng trình dịch gì ... và có dùng ngắt hay không ... không dùng mấy lệnh này ( thừa cũng chẳng sao, nhưng nhiều khi thiếu thì không được ) Còn tại sao thì đọc datasheet của AVR xem timer1 nó có chung chạ với các chức năng nào hay không .... Không thì lại loay hoay cả tuần rồi lên hỏi " Tại sao không đọc được giá trị timer1" như rất nhiều người mới học AVR hay hỏ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


                          • #28
                            Nguyên văn bởi queduong Xem bài viết

                            Tôi không biết bạn dùng trình dịch gì ... và có dùng ngắt hay không ... không dùng mấy lệnh này ( thừa cũng chẳng sao, nhưng nhiều khi thiếu thì không được ) Còn tại sao thì đọc datasheet của AVR xem timer1 nó có chung chạ với các chức năng nào hay không .... Không thì lại loay hoay cả tuần rồi lên hỏi " Tại sao không đọc được giá trị timer1" như rất nhiều người mới học AVR hay hỏi.

                            a queduong ơi, em làm như anh chỉ nhưng mà khi check sync bit thì ví dụ khi ko bấm remote mà có 1 xung nhiễu nào đó xen vào rồi sao đó là 1 loạt xung 0 đủ 127a thì nó cũng nhận sai đó là sync bit. có cách nào để tránh tình trạng này ko a?

                            Comment


                            • #29
                              Nguyên văn bởi angelhades Xem bài viết


                              a queduong ơi, em làm như anh chỉ nhưng mà khi check sync bit thì ví dụ khi ko bấm remote mà có 1 xung nhiễu nào đó xen vào rồi sao đó là 1 loạt xung 0 đủ 127a thì nó cũng nhận sai đó là sync bit. có cách nào để tránh tình trạng này ko a?
                              Khi bạn bấm remote thì đâu còn nhiễu nữa, do đó chẳng cần khắc phục.
                              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


                              • #30
                                Nguyên văn bởi queduong Xem bài viết

                                Khi bạn bấm remote thì đâu còn nhiễu nữa, do đó chẳng cần khắc phục.

                                em làm 1 chương trình con check sync như a chỉ thế này:

                                void check_sync_bit()
                                {
                                int xung_cao,xung_thap;
                                sync_bit_detect=0;
                                chuki_4a=0;
                                while(!rf_data)
                                {
                                if(button==0)
                                {
                                #asm("cli")
                                #asm("sei")
                                break;
                                }
                                }
                                TCNT1=0;
                                while(rf_data)
                                {
                                if(button==0)
                                {
                                #asm("cli")
                                #asm("sei")
                                break;
                                }
                                }
                                #asm ("cli");
                                xung_cao=TCNT1;
                                TCNT1=0;
                                #asm ("sei");
                                while(!rf_data)
                                {
                                if(button==0)
                                {
                                #asm("cli")
                                #asm("sei")
                                break;
                                }
                                }
                                #asm ("cli");
                                xung_thap=TCNT1;
                                TCNT1=0;
                                #asm ("sei");
                                //////kiem tra xem co phai sync bit khong///////////

                                if(xung_thap>xung_cao)
                                {
                                if((xung_thap>xung_cao*30)&&(xung_thap<xung_cao*32 ))
                                {
                                sync_bit_detect= 1;
                                chuki_4a=xung_cao;
                                }

                                }

                                }

                                trong chương trình chính em dùng 1 vòng while để lập lại quá trình check sync này. trong khi lặp nếu nhận dc sync_bit_detect=1 thì bắt đầu thu, nhưng mà nó lúc thì nhảy lúc thì ko, mà chẳng thể nào học dc lệnh từ remote @@

                                Comment

                                Về tác giả

                                Collapse

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

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

                                Collapse

                                Đang tải...
                                X