Thông báo

Collapse
No announcement yet.

[help] điều khiển từ xa cho xe mô hình với modul RF!

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

  • [help] điều khiển từ xa cho xe mô hình với modul RF!

    em thích chơi ô tô mô hình nhưng ko có đk để mua bộ điều khiển nên em có ý tưởng ntn ko bit có khả thi ko!
    em sẽ mua 1 bộ RX,TX như của bác Quế Dương về,sau đó sẽ dùng AVR để lập trình
    bên phát:dùng 1 biến trở nối với chân ADC của chip sau đó lập trình ADC,kết quả sẽ đc xuất ra 8bit nối tiếp tơi 1 chân của chip để đưa tới modul TX,
    khi nhấn int0 sẽ xuất ra chân đó chuỗi bit 00000000,khi nhấn int1 sẽ xuất ra chuôi 11111111.
    bên thu:dữ liệu đc đưa từ modul RX,tùy thuộc vào giá trị chuỗi bit nhận đc ta sẽ lập trình PWM để điều chỉnh tốc độ động cơ,khi nhận đc 2 chuỗi đặc biệt 00000000 hay 11111111 thì sẽ xuất ra 1 chân khác để đưa đến 1 động cơ servo giúp xe có thể quay trái,phải

    theo các bác ý tưởng này có khả thi ko ah.

  • #2
    Nguyên văn bởi linhdt1121 Xem bài viết
    em thích chơi ô tô mô hình nhưng ko có đk để mua bộ điều khiển nên em có ý tưởng ntn ko bit có khả thi ko!
    em sẽ mua 1 bộ RX,TX như của bác Quế Dương về,sau đó sẽ dùng AVR để lập trình
    bên phát:dùng 1 biến trở nối với chân ADC của chip sau đó lập trình ADC,kết quả sẽ đc xuất ra 8bit nối tiếp tơi 1 chân của chip để đưa tới modul TX,
    khi nhấn int0 sẽ xuất ra chân đó chuỗi bit 00000000,khi nhấn int1 sẽ xuất ra chuôi 11111111.
    bên thu:dữ liệu đc đưa từ modul RX,tùy thuộc vào giá trị chuỗi bit nhận đc ta sẽ lập trình PWM để điều chỉnh tốc độ động cơ,khi nhận đc 2 chuỗi đặc biệt 00000000 hay 11111111 thì sẽ xuất ra 1 chân khác để đưa đến 1 động cơ servo giúp xe có thể quay trái,phải

    theo các bác ý tưởng này có khả thi ko ah.
    Bạn có thể làm được : ( tùy theo loại module RF mà có tốc độ nhanh chậm ( nếu chỉ điều khiển thông thường ( tĩnh ) hoặc không đòi hỏi tốc độ đáp ứng nhanh thì có thể làm = các module phổ thông được ( kết hợp lập trình mã hóa/giải mã )
    - dưới đây mình mô tả cách thức làm việc ( về phần lập trình )
    1) Xác định chuỗi packet ( dữ liệu cần truyền đi ) ... VD mình sẽ truyền 4 bytes 1 lần truyền trong đó
    có các byte : ID,ADC_value,Remote_value, Checksum
    cụ thể : ID : có thể chọn giá trị bất kỳ ( 0 --> 255 ) ... chẳng hạn mình chọn 0x25 . ID này làm nhiệm vụ để bộ điều khiển khác không điều khiển được ( gây loạn ) điều khiển của mình
    ADC_value : Ở đây mình dùng ADC 8 bits ( giá trị ADC 0 đến 255 ) ... Phần tử này để lưu giá trị ADC ( khi mình đọc ADC lưu nó vào đây - điều chỉnh núm vặn ADC chẳng hạn)
    Remote_value : Cái này để lưu trữ giá trị của phím bấm ( 0 --> 255 ) ... có nghĩa có thể đạt tối đa 255 nút điều khiển ( dùng điều khiển ON/OFF chẳng hạn ) . Thực chất có 256 trạng thái điều khiển ( nhưng trong điều khiển người ta thường bỏ giá trị 0 - thường dùng cho OFF)
    Checksum : Tổng của gói dữ liệu !

    2) mã hóa ( đơn giản thì dùng manchester ) - chưa biết mã hóa xem thêm tài liệu về mã hóa .

    3) truyền qua RF module

    --- Bên thu cũng có cách thức bố trí tương tự ... nhưng sẽ lấy giá trị ADC_value làm giá trị PWM để điều tốc , Remote_value để điều khiển on/off

    //////// Chuyên sâu hơn :

    /// for Transmitter
    Code:
    #define ID 0x25
    
    # define TX  PB6
     unsigned char my_data[4];
    
    unsigned int checksum;
    
    char i,j,ADC_value, Remote_value;
    
    void main()
    { 
       IO_Init();   // khởi tạo chân nào vào ,chân nào ra của MCU ( tùy theo mục đích sử dụng)
    
       ADC_Init ;  // khởi tạo ADC
    
     while(1)
      {
        ADC_value = ADC_read8( channel1);  // đọc ADC 8 bit tại kênh ADC1  
        
        if (button1_pressed)  { Remote_value = 0x01; }
        if ( button2...........................................0x02;}
    
       checksum=0;
       my_data[0]=ID;
       checksum += my_data[0];
       my_data[1] = ADC_value;
       checksum += my_data[1];
       my_data[2] = Remote_value;
       checksum += my_data[2];
        my_data[3] = checksum;
    
       for (i=0;i<32;i++)        // send preamble
            {
              TX=1;
              Delay_us(416);  // Delay 416 uS
              TX=0;
              Delay_us(416);  //
    
            }
        Delay_us(1136);  // Delay for syn bit
    
    //-----------------
              TX=1;        // start bit
              Delay_us(416);
              TX=0;
              Delay_us(416);
    
              //-----------------
           for (j=0;j<4;j++)
            {
    
              for(i=0;i<8;i++)
                 {
                   if ((my_data[j] & 0x80) == 0x80)
                     {
                      TX=1;
                      Delay_us(416);
                      TX=0;
                      Delay_us(416);
    
                     }
                    else
                    {
                      TX=0;
                      Delay_us(416);
                      TX=1;
                      Delay_us(416);
    
                    }
                    my_data[j]=my_data[j]<<1;
    
                 }
            }
            //------ send stop bit -------
            TX=1;
            Delay_us(416);
            TX=0;
            Delay_us(416);
    
            Delay_ms(10);        // delay gaurd
    
    
       }
    
    }
    đại loại như vậy ... trong các tài liệu hay support QD đã thường đề cập vấn đề này ! Nó khá đơn giả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


    • #3
      cảm ơn bác đã giúp.
      vậy mà em tưởng nếu có modul rùi thì việc mã hóa,giải mã,đièu chế,giải điều chế là việc của modul.em chỉ việc đưa data vào chân in và ra ở chân out là đc

      Comment


      • #4
        Nguyên văn bởi linhdt1121 Xem bài viết
        cảm ơn bác đã giúp.
        vậy mà em tưởng nếu có modul rùi thì việc mã hóa,giải mã,đièu chế,giải điều chế là việc của modul.em chỉ việc đưa data vào chân in và ra ở chân out là đc
        Đấy là loại chuyên nghiệp hơn rồi ... ví dụ như module DMI32 của mình thì bên trong đã mã hóa/ giải mã ( các công việc đều làm tất rồi ) ... chỉ đưa data vào và lấy data ra .
        Còn thô sơ, rẻ tiền như loại TX11, RX11 thì phải mã hó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


        • #5
          úi úi,em lỡ mua 1 cái 11 ùi,thui để em xem lại sách rùi thử làm,ko đc thì dùng nó để chạy với 2262 và 2272 chắc là đc,
          để hôm nào em mua lại cái DMI 32 vậy.

          Comment


          • #6
            đoạn code trên em ko thấy đoạn mã hóa (hay do e ko hiểu)
            bác có thể giải thích giúp e ko,coi như phần đọc ADC em đã xong,giá trị đã đc lưu trong thanh ghi DACL.
            mà dùng manchester như bác nói nhé

            Comment


            • #7
              Nguyên văn bởi linhdt1121 Xem bài viết
              úi úi,em lỡ mua 1 cái 11 ùi,thui để em xem lại sách rùi thử làm,ko đc thì dùng nó để chạy với 2262 và 2272 chắc là đc,
              để hôm nào em mua lại cái DMI 32 vậy.
              cái 11 thì làm theo cách trên là OK rồi !... còn Dmi32 thì không làm theo cách trê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


              • #8
                Nguyên văn bởi linhdt1121 Xem bài viết
                đoạn code trên em ko thấy đoạn mã hóa (hay do e ko hiểu)
                bác có thể giải thích giúp e ko,coi như phần đọc ADC em đã xong,giá trị đã đc lưu trong thanh ghi DACL.
                mà dùng manchester như bác nói nhé
                mã hóa manchester đây còn gì nữa : ( biến 1 thành 10 và biến 0 thành 01 )
                Code:
                for (i=0;i<32;i++)        // send preamble      // mấy cái này để phát mẫu + đồng bộ
                        {
                          TX=1;
                          Delay_us(416);  // Delay 416 uS
                          TX=0;
                          Delay_us(416);  //               
                
                        }
                    Delay_us(1136);  // Delay for syn bit           // đồng bộ 
                
                //-----------------
                          TX=1;        // start bit
                          Delay_us(416);
                          TX=0;
                          Delay_us(416);                         // đánh dấu bắt đầu
                
                          //-----------------
                       for (j=0;j<4;j++)          // biến đổi 4 bytes  dữ liệu  kiểu mã hóa manchester ... đưa ra chân TX           
                        {
                
                          for(i=0;i<8;i++)
                             {
                               if ((my_data[j] & 0x80) == 0x80)
                                 {
                                  TX=1;
                                  Delay_us(416);
                                  TX=0;
                                  Delay_us(416);
                
                                 }
                                else
                                {
                                  TX=0;
                                  Delay_us(416);
                                  TX=1;
                                  Delay_us(416);
                
                                }
                                my_data[j]=my_data[j]<<1;
                
                             }
                        }
                        //------ send stop bit -------
                        TX=1;
                        Delay_us(416);
                        TX=0;
                        Delay_us(416);
                
                        Delay_ms(10);        // delay gaurd
                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


                • #9
                  cảm ơn bác,em đã hiểu chỗ đó rùi,nhưng còn 2 chỗ em chưa rõ
                  1: tại sao ban đầu lại gán ID = 0x25
                  2:tại sao mình ko truyền từng bytes mà lại truyền 4 B trong 1 frame
                  3: if ((my_data[j] & 0x80) == 0x80) tại sao lại là 0x80
                  4:cái chỗ thời gian trễ để đồng bộ phát/thu ấy,cái này là tùy mình dùng loại modul có phải ko ah,mỗi loại sẽ có thời gian trễ khác nhau,em bit cái này với ứng dụng tốc độ thấp thì ko quan trọng nhưng ko hiểu nên em hỏi
                  còn nữa,em ko đc học lập trình nên hỏi chỗ nào dốt quá thì bác bỏ qua nhé

                  Comment


                  • #10
                    Nguyên văn bởi linhdt1121 Xem bài viết
                    cảm ơn bác,em đã hiểu chỗ đó rùi,nhưng còn 2 chỗ em chưa rõ
                    1: tại sao ban đầu lại gán ID = 0x25
                    2:tại sao mình ko truyền từng bytes mà lại truyền 4 B trong 1 frame
                    3: if ((my_data[j] & 0x80) == 0x80) tại sao lại là 0x80
                    4:cái chỗ thời gian trễ để đồng bộ phát/thu ấy,cái này là tùy mình dùng loại modul có phải ko ah,mỗi loại sẽ có thời gian trễ khác nhau,em bit cái này với ứng dụng tốc độ thấp thì ko quan trọng nhưng ko hiểu nên em hỏi
                    còn nữa,em ko đc học lập trình nên hỏi chỗ nào dốt quá thì bác bỏ qua nhé
                    1. Đẻ con ra thì phải đặt tên . Đặt tên con là do cha mẹ đặt . việc đặt ID = 0x25 cũng tương tự vậy ... bạn có thể đặt ID bất kỳ ( 0 --> 255). ID bên phát phải giống ID bên thu ( mục đích để chúng nhận ra nhau , và chỉ có chúng mới điều khiển được nhau ) .... những thằng khác không thể điều khiển được thiết bị của mình nếu khác ID, khác tần số , khác dữ liệu ....v.v.
                    Giả dụ mang cái ô tô ra điều khiển , không có ID ( nói tóm lại không có mã hóa/ bảo mật ) ... thằng khác nó cũng cầm cái điều khiển ... điều khiển xe mình chạy m ịa nó mất thế là đứng đấy cười à ? ( mục đích cái ID là như vậy )

                    2. loại module ( truyền serial ) mỗi lần chỉ đưa được đầu vào là 1 bit ( xung cao hoặc thấp thôi ) ... muốn truyền được 4 bytes thì phải tách nó ra thành 32 bits

                    my_data[j] & 0x80 == 0x80 .... đây là phép so sánh để xác định các bit trong my_data là bit 1 hay bit 0

                    chẳng hạn : my_data[1] ( ý nói ở đây là cái giá trị ADC_value đó ) ... ở trên mình có nói ID, ADC_value, Remote_Value, checksum ....
                    những cái này sẽ được gán vào " gói , mảng " dữ liệu tương ứng : my_data[0] = ID ; ..... my_data[3]= checksum; ( xem lại lập trình ở trên ).

                    --- trở lại vấn đề : tại sao lại là 0x80 : 0x80 ( hệ hex ) có nghĩa cũng = 10000000 ( hệ binary )
                    VD : giá trị ADC_value = 0xAA; ( hay 10101010 ) ... khi lấy phần tử 0 đầu tiên Kết hợp & 0x80 sẽ được giá trị = 0 ( xác định được bit đầu là 0 ) ... thực hiện lệnh ELSE ở dưới ( vì có = 0x80 đâu ) . thực hiện việc mã hóa 01 { TX=0 ; delay(xxx); TX=1; delay(xxx); }
                    - khi my_data[1] = my_data[1]<<1; // dịch trái 1 bit

                    nó kiểm tra sang bit thứ 2 ( lúc này bit thứ 2 có giá trị là 1 ) ... 1 kết hợp & 0x80 = 0x80 ===> đúng ( thực hiện việc mã hóa bit 1 thành 10 {TX=1; delay(xxx); TX=0; delay(xxx);}

                    --- sự kết hợp các vòng tuần hoàn 4 bytes , ... rồi đến vòng 8 bits ... ta sẽ tách ( biết được giá trị các bit ) để mà mã hóa thành 10 hay 01

                    --- Cái thời gian đồng bộ đó ( thì tùy thuộc vào mỗi loại module của các nhà sản xuất ) , có loại rất chậm thì phải để chậm , có loại nhanh thì đặt nhanh để đạt hiệu suất ...
                    ( cái này những nhà sản xuất nắm rõ nhất ) VD module 11 của QD chạy 2400baud thì có thể dùng xung mã cỡ 360 -> 600us là ngon nhất .
                    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


                    • #11
                      Nguyên văn bởi queduong Xem bài viết
                      1. Đẻ con ra thì phải đặt tên . Đặt tên con là do cha mẹ đặt . việc đặt ID = 0x25 cũng tương tự vậy ... bạn có thể đặt ID bất kỳ ( 0 --> 255). ID bên phát phải giống ID bên thu ( mục đích để chúng nhận ra nhau , và chỉ có chúng mới điều khiển được nhau ) .... những thằng khác không thể điều khiển được thiết bị của mình nếu khác ID, khác tần số , khác dữ liệu ....v.v.
                      Giả dụ mang cái ô tô ra điều khiển , không có ID ( nói tóm lại không có mã hóa/ bảo mật ) ... thằng khác nó cũng cầm cái điều khiển ... điều khiển xe mình chạy m ịa nó mất thế là đứng đấy cười à ? ( mục đích cái ID là như vậy )

                      2. loại module ( truyền serial ) mỗi lần chỉ đưa được đầu vào là 1 bit ( xung cao hoặc thấp thôi ) ... muốn truyền được 4 bytes thì phải tách nó ra thành 32 bits

                      my_data[j] & 0x80 == 0x80 .... đây là phép so sánh để xác định các bit trong my_data là bit 1 hay bit 0

                      chẳng hạn : my_data[1] ( ý nói ở đây là cái giá trị ADC_value đó ) ... ở trên mình có nói ID, ADC_value, Remote_Value, checksum ....
                      những cái này sẽ được gán vào " gói , mảng " dữ liệu tương ứng : my_data[0] = ID ; ..... my_data[3]= checksum; ( xem lại lập trình ở trên ).

                      --- trở lại vấn đề : tại sao lại là 0x80 : 0x80 ( hệ hex ) có nghĩa cũng = 10000000 ( hệ binary )
                      VD : giá trị ADC_value = 0xAA; ( hay 10101010 ) ... khi lấy phần tử 0 đầu tiên Kết hợp & 0x80 sẽ được giá trị = 0 ( xác định được bit đầu là 0 ) ... thực hiện lệnh ELSE ở dưới ( vì có = 0x80 đâu ) . thực hiện việc mã hóa 01 { TX=0 ; delay(xxx); TX=1; delay(xxx); }
                      - khi my_data[1] = my_data[1]<<1; // dịch trái 1 bit

                      nó kiểm tra sang bit thứ 2 ( lúc này bit thứ 2 có giá trị là 1 ) ... 1 kết hợp & 0x80 = 0x80 ===> đúng ( thực hiện việc mã hóa bit 1 thành 10 {TX=1; delay(xxx); TX=0; delay(xxx);}

                      --- sự kết hợp các vòng tuần hoàn 4 bytes , ... rồi đến vòng 8 bits ... ta sẽ tách ( biết được giá trị các bit ) để mà mã hóa thành 10 hay 01

                      --- Cái thời gian đồng bộ đó ( thì tùy thuộc vào mỗi loại module của các nhà sản xuất ) , có loại rất chậm thì phải để chậm , có loại nhanh thì đặt nhanh để đạt hiệu suất ...
                      ( cái này những nhà sản xuất nắm rõ nhất ) VD module 11 của QD chạy 2400baud thì có thể dùng xung mã cỡ 360 -> 600us là ngon nhất .
                      cảm ơn anh Quế Dương đã tận tình chỉ bảo,mấy ngày nay e bận viết nốt cái báo cáo thực tập,h mới có thời gian sơ đến cái này
                      đây là code e sửa lại của anh,e viết cho atmega 8 ( vì nhà có sẵn )
                      em xem giúp em có lỗi gì ko.
                      Code:
                      /*****************************************************
                      This program was produced by the
                      CodeWizardAVR V2.05.0 Evaluation
                      Automatic Program Generator
                      © Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
                      HP InfoTech, Development Tools for Microcontrollers, C Compilers, In-System Programmers
                      
                      Project : 
                      Version : 
                      Date    : 2/25/2013
                      Author  : Freeware, for evaluation and non-commercial use only
                      Company : 
                      Comments: 
                      
                      
                      Chip type               : ATmega8L
                      Program type            : Application
                      AVR Core Clock frequency: 16.000000 MHz
                      Memory model            : Small
                      External RAM size       : 0
                      Data Stack size         : 256
                      *****************************************************/
                      
                      #include <mega8.h>
                      
                      #include <delay.h>
                      #define ID 0x25
                      
                      # define TX  PORTD.5
                       unsigned char my_data[4];
                      
                      unsigned int checksum;
                      
                      char i,j,ADC_value, Remote_value;
                      
                      #define FIRST_ADC_INPUT 0
                      #define LAST_ADC_INPUT 1
                      unsigned char adc_data[LAST_ADC_INPUT-FIRST_ADC_INPUT+1];
                      #define ADC_VREF_TYPE 0x20
                      
                      // ADC interrupt service routine
                      // with auto input scanning
                      interrupt [ADC_INT] void adc_isr(void)
                      {
                      static unsigned char input_index=0;
                      // Read the 8 most significant bits
                      // of the AD conversion result
                      adc_data[input_index]=ADCH;
                      // Select next ADC input
                      if (++input_index > (LAST_ADC_INPUT-FIRST_ADC_INPUT))
                         input_index=0;
                      ADMUX=(FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff))+input_index;
                      // Delay needed for the stabilization of the ADC input voltage
                      delay_us(10);
                      // Start the AD conversion
                      ADCSRA|=0x40;
                      }
                      
                      // Declare your global variables here
                      
                      void main(void)
                      {
                      // Declare your local variables here
                      
                      // Input/Output Ports initialization
                      // Port B initialization
                      // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                      // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                      PORTB=0x00;
                      DDRB=0x00;
                      
                      // Port C initialization
                      // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 
                      // State6=T State5=T State4=T State3=T State2=T State1=T State0=T 
                      PORTC=0x00;
                      DDRC=0x00;
                      
                      // Port D initialization
                      // Func7=In Func6=In Func5=Out Func4=In Func3=In Func2=In Func1=In Func0=In 
                      // State7=T State6=T State5=0 State4=T State3=T State2=T State1=T State0=T 
                      PORTD=0x00;
                      DDRD=0x20;
                      
                      // Timer/Counter 0 initialization
                      // Clock source: System Clock
                      // Clock value: Timer 0 Stopped
                      TCCR0=0x00;
                      TCNT0=0x00;
                      
                      // Timer/Counter 1 initialization
                      // Clock source: System Clock
                      // Clock value: Timer1 Stopped
                      // Mode: Normal top=0xFFFF
                      // OC1A output: Discon.
                      // OC1B output: Discon.
                      // Noise Canceler: Off
                      // Input Capture on Falling Edge
                      // Timer1 Overflow Interrupt: Off
                      // Input Capture Interrupt: Off
                      // Compare A Match Interrupt: Off
                      // Compare B Match Interrupt: Off
                      TCCR1A=0x00;
                      TCCR1B=0x00;
                      TCNT1H=0x00;
                      TCNT1L=0x00;
                      ICR1H=0x00;
                      ICR1L=0x00;
                      OCR1AH=0x00;
                      OCR1AL=0x00;
                      OCR1BH=0x00;
                      OCR1BL=0x00;
                      
                      // Timer/Counter 2 initialization
                      // Clock source: System Clock
                      // Clock value: Timer2 Stopped
                      // Mode: Normal top=0xFF
                      // OC2 output: Disconnected
                      ASSR=0x00;
                      TCCR2=0x00;
                      TCNT2=0x00;
                      OCR2=0x00;
                      
                      // External Interrupt(s) initialization
                      // INT0: Off
                      // INT1: Off
                      MCUCR=0x00;
                      
                      // Timer(s)/Counter(s) Interrupt(s) initialization
                      TIMSK=0x00;
                      
                      // USART initialization
                      // USART disabled
                      UCSRB=0x00;
                      
                      // Analog Comparator initialization
                      // Analog Comparator: Off
                      // Analog Comparator Input Capture by Timer/Counter 1: Off
                      ACSR=0x80;
                      SFIOR=0x00;
                      
                      // ADC initialization
                      // ADC Clock frequency: 250.000 kHz
                      // ADC Voltage Reference: AREF pin
                      // Only the 8 most significant bits of
                      // the AD conversion result are used
                      ADMUX=FIRST_ADC_INPUT | (ADC_VREF_TYPE & 0xff);
                      ADCSRA=0xCE;
                      
                      // SPI initialization
                      // SPI disabled
                      SPCR=0x00;
                      
                      // TWI initialization
                      // TWI disabled
                      TWCR=0x00;
                      
                      // Global enable interrupts
                      #asm("sei")
                      
                      while (1)
                            {
                            // temp=read_adc(0);
                             ADC_value = adc_data[0];  // doc adc tai kenh 0
                             checksum=0;
                         my_data[0]=ID;
                         checksum += my_data[0];
                         my_data[1] = ADC_value;
                         checksum += my_data[1];
                         my_data[2] = Remote_value;
                         checksum += my_data[2];
                          my_data[3] = checksum;
                      
                         for (i=0;i<32;i++)        
                              {
                                TX=1;
                                delay_us(416);  
                                TX=0;
                                delay_us(416);  
                      
                              }
                          delay_us(1136);  // tre de dong bo    
                      
                      //-----------------
                                TX=1;        // bit bao bat dau truyen data
                                delay_us(416);
                                TX=0;
                                delay_us(416);
                      
                                //-----------------
                             for (j=0;j<4;j++)
                              {
                      
                                for(i=0;i<8;i++)
                                   {
                                     if ((my_data[j] & 0x80) == 0x80)
                                       {
                                        TX=1;                         // ma hoa Manchester
                                        delay_us(416);
                                        TX=0;
                                        delay_us(416);
                      
                                       }
                                      else
                                      {
                                        TX=0;
                                        delay_us(416);
                                        TX=1;
                                        delay_us(416);
                      
                                      }
                                      my_data[j]=my_data[j]<<1;
                      
                                   }
                              }
                              
                              TX=1;
                              delay_us(416);
                              TX=0;
                              delay_us(416);
                      
                              delay_ms(10);        
                      
                      
                         }
                            }
                      Last edited by linhdt1121; 25-02-2013, 22:30.

                      Comment


                      • #12
                        đây chỉ là phần ADC thôi,còn 2 cái button em chưa rõ lắm.
                        việc anh gán 2 cái đấy :
                        if (button1_pressed) { Remote_value = 0x01; }
                        if ( button2........................................... 0x02;}

                        như vậy là ta ko thể để ADC về giá trị bé nhất phải ko ah,vì nó sẽ trùng với 2 giá trị của 2 nút nhấn.

                        Comment


                        • #13
                          Nguyên văn bởi linhdt1121 Xem bài viết
                          đây chỉ là phần ADC thôi,còn 2 cái button em chưa rõ lắm.
                          việc anh gán 2 cái đấy :
                          if (button1_pressed) { Remote_value = 0x01; }
                          if ( button2........................................... 0x02;}

                          như vậy là ta ko thể để ADC về giá trị bé nhất phải ko ah,vì nó sẽ trùng với 2 giá trị của 2 nút nhấn.
                          Giá trị các nút bấm nó lưu ở 1 chỗ riêng , có chung đụng gì với ADC đâu ???

                          ID, ADC , Remote , checksum /// Mảng tận 4 bytes ( phần tử ) cơ mà ... ID ( ghi) lưu giá trị ID , ADC lưu kết quả ADC , Remote lưu kết quả phí bấm , checksum dùng để kiểm tra ... rõ ràng thế còn gì .

                          --- ở trên mình dùng có 1 kênh ADC ... thậm chí nhiều kênh ADC ( nhiều núm vặn ) thì ta cũng khai báo thêm ... chẳng thằng ADC nào tranh chấp với thằng nào cả .

                          VD tôi dùng 2 núm vặn ; 1 núm để tăng/ giảm tốc động cơ 1, 1 núm để tăng/giảm tốc động cơ 2 lúc đó mình sẽ đọc ADC1 cho núm 1 , ADC2 cho 2 ... đọc phím bấm để điều khiển bật tắt nếu muốn .

                          --- tất cả những dữ liệu này là " Tự do cái đầu mình động não mà nghĩ ra " chứ nó chẳng có cái quy chuẩn gì đâu. Mà đây là cái dễ hiểu ...
                          anh có 4 loại nguyên vật liệu ... muốn chứa riêng biệt ... đương nhiên cần 4 cái thùng để đựng mỗi loại ( cũng tương tự như ở trên ta dùng 4 bytes ... để làm nơi lưu trữ cho ID, ADC , Remote , checksum .
                          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


                          • #14
                            có lẽ kiến thức về môn ăng ten truyền sóng của e kém quá (môn này e thi lại )
                            e hiểu như thế này có đúng ko ah
                            chúng ta sẽ truyền đi 1 khung gồm có 32bit,trong đó sẽ chia ra làm 4 nhóm,mỗi nhóm gồm 8bit
                            bên thu sẽ thu lần lượt 32 bit này bắt đầu từ lúc nhận đc start bit và kết thúc khi nhận đc stop bit
                            nó sẽ thực hiện việc tách từ 32 bit này thành 4 nhóm như bên phát,và dùng nó để thực hiện các việc tiếp theo....

                            ban đầu em chỉ nghĩ là nó truyền đi mỗi khung 8bit,nên mới có cái suy nghĩ trên

                            Comment


                            • #15
                              Nguyên văn bởi linhdt1121 Xem bài viết
                              có lẽ kiến thức về môn ăng ten truyền sóng của e kém quá (môn này e thi lại )
                              e hiểu như thế này có đúng ko ah
                              chúng ta sẽ truyền đi 1 khung gồm có 32bit,trong đó sẽ chia ra làm 4 nhóm,mỗi nhóm gồm 8bit
                              bên thu sẽ thu lần lượt 32 bit này bắt đầu từ lúc nhận đc start bit và kết thúc khi nhận đc stop bit
                              nó sẽ thực hiện việc tách từ 32 bit này thành 4 nhóm như bên phát,và dùng nó để thực hiện các việc tiếp theo....

                              ban đầu em chỉ nghĩ là nó truyền đi mỗi khung 8bit,nên mới có cái suy nghĩ trên
                              nó là truyền nối tiếp ... nên mỗi lần chỉ truyền 1 bit ... còn theo thời gian thì hàng nghìn , hàng triệu bit cũng được.
                              Bao nhiêu nhóm , bao nhiêu bit là tự ta định nghĩa ra và khai báo ... ở trên khai báo kiểu char nên mỗi byte 8 bits ( nên giá trị sẽ là 0 --> 255 ) .

                              nếu khai báo kiểu INT lúc đó sẽ là 32 bits ( có thể chứa giá trị từ 0 - 65535 )

                              --- Chốt lại 1 câu : Mấy cái này là kiến thức " số " , Vi xử lý . Chẳng liên quan gì đến kiến thức Sóng với sánh cả . Nếu kiến thức lập trình quá kém thì vào các mục " 8051, PIC , AVR ..v.v " tu luyện thêm ... chứ ở trên Byte , bit mảng, dịch trái , dịch phải , kiểm tra chẵn lẻ, cao thấp... trong lập trình toàn là cái cơ bản 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

                              Về tác giả

                              Collapse

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

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

                              Collapse

                              Đang tải...
                              X