Subscribe via email

Enter your email address:

Delivered by FeedBurner

CodeVision AVR Program Untuk Hitachi H48C

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 [email protected] published in http://avrku.blogspot.com

Powered by Zoundry Raven

Comments :

2 comments to “CodeVision AVR Program Untuk Hitachi H48C”

tolong dijelaskan baris perbaris dari source code di atas...terima kasih...

reza mengatakan...
on 

mantap
kunjungi blog saya
http://iswanto.staff.umy.ac.id/ dan http://blog.umy.ac.id/iswanto

iswanto mengatakan...
on