lap trinh ma hoa giai ma

10 542 3
lap trinh ma hoa giai ma

Đang tải... (xem toàn văn)

Thông tin tài liệu

Kỹ thuật lập trình mã hóa và giải mã trong truyền thông

Lập trình hoá / giải Manchester cho RF module OOK/ASK Tác giả : Quế Dương Đơn vị : Que Duong Electronics ************* A. Tại sao phải hoá /giải - Đó là câu hỏi đặt ra của rất nhiều người khi bắt đầu tiếp xúc với truyền thông ,nhất lại là truyền thông không dây (wireless). Trong một mức độ nào đó , đa phần các tín hiệu truyền đi qua sóng vô tuyến (RF : radio frequency) đều phải được hoá để bảo tính ổn định của thông tin. Một máy phát có hoá và máy thu có giải sẽ ít bị nhận sai dữ liệu hoặc cũng có thể sửa sai dữ liệu, khó bị can nhiễu hơn so với không hoá . Có rất nhiều kiểu hoágiải , có thể hoá trực tiếp sóng mang như xung , pha , tần số hay cũng có thể hoá tín hiệu ( dữ liệu ) truyền đi . - Có rất nhiều kiểu thiết kế trong RF , có thể nhà sản xuất đã làm bộ hoá/giải tích hợp nhưng đa phần các hãng sản xuất thường làm thô ( tức là không cài bộ hoá/giải trong các module đơn giản , bởi tính năng linh hoạt và việc cài một bộ hoá/giải mặc định vào sẽ đội giá thành lên cao ( nhưng lại không đúng ý của người làm ứng dụng ) và như vậy việc ứng dụng phát triển các sản phẩm sẽ không được đẩy cao , tính sáng tạo sẽ mất đi , đôi khi tạo ra sự lãng phí không cần thiết. - Trong môi trường tự nhiên ,có rất nhiều yếu tố gây ảnh hưởng đến tín hiệu từ máy phát truyền đến máy thu , máy thu rất dễ bị nhiễu vì ngoài môi trường không gian có rất nhiều nhiễu sóng điện từ , điện tích , các nguồn nhiễu phát sinh tác động vào máy thu và những dữ liệu ta thu được có thể bị sai vì nhiễu tác động. - Bài viết này của tôi chỉ đề cập tới việc hoá / giải đơn giản cho các module RF có dạng điều chế OOK ( on/off keying) và ASK ( Điều biên ). Nó thích hợp cho việc truyền thông tín hiệu digital (0 và 1) từ Module Phát tới module thu . B. Hiểu biết cơ bản về tín hiệu đầu vào và ra của các module OOK /ASK - Module phát : Đa phần các module phát OOK /ASK dùng để truyền dữ liệu , digital chưa có thành phần hoá thường được thiết kế đơn giản với 4 chân vào ra chính đó là : chân VCC ( chân cấp nguồn ) , chân GND ( chân Ground của mạch ) , chân Data in , chân Anten out . ( Ngoài những chân cơ bản trên thì một số module có thêm chân Enable ( chân này có tác dụng đóng mở nguồn điện cung cấp nhằm mục đích tiết kiệm năng lượng tiết kiệm pin ) + Chức năng của các chân : 1) Chân VCC và GND : Hai chân này để cấp nguồn điện 1 chiều , bạn chỉ cần đọc tài liệu ( thông số điện áp nguồn ) bạn có rồi cấp nguồn cho module cho phù hợp . Điện áp dương nguồn sẽ đưa vào chân VCC và âm nguồn sẽ nối với GND . 2) Chân Data in : Chân này là chân bạn đưa các tín hiệu 0 , 1 vào đây ( mức tín hiệu chuẩn của TTL là 0 : 0 vôn và 1 là 5v. Khi bạn đưa tín hiệu 0 vào chân Data in thì mạch phát vẫn không có gì xảy ra , khi bạn đưa tín hiệu 1 vào chân Data in thì mạch phát được kích hoạt và phát ra sóng điện từ . Cứ đưa xung liên tục 0 ,1. Vào chân Data in khi đó mạch phát sẽ ngừng , phát , ngừng , phát phát ( theo kiểu chớp tắt như vậy ) --- ( ON OFF KEYING ) Hình dưới đây mô tả việc sóng điện từ được phát thành chùm hình sin ngắt quãng khi đầu Data in có các tín hiệu 0 và 1 . 3) Chân Anten : Chân này để nối anten phát vào ( Ngoại trừ những module phát được chế tạo đặc biệt có anten đặt sẵn trên mạch ) thì bạn phải nối anten ngoài vào điểm này . Một module phát RF phải có anten thì mới có thể phát sóng ra xa ngoài không gian. - Module Thu : Các module thu cũng được chế tạo đơn giản với đầu ra Data out , Chân VCC , GND , Anten. + Anten : Chân này là chân để gắn anten thu vào . Một module thu có anten sẽ tốt và thu được tín hiệu khoảng cách xa hơn so với không lắp anten ( Vì thế bạn nên đọc tài liệu của nhà sản xuất nhớ gắn anten vào ). + VCC và GND : Chân cấp điện áp nguồn cho module thu ( xem tài liệu nhà sản xuất cung cấp module cho bạn cấp đúng giá trị điện áp cho module thu ) + Data out : Chân này sẽ đưa ra các xung 0 và 1 khi máy phát hoạt động phát 0 ,1 * Đặc điểm của module thu : Bình thường khi cấp nguồn cho module thu thì đầu ra Data out có mức 0 ,1 ngẫu nhiên không xác định . Mức 0 hoặc 1 này do yếu tố môi trường tác động . Bởi thế khi lập trình giải cho các bộ thu thì ta không sử dụng ngắt để nhận ở đầu vào ta sẽ dùng phương pháp hỏi vòng , loại trừ . Khi bạn dùng ngắt để nhận tín hiệu thì bị nhảy vào ngắt liên tục và kết quả bạn chẳng nhận được cái gì ( một cách làm thật ngốc xít !!! ) Đây cũng là điểm khác biệt giữa module thu RF và module thu IR ( hồng ngoại ) . Tín hiệu module thu IR ( hồng ngoại ) là rất sạch vì thế đương nhiên bạn có thể dùng ngắt để nhận tín hiệu từ module hồng ngoại . Còn ở đây RF thì không , bạn dùng ngắt ( nếu dùng ) thì hãy dùng ở bên trong các chương trình chứ không nên dùng ngắt Ngoài để đọc C . Bắt đầu làm việc và giải quyết bài toán lập trình hoá / giải - ý nghĩa của tốc độ : ( baud rate ) : Mỗi module thu phát có thể hỗ trợ tốc độ nhanh nhất và chậm nhất ( do nhà sản xuất làm ra ) . Muốn cho module thu phát hoạt động chính xác , hiệu quả thì bạn phải lập trình để phát ở tốc độ đó . - Tại sao phải phát xung theo tốc độ : Nếu bạn đặt ra câu hỏi là ta cứ phát 1 và 0 theo thời gian ta muốn . !!! Khi bạn cho tín hiệu 1 vào đầu Data in và cứ giữ nguyên ở đó với thời gian dài và mong muốn module thu cũng là 1 bằng đúng như vậy . Nếu chỉ có thế thì ta chẳng cần gì phải đọc những gì bạn đã đọc từ lúc nãy đến bây giờ . + Khi bạn phát tín hiệu 1 quá dài thì module thu có lên mức 1 tuy vậy nó sẽ giảm theo thời gian và ở thời gian quá dài thì đầu ra module thu không còn là 1 nữa . + Khi bạn phát một tín hiệu 0 quá dài : Module thu cũng đưa ra mức 0 , tuy vậy khi thòi gian quá dài nó sẽ thu nhiễu môi trường và không còn là 0 nữa. + Nếu bạn phát tín hiệu 1 hoặc 0 với chu kỳ quá ngắn ( tốc độ cao hơn giá trị nhà sản xuất quy định) thì có thể module thu cũng không thể bắt kịp được tốc độ đó và không thể thu dữ liệu . - Phát tín hiệu để báo hiệu cuộc trao đổi dữ liệu bắt đầu : Khi ở trạng thái bình thường , module thu có mức tín hiệu đầu ra không xác định ( hoặc 0 hoặc 1 ) liên tục. Lúc này bộ thu có độ lợi Gain điện áp tín hiệu là rất lớn . Nếu bạn phát ngay tín hiệu ( dũ liệu ) lúc này thì có thể bộ thu không kịp nhận biết là bạn đã gửi tín hiệu đến cho nó . Bởi thế ta cần làm một khâu gọi là chuẩn bị ( tức là ta phát một chuỗi xung 0,1 ) từ 20 đến 40ms ( tuỳ từng loại hay nhà sản xuất ). Việc phát chuỗi xung này để điều chỉnh lại độ lợi Gain của bộ thu ( báo hiệu cho nó ) đưa nó vào trạng thái sẵn sàng bước vào phiên giao tiếp. D. Giải thuật và phương pháp hoá / giải I). hoá Manchester - Đặc điểm của hoá : Khi bạn phát một chuỗi tín hiệu 0 hoặc 1 quá dài thì có thể làm cho bộ thu hoạt động sai . hoá manchester có nhiệm vụ phân đều khoảng thời gian dài thành những thời gian nhỏ , phù hợp với module phát và thu. - hoá manchester sẽ hoá tín hiệu 1 thành 10 và hoá tín hiệu 0 thành 01 VD : Ta phát 1 tín hiệu 8 bit ( 11111111) tín hiệu này sẽ được hoá thành 1010101010101010 VD : 10110101 sẽ được hoá thành : 1001101001100110 - Độ rộng thời gian của bit 1 = bit 0 . VD : ( phát tín hiệu 10 qua 1 chân của vi điều khiển giả sử là chân P_1 ) P_1 =1 ; // Phát tín hiệu 1 ra chân P_1 Delayus(400); // Trễ 400 mi cro giây P_1 = 0; // Tắt tín hiệu chân P_1 Delayus(400); // Trễ 400 micro giây a) Các bước lập trình hoá /giải manchester *** Phần phát : Bước 1) : Phát 1 chuỗi xung 1 , 0 trong khoảng 30ms ( bước chuẩn bị ). VD : P_1 = 1; Trễ 400 us P_1 = 0; Trễ 400us ( phát lặp đi lặp lại kh oảng 30ms ) Bước 2): nghỉ 1 khoảng thời gian ( thời gian này để đồng bộ máy thu ) VD : Trễ 1000us // Nghỉ 1ms Bước 3) : Cài dữ liệu mình mong muốn vào , biến chúng thành 10 nếu bit dữ liệu phát ra là 1 hoặc 01 nếu bit phát ra là 0 . VD : Ví dụ ta có dữ liệu là 10110101 và muốn phát chuỗi này ra chân P_1 Đẩy lần lượt từng bit vào bộ đệm ==> kiểm tra bit đó là 1 hay là 0. Nếu là 1 : P_1=1; Trễ 400us P_1=0; Trễ 400us Nếu là 0 : P_1 =0; Trễ 400us P_1=1; Trễ 400us --- Phát lần lượt như vậy đến hết 8 bit dữ liệu Bước 4) : Phát 1 xung để kết thúc ( xung này sẽ đảm bảo là dữ liệu của bạn sẽ không bị cụt đuôi , bỏ sót + kết thúc phiên giao tiếp . P_1 =1; Trễ 400us P_1=0; Trễ 400us Trễ (xxxx) // Trễ thêm thời gian để cho bộ thu giải quyết các công việc ( tuỳ ý ). *** Phần thu : 1) Đợi chuẩn bị , so sánh khoảng thời gian mức 1 hoặc 0 ở Chân Data out của module thu có khớp với phát hay không . Nếu không khớp thì lại bắt đầu từ đầu 2) Đếm thời gian đồng bộ 3) thực hiện đếm thời gian xung giữa bit 0 và 1, nếu độ rộng xung bit 1 lớn hơn thời gian trễ thì ta bắt được bit 1 , trường hợp khác bắt được bit 0. 4) Sau khi thu được dữ liệu ,muốn làm gì dữ liệu đó thì làm. b) Một bài toán hoá /giải cụ thể ( nguồn C ) nguồn thông tin từ : www.coolcircuit.com Chú thích : Đây là một mạch điều khiển từ ca có sử dụng hoá/ giải sử dụng hoá manchester ( nguồn thông tin được cung cấp bởi Coolcircuit ) . - Sơ đồ mạch phát : ( Dĩ nhiên nhìn vào sơ đồ thì bạn có thể thay thế cái module TLP434A bằng cái module bạn có trong tay ). - nguồn chương trình phát : ( nguồn được viết trên Hi tech PIC ) //------------------------------------- // TX for RF remote control // (c) www.CoolCircuit.com //------------------------------------- #include<pic.h> #include"delay.h" __CONFIG(XT&MCLRDIS&WDTDIS); #define Header 0x20 // Định nghĩa đặt địa chỉ cho bộ phát ( bộ thu cũng cần đặt như này ) #define sw1 GP0 // các phím bấm #define sw2 GP3 #define sw3 GP1 #define TX GP2 // Đầu này là đầu xuất tín hiệu 0,1 vào chân Data in module Phát void send_data(unsigned char *data); void checkSW1(void); void checkSW2(void); void checkSW3(void); unsigned char buff[3]; // mảng lưu trữ dữ liệu cần phát unsigned char toggle=0x80; void main() { DelayBigUs(1197); // Delay 416 uS for 2400 bps TX=0; TRIS=0B00001011; OPTION=0x00; // pull-up GP0,GP1,GP3, timer0 not use while(1) { if (!sw1) checkSW1(); if (!sw3) checkSW3(); // first check sw3 then sw2(hardware limited) if (!sw2) checkSW2(); } } void send_data(unsigned char *data) { unsigned char i,j; for (i=0;i<35;i++) // Chuẩn bị { TX=1; DelayBigUs(379); // Delay 416 uS for 2400 bps TX=0; DelayBigUs(379); // Delay 416 uS for 2400 bps } DelayBigUs(1197); // Delay 1248 uS or 3Te for syn bit // Đồng bộ thời gian //----------------- TX=1; // start bit DelayBigUs(379); // Delay 416 uS for 2400 bps TX=0; DelayBigUs(379); // Delay 416 uS for 2400 bps //----------------- for (j=0;j<3;j++) { for(i=0;i<8;i++) { if ((data[j] & 0x80) == 0x80) // m· ho¸ tÝn hiÖu cã møc 1 { TX=1; DelayBigUs(379); // Delay 416 uS for 2400 bps TX=0; DelayBigUs(379); // Delay 416 uS for 2400 bps } else // m· ho¸ tÝn hiÖu cã møc 0 { TX=0; DelayBigUs(379); // Delay 416 uS for 2400 bps TX=1; DelayBigUs(379); // Delay 416 uS for 2400 bps } data[j]=data[j]<<1; } } //------ send stop bit ------- TX=1; DelayBigUs(379); // Delay 416 uS for 2400 bps TX=0; DelayBigUs(379); // Delay 416 uS for 2400 bps DelayBigUs(2000); // delay gaurd } void checkSW1() { if (!sw1) { do{ buff[0]=Header; buff[1]=0x01 | toggle; // channel 1 buff[2]=buff[0] ^ buff[1]; send_data(buff); }while(!sw1); toggle=toggle ^ 0x80; DelayMs(15); } } void checkSW2() { if (!sw2) { do{ buff[0]=Header; buff[1]=0x02 | toggle; // channel 2 buff[2]=buff[0] ^ buff[1]; send_data(buff); }while(!sw2); toggle=toggle ^ 0x80; DelayMs(15); } } void checkSW3() { if (!sw3) { do{ buff[0]=Header; buff[1]=0x03 | toggle; // channel 3 buff[2]=buff[0] ^ buff[1]; send_data(buff); }while(!sw3); toggle=toggle ^ 0x80; DelayMs(15); } } ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// S¬ ®å m¹ch thu : M· nguån m¹ch thu : //--------------------------------- // Receiver for RF remote control project // (c) www.CoolCircuit.com //--------------------------------- #include<pic.h> #include"delay.h" __CONFIG(XT&MCLRDIS&WDTDIS); #define Header 0x20 #define RX GP3 #define out1 GP0 #define out2 GP1 #define out3 GP2 unsigned char RXREG[3]; unsigned char toggle=0x00; unsigned char old_toggle=0x00; #define Channel RXREG[1] bit get_data(unsigned char *buff); bit rx_bit; void main() { GPIO=0x00; TRIS=0B00001000; OPTION=0x03; while(1) { while(get_data(RXREG)); if (RXREG[2]==(RXREG[0] ^ RXREG[1])) { if (RXREG[0]==Header) { toggle = RXREG[1] & 0x80; if (toggle!=old_toggle) { old_toggle=toggle; RXREG[1]=RXREG[1] & 0x03; if (RXREG[1]==0x01) out1=!out1; if (RXREG[1]==0x02) out2=!out2; if (RXREG[1]==0x03) out3=!out3; } } } //DelayMs(50); } } bit get_data(unsigned char *buff) { unsigned char i,j,T0,count; i=35; count=0; OPTION=0x00; // pre scaler = 2 for counting long time while(--i) // wait preamble { NOP(); NOP(); NOP(); while(RX); TMR0=0; NOP(); NOP(); NOP(); while(!RX); T0=TMR0; if (T0==0xFF) return 1; // error if ((T0>=198) && (T0<=218)) // 396-432 uS it OK. { count++; if ((count>=1)|| (i==0)) break; } } if (i==0) return 1; // error OPTION=0x03; // prescaler = 16 T0=0; while (!((T0>=94) && (T0<=114))) // 1504 - 1824 uS it OK. syn bit for 4Te or 1664 uS { NOP(); NOP(); NOP(); while(RX); // wait syn TMR0=0; NOP(); NOP(); NOP(); NOP(); while(!RX); T0=TMR0; } while(RX); //wait start bit go low DelayBigUs(580); // delay 624 uS before sampling (1.5Te) for (j=0;j<3;j++) { i=8; buff[j]=0; while(i--) { buff[j]=buff[j]<<1; rx_bit=RX; // sampling buff[j]=buff[j] | rx_bit; if (rx_bit==0) while(!RX); else while(RX); DelayBigUs(580); } } if (rx_bit==0) if (!RX) return 1; // error (no stop bit found) else if (!RX) return 1; // error (no stop bit found) return 0; } /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// ( Tµi liÖu b¶n 1.0 - Hoµn thµnh ngµy 20/9/2007 ) . I). Mã hoá Manchester - Đặc điểm của mã hoá : Khi bạn phát một chuỗi tín hiệu 0 hoặc 1 quá dài thì có thể làm cho bộ thu hoạt động sai . Mã hoá manchester. mã hoá . Có rất nhiều kiểu mã hoá và giải mã , có thể mã hoá trực tiếp sóng mang như mã xung , mã pha , mã tần số hay cũng có thể mã hoá tín hiệu ( dữ

Ngày đăng: 05/09/2013, 21:53

Từ khóa liên quan

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan