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

  • #46
    Tại sao lại cần đọc EEPROM liên tục ? Đọc EEPROM rất mất thời gian ... sao không làm một Mảng, biến mà lưu giá trị ... khi khởi động nó chỉ đọc EEPROM có một lần và load vào mảng hay biến ! Việc so sánh giá trị giữa mảng hay biến với dữ liệu thu được chắc chắn nhanh hơn lúc nào cũng phải đọc từ EEPROM.

    //////////////// Hàm ghi và đọc EEPROM

    void EEPROM_Write(unsigned int dchi, unsigned char dlieu)
    {
    while(EECR.1==1);
    EEAR = dchi;
    EEDR = dlieu;
    EECR.2 = 1;
    EECR.1 = 1;
    }

    //doc 1 byte du lieu tu dia chi cua eeprom//////////////////////////
    unsigned char EEPROM_Read(unsigned int dchi)
    {
    while(EECR.1);
    EEAR = dchi;
    EECR.0 = 1;
    return EEDR;
    }


    ///////////// Cách sài :
    EEPROM_Write(1,'f'); // ghi kí tự 'f' vào địa chỉ số 1

    //
    noi_dung_can_doc = EEPROM_Read(1); // đọc nội dung từ địa chỉ số 1


    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


    • #47
      Nguyên văn bởi queduong Xem bài viết
      Tại sao lại cần đọc EEPROM liên tục ? Đọc EEPROM rất mất thời gian ... sao không làm một Mảng, biến mà lưu giá trị ... khi khởi động nó chỉ đọc EEPROM có một lần và load vào mảng hay biến ! Việc so sánh giá trị giữa mảng hay biến với dữ liệu thu được chắc chắn nhanh hơn lúc nào cũng phải đọc từ EEPROM.



      Sr ngoài lề chút ạ.
      Bác QD ơi có module thu nào nhỏ ngọn tiết kiệm năng lượng, để có thể dùng Pin và đeo tay. Module chỉ cần nhận tín hiệu 0 1 để kích hoạt motor rung k nhỉ?

      Comment


      • #48
        Nguyên văn bởi ken___ Xem bài viết
        Sr ngoài lề chút ạ.
        Bác QD ơi có module thu nào nhỏ ngọn tiết kiệm năng lượng, để có thể dùng Pin và đeo tay. Module chỉ cần nhận tín hiệu 0 1 để kích hoạt motor rung k nhỉ?
        Hàng đặc biệt cần có thiết kế riêng chứ không có sẵn.
        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


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

          Mình không có nhiều thời gian xem mã nhưng nếu bạn giữ nút trên remote sau đó bấm nút vào learn mode mà không chạy được thì chương trình của bạn đã có vấn đề.
          --- Muốn xem sync có chuẩn không thì viết 1 chương trình nhận sync ... nhận chuẩn thì nháy đèn. Không nhấn nút remote mà đèn nháy nghĩa là bị nhiễu. Bấm nút remote thì đèn phải sáng đều đặn .
          VD :
          while(1)
          {
          seek:
          kiem_tra_sync();
          if(xung_thap>xung_cao)
          {
          if(xung_thap>xung_cao/30)&&..................................
          { den1 =1; Delay_ms(200); den1=0;}
          else goto seek;
          }
          else goto seek;
          }



          //////////////////////////////

          Một điều nữa là chương trình của bạn viết rất lủng củng ( có vẻ do kiến thức lập trình C không tốt ) và lạm dụng quá nhiều lệnh while { }

          --- với 4 nút và 1 mode học lệnh bạn chỉ cần làm 1 chương trình và ghi 4 giá trị học lệnh là có thể giải quyết vấn đề rồi.

          VD :
          khai báo
          bit learn_mode;
          char lenh;

          interrupt [EXT_INT0] void ext_int0_isr(void) // Ngắt ngoài
          {
          learn_mode=1; // vào learn_mode
          lenh++; if(lenh>4) { lenh=0; learn_mode=0; } // Bấm tuần tự 4 lần để học 4 lệnh, bấm lần thứ 5 để thoát khỏi learn_mode.
          }

          void main()
          {
          learn_mode =0;
          lenh =0;

          while(1)
          {
          if(learn_mode) // Vào học lệnh
          {
          --- Kiểm tra sync
          --- Lấy dữ liệu

          switch(lenh) // để xem đang học lệnh nào thì lưu cái đó vào EEPROM;
          {
          case 1:
          EEPROM_Write(......... lưu lệnh 1 )
          break;
          case 2:
          EEPROM_Write(......... lưu lệnh 2 )
          break;
          case 3:
          EEPROM_Write(......... lưu lệnh 3 )
          break;
          case 4:
          EEPROM_Write(......... lưu lệnh 4 )
          break;
          }
          }
          else // Không phải học lệnh ( learn_mode = 0 )
          {
          --- Kiểm tra sync
          --- Lấy dữ liệu
          --- So sánh và tác động điều khiển (VD : bật tắt đèn ở RA1 )
          }


          }



          }

          Code:
          else
                {  
                check_sync_bit();
                if(sync_bit_detect==1)
                {
                  nhan_du_lieu();
                  kenh_1=kenh_2=kenh_3=kenh_4=1 ;
                  for(i=0;i<12;i++)
                  {  
                      if(data[i]==x[i])
                      kenh_1++;
                      if(data[i]==y[i])
                      kenh_2++;
                      if(data[i]==z[i])
                      kenh_3++;
                      if(data[i]==v[i])
                      kenh_4++;
                      
                  }
                  if(kenh_1==12)
                  den_1=!den_1;
                  if(kenh_2==12)
                  den_2=!den_2;
                  if(kenh_3==12)
                  den_3=!den_3;
                  if(kenh_4==12)
                  den_4=!den_4;
                }
               }
          a queduong xem giúp em, em viết chương trình decode thế này có được ko v a? @@

          Comment


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


            Code:
            else
            {
            check_sync_bit();
            if(sync_bit_detect==1)
            {
            nhan_du_lieu();
            kenh_1=kenh_2=kenh_3=kenh_4=1 ;
            for(i=0;i<12;i++)
            {
            if(data[i]==x[i])
            kenh_1++;
            if(data[i]==y[i])
            kenh_2++;
            if(data[i]==z[i])
            kenh_3++;
            if(data[i]==v[i])
            kenh_4++;
            
            }
            if(kenh_1==12)
            den_1=!den_1;
            if(kenh_2==12)
            den_2=!den_2;
            if(kenh_3==12)
            den_3=!den_3;
            if(kenh_4==12)
            den_4=!den_4;
            }
            }
            a queduong xem giúp em, em viết chương trình decode thế này có được ko v a? @@
            Nếu kenh_1=kenh_2=kenh_3=kenh_4=1 ; thì làm sao mà bằng 12 được ??? vì khi i = 0 thì kenh_1++ ==> kenh_1 đã bằng 2 mất rồi ... cứ như thế nếu toàn bộ data đúng ( lúc i = 11 ) thì cũng đồng nghĩa kenh_1 = 13 !!! ===> lệnh if(kenh_1==12) chẳng có tác dụng gì, nếu có tác dụng nghĩa là dữ liệu không chính xác.
            phải là kenh_1=kenh_2=kenh_3=kenh_4=0 ;
            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


            • #51
              Nguyên văn bởi queduong Xem bài viết
              Nếu kenh_1=kenh_2=kenh_3=kenh_4=1 ; thì làm sao mà bằng 12 được ??? vì khi i = 0 thì kenh_1++ ==> kenh_1 đã bằng 2 mất rồi ... cứ như thế nếu toàn bộ data đúng ( lúc i = 11 ) thì cũng đồng nghĩa kenh_1 = 13 !!! ===> lệnh if(kenh_1==12) chẳng có tác dụng gì, nếu có tác dụng nghĩa là dữ liệu không chính xác.
              phải là kenh_1=kenh_2=kenh_3=kenh_4=0 ;
              tks a nhìu, làm dc rồi mừng muốn khóc . còn dính cái là nếu đè remote luôn thì đèn nó nhấp nháy. muốn cho nó đứng luôn chưa dc

              Comment


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

                Hàng đặc biệt cần có thiết kế riêng chứ không có sẵn.
                So lượng k nhiều. Thiết ké riêng có vẻ k ổn lắm :d.

                Comment


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

                  tks a nhìu, làm dc rồi mừng muốn khóc . còn dính cái là nếu đè remote luôn thì đèn nó nhấp nháy. muốn cho nó đứng luôn chưa dc
                  Bạn làm một cái timer ... khi giải mã thành công thì reset cái timer ... nếu tiếp tục giải mã thành công thì lại reset cái timer.

                  Lấy VD :

                  Ngắt timer 0

                  {
                  timer_cnt ++;
                  if(timer_cnt >1000) // VD 1000 = 1 giây
                  {
                  led =0;
                  }
                  }


                  trong phần giải mã :

                  --- sync
                  --- giải mã

                  led =1;
                  start_timer_0;
                  TCNT0=0;
                  timer_cnt=0;

                  Đây là một chức năng kiểu " ấn giữ nút " thì đèn bên thu sáng , nhả tay thì đèn bên thu mất sau 1s ( nếu thấy 1s quá lâu bạn có thể giảm xuống ... nhưng đừng giảm quá nhỏ " led sẽ lập bập ", theo kinh nghiệm thì khoảng 700ms --> 1,3s là OK trong điều khiển. Nếu muốn led tắt nhanh hơn ( khi nhả tay ) thì nên kiểm tra tín hiệu điều khiển ( chẳng hạn nếu sau 10 chu trình mà không nhận được sync_bit ( có nghĩa coi đó là không có tín hiệu Remote ) thì cắt cái led đi.

                  //// cách điều khiển on/off cũng có thể làm theo cách tương tự, có thể kết hợp kiểm tra tín hiệu hoặc thêm một cờ nhớ để không bị on/off liên tục ... khi đó muốn on nó sẽ on, muốn off nó sẽ off, giữ tay nó sẽ không bị lập bập ... trừ khi mất tín hiệu hoặc cố tình ấn on/off liên tụ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


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

                    Bạn làm một cái timer ... khi giải mã thành công thì reset cái timer ... nếu tiếp tục giải mã thành công thì lại reset cái timer.

                    Lấy VD :

                    Ngắt timer 0

                    {
                    timer_cnt ++;
                    if(timer_cnt >1000) // VD 1000 = 1 giây
                    {
                    led =0;
                    }
                    }


                    trong phần giải mã :

                    --- sync
                    --- giải mã

                    led =1;
                    start_timer_0;
                    TCNT0=0;
                    timer_cnt=0;

                    Đây là một chức năng kiểu " ấn giữ nút " thì đèn bên thu sáng , nhả tay thì đèn bên thu mất sau 1s ( nếu thấy 1s quá lâu bạn có thể giảm xuống ... nhưng đừng giảm quá nhỏ " led sẽ lập bập ", theo kinh nghiệm thì khoảng 700ms --> 1,3s là OK trong điều khiển. Nếu muốn led tắt nhanh hơn ( khi nhả tay ) thì nên kiểm tra tín hiệu điều khiển ( chẳng hạn nếu sau 10 chu trình mà không nhận được sync_bit ( có nghĩa coi đó là không có tín hiệu Remote ) thì cắt cái led đi.

                    //// cách điều khiển on/off cũng có thể làm theo cách tương tự, có thể kết hợp kiểm tra tín hiệu hoặc thêm một cờ nhớ để không bị on/off liên tục ... khi đó muốn on nó sẽ on, muốn off nó sẽ off, giữ tay nó sẽ không bị lập bập ... trừ khi mất tín hiệu hoặc cố tình ấn on/off liên tục.

                    tks a. cái chế độ đề như a làm ở trên e hiểu rồi, còn cái on/off thì phải nhớ thế nào cho nó khỏi bị nhấp nháy? vì trong giải mã e để là led=!led. khi giải mã thành công nó sẽ chuyển trạng thái led mất rồi. còn cái nữa là timer khi mà khởi động thì nó bắt đầu đếm...nếu v nó có thể làm sai mục đích của mình muốn ko a?

                    Comment


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


                      tks a. cái chế độ đề như a làm ở trên e hiểu rồi, còn cái on/off thì phải nhớ thế nào cho nó khỏi bị nhấp nháy? vì trong giải mã e để là led=!led. khi giải mã thành công nó sẽ chuyển trạng thái led mất rồi. còn cái nữa là timer khi mà khởi động thì nó bắt đầu đếm...nếu v nó có thể làm sai mục đích của mình muốn ko a?
                      Bạn làm một cái cờ nhớ : VD : bit đã_bấm_nút;
                      void main()
                      {
                      đã_bấm_nút=0; // mặc định lúc khởi động gán cho giá trị là không bấm nút

                      while(1)
                      {
                      giải mã
                      if((đã_bấm_nút ==0) &&(nút_số_1))
                      {
                      đã_bấm_nút =1;
                      đèn1= !đèn1;
                      }

                      khởi động timer; // ví dụ khởi động timer 0 hay timer 2 ( chả chung đụng bố con thằng nào ), avr có mấy cái timer liền

                      TCNT0 =0;
                      timer_cnt =0;
                      }

                      }



                      Trong ngắt timer thì đếm timer_cnt ++;
                      if( timer_cnt> 1 giới hạn nào đó ) tức là không bấm nút nữa thì timer nó sẽ tự đếm tăng dần, tăng dần đến ngưỡng .... chứ vẫn còn bấm nút thì TCNT0, timer_cnt nó reset về 0 liên tục, không tăng lên được
                      {
                      đã_bấm_nút =0;
                      }


                      ////// Như vậy với lệnh ON/OFF thì khi bấm nút ( nếu đèn đang OFF ) thì chuyển thành on, giữ nút thì đèn vẫn cứ ON ( vì chưa quá thời gian time out ( mạch vẫn nhận biết là thằng điều khiển đang giữ nút ) .... cờ nhớ đã_bấm_nút có giá trị 1 ===> câu lệnh if((đã_bấm_nút ==0) &&(nút_số_1)) không có tác dụng ===> Led không bị nhảy lập bập.

                      Khi nhả tay khởi nút ==> thời gian timer tăng dần ==> quá ===> reset cái đã_bấm_nút về giá trị 0 .... lúc này nếu bấm remote thì câu lệnh if((đã_bấm_nút ==0) &&(nút_số_1)) có tác dụng ... đèn đang ON trở thành OFF ( do đèn1 = ! đèn1 )


                      /// Bạn có thể khởi động timer từ trước, hoặc giải mã xong mới khởi động timer ( nên dùng 1 cái timer khác cho nó lành ) - sao cứ chúi mũi vào 1 cái timer ( trong khi đó AVR có mấy cái timer khác nữa ).
                      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


                      • #56
                        trong giải mã em viết thế này.
                        Code:
                        if(bam_nut==0&&kenh_1==12)
                                {
                                bam_nut=1; 
                                den_1=!den_1;
                                relay_1=!relay_1;
                                TCNT0=56;
                                timer_cnt=0;
                                }
                        còn trong ngắt timer thế này
                        Code:
                        interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                        {
                        // Place your code here
                        timer_cnt++;
                        if(timer_cnt>50)
                        bam_nut=0;
                        }
                        thế mà nó vẫn chớp đèn a ơi. tăng giá trị so sánh if(timer_cnt>1000) nó cũng chớp @@

                        Comment


                        • #57
                          Nguyên văn bởi angelhades Xem bài viết
                          trong giải mã em viết thế này.
                          Code:
                          if(bam_nut==0&&kenh_1==12)
                          {
                          bam_nut=1;
                          den_1=!den_1;
                          relay_1=!relay_1;
                          TCNT0=56;
                          timer_cnt=0;
                          }
                          còn trong ngắt timer thế này
                          Code:
                          interrupt [TIM0_OVF] void timer0_ovf_isr(void)
                          {
                          // Place your code here
                          timer_cnt++;
                          if(timer_cnt>50)
                          bam_nut=0;
                          }
                          thế mà nó vẫn chớp đèn a ơi. tăng giá trị so sánh if(timer_cnt>1000) nó cũng chớp @@
                          Phải để cái lệnh
                          TCNT0=56;
                          timer_cnt=0;
                          nó ở ngoài ( ở dưới ) cái if chứ để ở bên trong được 1 lần đầu nut_bam=1 rồi lệnh if vô tác dụng thì làm sao nó reset về 0 được ...???
                          Thời gian reset là bao nhiêu thì tự tính ra thôi. Lấy giá trị timer * bộ chia * chu kỳ máy = thời gian !
                          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


                          • #58
                            Code:
                            if(bam_nut==0&&kenh_1==12)
                            {
                             bam_nut=1;
                             den_1=!den_1;
                              relay_1=!relay_1;
                            }
                            TCNT0=56;
                            timer_cnt=0;
                            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


                            • #59
                              Nguyên văn bởi queduong Xem bài viết
                              Code:
                              if(bam_nut==0&&kenh_1==12)
                              {
                              bam_nut=1;
                              den_1=!den_1;
                              relay_1=!relay_1;
                              }
                              TCNT0=56;
                              timer_cnt=0;
                              em để lộn, cảm ơn a thông não cho em. chắc do cái module phát thu sida nên nó chớp chớp, để e thử tăng thời gian kiểm tra lên 1 chút xem thế nào

                              Comment


                              • #60
                                Nguyên văn bởi queduong Xem bài viết
                                Code:
                                if(bam_nut==0&&kenh_1==12)
                                {
                                bam_nut=1;
                                den_1=!den_1;
                                relay_1=!relay_1;
                                }
                                TCNT0=56;
                                timer_cnt=0;
                                a ơi, giờ e làm thêm 1 cái nữa là bấm bút mode 5s thì mới vào học lệnh, e làm như này mà sao ko thấy hiện tượng j
                                Code:
                                void check_5s()
                                {
                                    dem=0;
                                    detect_5s=0;
                                    while(dem<100)
                                    {
                                        if(check_time&&!button)
                                        TCNT1=15535;
                                        if(button)
                                        {
                                            break;
                                        }
                                    }
                                    if(dem==100)
                                    detect_5s=1;
                                    else detect_5s=0;    
                                           
                                }
                                Code:
                                interrupt [TIM1_OVF] void timer1_ovf_isr(void)
                                {
                                // Place your code here
                                dem++;
                                check_time=1;
                                }
                                Code:
                                interrupt [EXT_INT0] void ext_int0_isr(void)
                                {
                                // Place your code here
                                check_5s();
                                if(detect_5s)
                                {
                                learn_mode=1;
                                den_mode=0;
                                delay_ms(200);
                                den_mode=1;
                                }
                                else
                                {
                                kenh++;
                                if(kenh>4) {kenh=0; learn_mode=0;PORTB=0;}
                                }
                                
                                }
                                cứu em phát nữa đi

                                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