Need help with a g force meter project!!

Thread Starter

Ranayh

Joined May 6, 2013
8
Im working on a personal g-force meter using a pic18f452 and i have a few problems.

1. i was wondering if u can revise the codes with me and make sure that the mikroC code matches.

2. im trying to simulate on proteus before working with the hardware and theres no accelerometer in the library. any1 has any suggestions??

3. i wana look at more than one accelerometer before picking one, i want a dual-axis accelerometer. share ur ideas with me.

Thank!!!
this is the mp-lab code

Rich (BB code):
#include <p18f452.h>
#include <delays.h>
#include <adc.h>
#include <math.h>

#define gravity_ss 512
#define display_divider 20

//PORTD - 0bBGCDHAEF
#define one 	0b10100000
#define two 	0b11010110
#define three 	0b11110100
#define four 	0b11100001
#define five 	0b01110101
#define six 	0b01110111
#define seven 	0b10100100
#define eight 	0b11110111
#define nine 	0b11110101
#define zero 	0b10110111
#define blank   0b00000000

void update_char_display(int *char_disp)
{
	int i=0;
	int all_digits[11] = {zero, one, two, three, four, five, six, seven, eight, nine};
	for(i=0;i<3;i++)
	{

		switch(i)
		{
		case 0 :	PORTB = all_digits[char_disp] + 0b1000;
			break;
		case 1 :	PORTD = all_digits[char_disp];
			break;
		case 2 :	PORTC = all_digits[char_disp];
			break;
		default :
			break;
		}
	}

}

void main(void)
{

int char_disp[3];

int current_result, past_result = 0;
int g_val, temp = 0;

int i=0;

TRISA = 0xFF;
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
				//Turn All Displays Off Initially
PORTB = blank;		//PORTB -> Display 1
PORTC = blank;		//PORTC -> Display 2
PORTD = blank;		//PORTD -> Display 3

					//Initialize A/D Converter
OpenADC( ADC_FOSC_32 
		& ADC_RIGHT_JUST 
		& ADC_8ANA_0REF, 
		ADC_CH0 & ADC_INT_OFF );

while(1){

update_char_display(char_disp);
Delay1KTCYx(250);


Delay10TCYx(5);
ConvertADC();
while( BusyADC() );
	current_result = ReadADC();

temp = current_result - past_result;

	if( temp > 2 || temp < -2 )
	{
	past_result = current_result;
	g_val = current_result - gravity_ss;
	g_val = g_val << 5;
	g_val = g_val / display_divider;

	if(g_val < 0)
		g_val = g_val * -1;

	i = 2;
	}
	while(i!= 255)
	{
		char_disp=g_val%10;
		g_val = g_val/10;
		i--;
	}

}



}


#define gravity_ss 512
#define display_divider 20

//PORTD - 0bBGCDHAEF
#define one 0b10100000
#define two 0b11010110
#define three 0b11110100
#define four 0b11100001
#define five 0b01110101
#define six 0b01110111
#define seven 0b10100100
#define eight 0b11110111
#define nine 0b11110101
#define zero 0b10110111
#define blank 0b00000000

void update_char_display(int *char_disp)
{
int i=0;
int all_digits[11] = {zero, one, two, three, four, five, six, seven, eight, nine};
for(i=0;i<3;i++)
{

switch(i)
{
case 0 : PORTB = all_digits[char_disp] + 0b1000;
break;
case 1 : PORTD = all_digits[char_disp];
break;
case 2 : PORTC = all_digits[char_disp];
break;
default :
break;
}
}

}

void main(void)
{

int char_disp[3];

int current_result=0;
int past_result = 0;
int g_val, temp = 0;

int i=0;

TRISA = 0xFF;
TRISB = 0x00;
TRISC = 0x00;
TRISD = 0x00;
//Turn All Displays Off Initially
PORTB = blank; //PORTB -> Display 1
PORTC = blank; //PORTC -> Display 2
PORTD = blank; //PORTD -> Display 3

//Initialize A/D Converter
ADC_Init();
while(1){

update_char_display(char_disp);
Delay_ms(250);


Delay_ms(5);

while( 1 );
current_result = ADC_read(1);
temp = current_result - past_result;

if( temp > 2 || temp < -2 )
{
past_result = current_result;
g_val = current_result - gravity_ss;
g_val = g_val << 5;
g_val = g_val / display_divider;

if(g_val < 0)
g_val = g_val * -1;

i = 2;
}
while(i!= 255)
{
char_disp=g_val%10;
g_val = g_val/10;
i--;
}

}



}[/CODE]
 
Last edited:
Top