H48C adalah sensor yang biasa digunakan untuk mendeteksi kemiringan robot. Sensor ini mampu mendeteksi gaya gravitasi dalam tiga sumbu(X,Y,Z). Karena H48C membutuhkan tegangan 3,3 Volt (tentu ini sangat merepotkan karena tegangan kerja microcontroller AVR rata-rata 5 volt), Parallax menciptakan sebuah module integrasi H48C dengan ADC 12 bit MCP3204 yg dilengkapi regulator tegangan sehingga kita bisa menggunakannya dengan tegangan kerja 5 volt. Module buatan Parallax ini bisa dilihat seperti gambar di atas. Data yang dihasilkan Module H48C diakses dengan komunikasi Synchronous Serial Interface.Microcontroller memerlukan 3 pin untuk komunikasi ini yakni Clokc, DI/O dan CS.
Di artikel ini saya akan menyertakan contoh program CodeVision AVR untuk menampilkan data yg dihasilkan module H48C ke hyperterminal(anda bisa menggunakan aplikasi komunikasi serial RS232 yg lain) dengan baudrate 9600 bps.
#include
#include
#include
#define CS PORTB.2 //koneksi pin mikro ke H48C
#define Do PORTB.0
#define Di PINB.0
#define CLK PORTB.1
#define DATA_IN 0b11111110
#define DATA_OUT 0b11111111
#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7
#define FRAMING_ERROR(1<
#define PARITY_ERROR (1<
#define DATA_OVERRUN (1<
#define DATA_REGISTER_EMPTY (1<
#define RX_COMPLETE (1<
// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];
#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif
// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;
// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}
#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm("cli")
--rx_counter;
#asm("sei")
return data;
}
#pragma used-
#endif
void clock()
{
CLK=0;
delay_us(5);
CLK=1;
delay_us(5);
}
int read_HC(unsigned char axis)
{
int looping,hc;
//start
DDRB=DATA_OUT;
CS=0;
Do=1; //start bit
clock();
Do=1; //SGL/DIFF bit
clock();
//pilih channel
for(looping=3;looping>0;looping--)
{
Do=(axis>>(looping-1)) & 0x01;
clock();
}
DDRB=DATA_IN;
Do=1;//Pull High pin Di/o
clock();// t sample bit
clock();//null bit
hc=0;
for(looping=0;looping<12;looping++)
{
CLK=0;
delay_us(5);
hc<<=1;
hc|=Di;
CLK=1;
delay_us(5);
}
CS=1;
//end
return hc;
}
float konversi(int vRef,int vAxis)
{
float f;
if (vAxis>=vRef)f=(vAxis-vRef)*0.0022;
if(vAxis
//f*=0.0022;
return f;
}
void main(void)
{
int vRef,vX,vY,vZ;
float f;
PORTB=0xff;
DDRB=0xff;
CLK=1;
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x19;
ACSR=0x80;
SFIOR=0x00;
// Global enable interrupts
#asm("sei")
printf("ok");
putchar(13);
putchar(10);
delay_ms(1000);
while (1)
{
vX=read_HC(0);
printf("X axis= %d",vX);
putchar(13);
putchar(10);
vY=read_HC(1);
printf("Y axis= %d",vY);
putchar(13);
putchar(10);
vZ=read_HC(2);
printf("Z axis= %d",vZ);
putchar(13);
putchar(10);
vRef=read_HC(3);
printf("Vreff= %d",vRef);
putchar(13);
putchar(10);
f=konversi(vRef,vX);
printf("gForce X= %f",f);
putchar(13);
putchar(10);
f=konversi(vRef,vY);
printf("gForce Y= %f",f);
putchar(13);
putchar(10);
f=konversi(vRef,vZ);
printf("gForce Z= %f",f);
putchar(13);
putchar(10);
delay_ms(1000);
putchar(13);
putchar(10);
};
}
Di artikel ini saya akan menyertakan contoh program CodeVision AVR untuk menampilkan data yg dihasilkan module H48C ke hyperterminal(anda bisa menggunakan aplikasi komunikasi serial RS232 yg lain) dengan baudrate 9600 bps.
Saat pertama kali dijalankan, microcontroller akan mengirimkan karakter: ok ini untuk mengindikasikan bahwa komunikasi antara microcontroller dan PC sudah ok. Setelah itu setiap detik microcontroller akan mengirimkan data:
- X axis
- Y axis
- Z axis
- Vreff
- Gforce X
- Gforce Y
- Gforce Z
Download Source Code klik disini Download Data Sheet klik disini program di atas hanya program contoh dan masih perlu perbaikan, mohon kritik dan sarannya ke zigan@ymail.com published in http://avrku.blogspot.com
Powered by Zoundry Raven
tolong dijelaskan baris perbaris dari source code di atas...terima kasih...
mantap
kunjungi blog saya
http://iswanto.staff.umy.ac.id/ dan http://blog.umy.ac.id/iswanto