Thứ Sáu, 18 tháng 9, 2015

Giao tiếp Module RF CC1101 UART với KIT ATmega 8 V2
Chào các bạn, hôm nay mình chia sẻ với các bạn một project lap trinh vi dieu khien giao tiếp module CC1101 UART với KIT ATmega8 V2. Các bạn về nạp code cho 2 mạch được thiết kế giống hệt nhau để test quá trình truyền nhận dữ liệu qua lại. Nhấn phím Key 1 trên KIT để gửi nội dung đi sang bên nhận. Bên nhận có thể gửi lại một nội dung khác tương tự để trả lời khi nhấn phím Key 1.
Ứng dụng của module này các bạn có thể biến nó thành một máy gửi tin nhắn không dây, truyền nhận dữ liệu cho MCU, máy tính....

- Mình xin giới thiệu qua về Module RF CC1101 UART:
 

+ Điện áp hoạt động: 3.3-5V
+ Khoảng cách hoạt động khoảng 200m tùy vào địa hình
+ Kích thước: 27.8x14.4x4MM
+ Tần số: 433Mhz
+ Tốc độ mặc định: 9600
+ Hỗ trợ 128 kênh truyền và 255 địa chỉ
+ Sử dụng tập lệnh AT qua chuẩn truyền thông UART

--> Để xem chi tiết về Module CC1101 UART: http://banlinhkien.vn/goods-3636-module-rf-433mhz-cc1101-uart.html
--> KIT ATmega 8 V2 NEW: http://banlinhkien.vn/goods-2637-kit-atmega8-v2-new-avr-v2-new-.html

- Mạch mô phỏng trên Proteus 7.10:

- Code viết trên CodeVisionAVR (lap trinh c):
Mã:
/* Code by Vu Thai - Giao tiep ATmega8 voi Module RF CC1101 UART */
#include <mega8.h>
#include <delay.h>
#include <alcd.h>
#define SIZE    20      //Kich thuoc bo dem nhan

/*  Khai bao GPIO */
#define SET PORTD.2    //Chan SET cua module
#define BUT PINC.5    //Chan nut nhan PC5

/*  Khai bao bien*/
unsigned char u_data, k, m;
unsigned char buffer[SIZE];  //Bo dem nhan
unsigned char dem;  //Bien luu gia tri dem

void send_byte(unsigned char udata){//Ham gui 1 ky tu ASCII
    while(!(UCSRA & (1<<UDRE)));//Kiem tra co UDRE
    UDR=udata;//Send 1 byte
}
void send(flash unsigned char *u){//Ham gui mot chuoi ky tu
    while(*u){
        send_byte(*u++);
    }
}
void cc1101_init(){ //Ham khoi tao module CC1101
  lcd_clear();
  lcd_puts("MODE FU1");
  SET=0; //Keo chan 5 cua module xuong 0 de dung lenh AT
  send("AT+FU1\r");  //Cai dat che do cua module
  delay_ms(1000);
  lcd_clear();
  lcd_puts("CHANNEL 102");
  send("AT+C102\r"); //Cai dat kenh truyen
  delay_ms(1000);
  lcd_clear();
  lcd_puts("ADDRESS 123");
  send("AT+A123\r");  //Cai dat dia chi truyen nhan
  SET=1; //Keo chan 5 cua module len 1 de gui DATA
  delay_ms(1000);
  lcd_clear();
  lcd_puts("OK! READY...");
}
void clear(void){  //Ham xoa bo dem buffer
    unsigned char z;
    for(z=0;z<SIZE;z++)buffer[z]='\0';
}
void xuly(){  //Ham xu ly du lieu nhan duoc qua UART
    lcd_clear();
    lcd_puts("Nhan Noi Dung:");       
    lcd_gotoxy(0,1);//Dong 2
    lcd_puts(buffer); //Xuat du lieu trong buffer ra LCD
}
interrupt [USART_RXC] void usart_rx_isr(void){ //Ngat UART nhan du lieu
    u_data=UDR;
    if(u_data==10 && m==0){m=1; clear(); k=0;}  //Bat ky tu dau
    else if(u_data==13 && m>0){xuly(); m=0;}  //Bat ky tu cuoi
    else if(m>0){
        buffer[k]=u_data;        //Luu du lieu vao buffer
        if(++k>SIZE){m=0; clear();} //Xoa bo dem khi tran du lieu
    }
}
void main(){    //Chuong trinh chinh
    UCSRB=0x98;//Ngat RX, cho phep RX va TX
    UCSRC=0x86;//8bit uart, 1bit stop, no parity
    UBRRL=47;//baud 9600bps  (Crytal 7.3728 Mhz)
    DDRC.5=0; //PC5 input
    PORTC.5=1;  //Tro keo Vcc PC5
    DDRD.2=1; //PD2 ouput
    SET=1;
    lcd_init(16); //LCD16x2 init
    delay_ms(200);
    lcd_puts("BanLinhKien.Vn"); 
    delay_ms(1000);
    lcd_gotoxy(0,1);//Dong 2
    lcd_puts("TEST CC1101 UART");//Gui chuoi len LCD
    delay_ms(1000);
    cc1101_init();  //Khoi tao module cc1101
    #asm("sei")    //Cho phep ngat cuc bo
    while(1){
        if(!BUT){    //Kiem tra nut nhan   
            lcd_clear(); //Xoa man hinh
            lcd_puts("Gui Noi Dung:");       
            lcd_gotoxy(0,1);//Dong 2
            lcd_puts("BanLinhKien.Vn_");  //Hien thi noi dung gui di
            lcd_putchar(dem+48);
            send("\nBanLinhKien.Vn_"); //Gui di noi dung
            send_byte(dem+48);  //Gui kem so dem
            send("\r");
            if(++dem>9)dem=0; //Tang bien dem len
            while(!BUT);  //Cho nha phim
            delay_ms(200);  //Tao tre cho lan gui tiep theo
        }//end if BUT
    }//end while
}//end main

Lưu ý khi sử dụng KIT ATmega8 V2 là chân RX tức PD0 bị ảnh hưởng bởi con MAX232 trên KIT lên nó không nhận được dữ liệu từ Module RF CC1101 gửi sang, để khắc phục các bạn có thể làm mạch tương tự mạch nguyên lý để test. Do ở trên test được là do mình đã tháo con MAX232 ra khỏi mạch lên không còn bị ảnh hưởng nữa.
Chúc các bạn tu hoc lap trinh thành công!!!

0 nhận xét:

Đăng nhận xét