Xin chào tất cả mọi người.
Mình tham gia diễn đàn đã khá lâu rồi nhưng không có đóng góp gì cho diễn đàn, mà chôm từ diễn đàn thì khá nhiều. Mình mới giao tiếp với con ADXL345 (cảm biến góc) dùng i2c với pic 16f877a. Mà chưa thấy ai post cả, Bạn nào có hứng thú làm điều khiển xe bằng góc nghiêng, hay đo góc thì có thể dùng con này.
#include <16F877A.h>
#use delay(clock=20000000)
#include <def_877A.h>
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use i2c(Master, sda=PIN_C4, scl=PIN_C3)
#fuses HS,NOPROTECT, BROWNOUT, PUT, NOLVP
//#include <lcd_lib_4bit_use.c>
#include <stdio.h>
void write(int dv, byte address, byte val);
byte read(int dv, byte address) ;
void ini_adxl345() //cai dat ban dau cho adxl345
{
write(0x53,0x38,0x9f);
write(0x53,0x31,0x00);
write(0x53,2C,0x0d);
delay_us(10);
write(0x53,0x2D,0x08);
}
void main() {
set_tris_e(0x00);
set_tris_d(0x00);
set_tris_a(0xff);
set_tris_c(0x00);
ini_adxl345();
while(true) {
int id, pow;
id= read(0x53,0x00); //lay dia chi id adxl345 va dia chi luon la e5
pow=read(0x53,0x2D); // lay gia tri cai dat POWER_CONTROL
int16 x,z,y;
//lay gia tri x,y,z
x=(read(0x53,0x33)*256) | (read(0x53,0x32));
y=(read(0x53,0x35)*256) | (read(0x53,0x34));
z=(read(0x53,0x37)*256) | (read(0x53,0x36));
printf(" x= %ld, y= %ld, z=%ld id=%x, pow=%x",x,y,z,id,pow); //hien thi len rs232
puts(" ");
}
}
//ham viet gia tri vao
void write(int dv, byte address, byte val) {
i2c_start();
i2c_write(dv<<1);
i2c_write(address);
i2c_write(val);
i2c_stop();
}
//ham doc gia tri ra
byte read(int dv, byte address) {
int value;
i2c_start();
i2c_write(dv<<1);
i2c_write(address);
i2c_start();
i2c_write(dv<<1|0x01);
value=i2c_read(0);
i2c_stop();
return value;
}
video
ADXL345 + Pic 16f877a - YouTube
Mình tham gia diễn đàn đã khá lâu rồi nhưng không có đóng góp gì cho diễn đàn, mà chôm từ diễn đàn thì khá nhiều. Mình mới giao tiếp với con ADXL345 (cảm biến góc) dùng i2c với pic 16f877a. Mà chưa thấy ai post cả, Bạn nào có hứng thú làm điều khiển xe bằng góc nghiêng, hay đo góc thì có thể dùng con này.
#include <16F877A.h>
#use delay(clock=20000000)
#include <def_877A.h>
#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use i2c(Master, sda=PIN_C4, scl=PIN_C3)
#fuses HS,NOPROTECT, BROWNOUT, PUT, NOLVP
//#include <lcd_lib_4bit_use.c>
#include <stdio.h>
void write(int dv, byte address, byte val);
byte read(int dv, byte address) ;
void ini_adxl345() //cai dat ban dau cho adxl345
{
write(0x53,0x38,0x9f);
write(0x53,0x31,0x00);
write(0x53,2C,0x0d);
delay_us(10);
write(0x53,0x2D,0x08);
}
void main() {
set_tris_e(0x00);
set_tris_d(0x00);
set_tris_a(0xff);
set_tris_c(0x00);
ini_adxl345();
while(true) {
int id, pow;
id= read(0x53,0x00); //lay dia chi id adxl345 va dia chi luon la e5
pow=read(0x53,0x2D); // lay gia tri cai dat POWER_CONTROL
int16 x,z,y;
//lay gia tri x,y,z
x=(read(0x53,0x33)*256) | (read(0x53,0x32));
y=(read(0x53,0x35)*256) | (read(0x53,0x34));
z=(read(0x53,0x37)*256) | (read(0x53,0x36));
printf(" x= %ld, y= %ld, z=%ld id=%x, pow=%x",x,y,z,id,pow); //hien thi len rs232
puts(" ");
}
}
//ham viet gia tri vao
void write(int dv, byte address, byte val) {
i2c_start();
i2c_write(dv<<1);
i2c_write(address);
i2c_write(val);
i2c_stop();
}
//ham doc gia tri ra
byte read(int dv, byte address) {
int value;
i2c_start();
i2c_write(dv<<1);
i2c_write(address);
i2c_start();
i2c_write(dv<<1|0x01);
value=i2c_read(0);
i2c_stop();
return value;
}
video
ADXL345 + Pic 16f877a - YouTube
Comment