Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*****************************************************
- This program was produced by the
- CodeWizardAVR V1.25.9 Professional
- Automatic Program Generator
- © Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
- http://www.hpinfotech.com
- Project :
- Version :
- Date : 4/8/2011
- Author : F4CG
- Company : F4CG
- Comments:
- Chip type : ATmega16L
- Program type : Application
- Clock frequency : 1.000000 MHz
- Memory model : Small
- External SRAM size : 0
- Data Stack size : 256
- *****************************************************/
- #include <mega16.h>
- #include <stdlib.h>
- #include <delay.h>
- #include <stdio.h>
- #include <math.h>
- // I2C Bus functions
- #asm
- .equ __i2c_port=0x15 ;PORTC
- .equ __sda_bit=1
- .equ __scl_bit=0
- #endasm
- #include <i2c.h>
- // Alphanumeric LCD Module functions
- #asm
- .equ __lcd_port=0x18 ;PORTB
- #endasm
- #include <lcd.h>
- // Declare your global variables here
- char timer_0_over=0;
- int sensor_x_initial_value;
- int sensor_y_initial_value;
- int sensor_z_initial_value;
- float x_axis_degree_per_second;
- float y_axis_degree_per_second;
- float z_axis_degree_per_second;
- char buffer[6];
- float x_angle_gyro;
- float y_angle_gyro;
- float z_angle_gyro;
- unsigned long int cycle;
- int x_value_ADC_value_from_accelerometer;
- int y_value_ADC_value_from_accelerometer;
- int z_value_ADC_value_from_accelerometer;
- float angle_x_from_accelerometer;
- float angle_y_from_accelerometer;
- float angle_z_from_accelerometer;
- // Timer 0 overflow interrupt service routine
- interrupt [TIM0_OVF] void timer0_ovf_isr(void)
- {
- timer_0_over++;
- }
- void getting_initails_from_gyro(void){
- int i2c_reading=0;
- unsigned char counter;
- int sensor_x_digitalvalue=0;
- int sensor_y_digitalvalue=0;
- int sensor_z_digitalvalue=0;
- float average_x;
- float average_y;
- float average_z;
- for(counter=0;counter<=100;counter++){
- //finding X initial
- ///////////////////////////////////////////////////////////////////////////////
- i2c_start();
- i2c_write(0xD0);
- i2c_write(0x1D);
- i2c_start();
- i2c_write(0xD1);
- i2c_reading=i2c_read(0);
- i2c_stop();
- sensor_x_digitalvalue=i2c_reading<<8;
- i2c_start();
- i2c_write(0xD0);
- i2c_write(0x1E);
- i2c_start();
- i2c_write(0xD1);
- i2c_reading=i2c_read(0);
- i2c_stop();
- sensor_x_digitalvalue = sensor_x_digitalvalue | i2c_reading;
- average_x = ((average_x * counter) + sensor_x_digitalvalue)/(counter+1);
- ///////////////////////////////////////////////////////////////////////////////
- //finding Y initial
- ///////////////////////////////////////////////////////////////////////////////
- i2c_start();
- i2c_write(0xD0);
- i2c_write(0x1F);
- i2c_start();
- i2c_write(0xD1);
- i2c_reading=i2c_read(0);
- i2c_stop();
- sensor_y_digitalvalue=i2c_reading<<8;
- i2c_start();
- i2c_write(0xD0);
- i2c_write(0x20);
- i2c_start();
- i2c_write(0xD1);
- i2c_reading=i2c_read(0);
- i2c_stop();
- sensor_y_digitalvalue = sensor_y_digitalvalue | i2c_reading;
- average_y =((average_y * counter) + sensor_y_digitalvalue)/(counter+1);
- ///////////////////////////////////////////////////////////////////////////////
- //finding Z initial
- ///////////////////////////////////////////////////////////////////////////////
- i2c_start();
- i2c_write(0xD0);
- i2c_write(0x21);
- i2c_start();
- i2c_write(0xD1);
- i2c_reading=i2c_read(0);
- i2c_stop();
- sensor_z_digitalvalue=i2c_reading<<8;
- i2c_start();
- i2c_write(0xD0);
- i2c_write(0x22);
- i2c_start();
- i2c_write(0xD1);
- i2c_reading=i2c_read(0);
- i2c_stop();
- sensor_z_digitalvalue = sensor_z_digitalvalue | i2c_reading;
- average_z = ((average_z * counter) + sensor_z_digitalvalue)/(counter+1);
- ///////////////////////////////////////////////////////////////////////////////
- }
- if(average_x - floor(average_x)>=0.5){
- sensor_x_initial_value= ceil(average_x);
- }
- else{
- sensor_x_initial_value= floor(average_x);
- }
- if(average_y - floor(average_y)>=0.5){
- sensor_y_initial_value= ceil(average_y);
- }
- else{
- sensor_y_initial_value= floor(average_y);
- }
- if(average_z - floor(average_z)>=0.5){
- sensor_z_initial_value= ceil(average_z);
- }
- else{
- sensor_z_initial_value= floor(average_z);
- }
- }
- void reading_data_from_gyro(void){
- int i2c_reading=0;
- int sensor_x_digitalvalue=0;
- int sensor_y_digitalvalue=0;
- int sensor_z_digitalvalue=0;
- float scale_factor=14.375;
- TCCR0=0x01;
- //X axis reading
- ////////////////////////////////////////////////////////////
- i2c_start();
- i2c_write(0xD0);
- i2c_write(0x1D);
- i2c_start();
- i2c_write(0xD1);
- i2c_reading=i2c_read(0);
- i2c_stop();
- sensor_x_digitalvalue=i2c_reading<<8;
- i2c_start();
- i2c_write(0xD0);
- i2c_write(0x1E);
- i2c_start();
- i2c_write(0xD1);
- i2c_reading=i2c_read(0);
- i2c_stop();
- sensor_x_digitalvalue = sensor_x_digitalvalue + i2c_reading;
- x_axis_degree_per_second = (sensor_x_digitalvalue - sensor_x_initial_value)/scale_factor;
- ////////////////////////////////////////////////////////////
- //Y axis reading
- ////////////////////////////////////////////////////////////
- i2c_start();
- i2c_write(0xD0);
- i2c_write(0x1F);
- i2c_start();
- i2c_write(0xD1);
- i2c_reading=i2c_read(0);
- i2c_stop();
- sensor_y_digitalvalue=i2c_reading<<8;
- i2c_start();
- i2c_write(0xD0);
- i2c_write(0x20);
- i2c_start();
- i2c_write(0xD1);
- i2c_reading=i2c_read(0);
- i2c_stop();
- sensor_y_digitalvalue = sensor_y_digitalvalue + i2c_reading;
- y_axis_degree_per_second = (sensor_y_digitalvalue - sensor_y_initial_value)/scale_factor;
- ////////////////////////////////////////////////////////////
- //Z axis reading
- ////////////////////////////////////////////////////////////
- i2c_start();
- i2c_write(0xD0);
- i2c_write(0x21);
- i2c_start();
- i2c_write(0xD1);
- i2c_reading=i2c_read(0);
- i2c_stop();
- sensor_z_digitalvalue=i2c_reading<<8;
- i2c_start();
- i2c_write(0xD0);
- i2c_write(0x22);
- i2c_start();
- i2c_write(0xD1);
- i2c_reading=i2c_read(0);
- i2c_stop();
- sensor_z_digitalvalue = sensor_z_digitalvalue + i2c_reading;
- z_axis_degree_per_second = (sensor_z_digitalvalue - sensor_z_initial_value)/scale_factor;
- ////////////////////////////////////////////////////////////
- }
- void gyro_angle_calculation(void){
- cycle= TCNT0 + timer_0_over*256;
- timer_0_over=0;
- TCNT0=0;
- x_angle_gyro=x_angle_gyro + x_axis_degree_per_second*cycle/1000000;
- y_angle_gyro=y_angle_gyro + y_axis_degree_per_second*cycle/1000000;
- z_angle_gyro=z_angle_gyro + z_axis_degree_per_second*cycle/1000000;
- }
- void start_with_accelerometer(void){
- i2c_start();
- i2c_write(0xA6);
- i2c_write(0x2D);
- i2c_write(0x00);
- i2c_stop();
- i2c_start();
- i2c_write(0xA6);
- i2c_write(0x31);
- i2c_write(0x01);
- i2c_stop();
- i2c_start();
- i2c_write(0xA6);
- i2c_write(0x2D);
- i2c_write(0x08);
- i2c_stop();
- }
- void measuring_acceleration(void)
- {
- signed char i;
- int digital_values_from_sensor[6];
- signed char x_axis_0g_point=1;
- signed char y_axis_0g_point=1;
- signed char z_axis_0g_point = -8;
- //i2c reading
- i2c_start();
- i2c_write(0xA6);
- i2c_write(0x32);
- i2c_start();
- i2c_write(0xA7);
- for (i=0;i<5;i++){
- digital_values_from_sensor[i]=i2c_read(1);
- }
- digital_values_from_sensor[i]=i2c_read(0);
- i2c_stop();
- //i2c reading is done
- //comining LSB and HSB
- x_value_ADC_value_from_accelerometer = (digital_values_from_sensor[1]<<8) | digital_values_from_sensor[0];
- y_value_ADC_value_from_accelerometer = (digital_values_from_sensor[3]<<8) | digital_values_from_sensor[2];
- z_value_ADC_value_from_accelerometer = (digital_values_from_sensor[5]<<8) | digital_values_from_sensor[4];
- //giving initial values
- x_value_ADC_value_from_accelerometer -= x_axis_0g_point;
- y_value_ADC_value_from_accelerometer -= y_axis_0g_point;
- z_value_ADC_value_from_accelerometer = z_value_ADC_value_from_accelerometer - z_axis_0g_point;
- }
- void process_on_accelerometer_date(void){
- int x_value_signed;
- int y_value_signed;
- int z_value_signed;
- float x_scale=7.6;
- float y_scale=7.58;
- float z_scale=7.93;
- signed char LSb_for_2complement;
- int the_value_for_finding_2complement=1024;
- int magnetude_of_acceleration_resulten;
- float sensor_reading_in_g_for_x;
- float sensor_reading_in_g_for_y;
- float sensor_reading_in_g_for_z;
- float angle_reading_in_radian;
- ////////////////////////////////////////////////////////
- LSb_for_2complement = x_value_ADC_value_from_accelerometer>>9;
- if(LSb_for_2complement==1){
- x_value_signed = (x_value_ADC_value_from_accelerometer - the_value_for_finding_2complement)*x_scale;
- }
- else
- {
- x_value_signed = x_value_ADC_value_from_accelerometer * x_scale;
- }
- ///////////////////////////////////////////////////////
- LSb_for_2complement = y_value_ADC_value_from_accelerometer>>9;
- if(LSb_for_2complement==1){
- y_value_signed = (y_value_ADC_value_from_accelerometer - the_value_for_finding_2complement)*y_scale;
- }
- else
- {
- y_value_signed = y_value_ADC_value_from_accelerometer * y_scale;
- }
- ///////////////////////////////////////////////////////
- LSb_for_2complement = z_value_ADC_value_from_accelerometer>>9;
- if(LSb_for_2complement==1){
- z_value_signed = (z_value_ADC_value_from_accelerometer - the_value_for_finding_2complement)*z_scale;
- }
- else
- {
- z_value_signed = z_value_ADC_value_from_accelerometer * z_scale;
- }
- /////////////////////////////////////////////////////////
- sensor_reading_in_g_for_x = (float)x_value_signed/1000; //conversion for x,y,z to g
- sensor_reading_in_g_for_y = (float)y_value_signed/1000;
- sensor_reading_in_g_for_z=(float)z_value_signed/1000;
- magnetude_of_acceleration_resulten = 1000*sqrt((sensor_reading_in_g_for_x * sensor_reading_in_g_for_x) + (sensor_reading_in_g_for_y * sensor_reading_in_g_for_y) + (sensor_reading_in_g_for_z * sensor_reading_in_g_for_z)); //unclear why multiply by 400 ???
- //finding angle for xy plane
- angle_reading_in_radian = acos( (float)x_value_signed / magnetude_of_acceleration_resulten );
- angle_x_from_accelerometer = (angle_reading_in_radian*180/PI);
- //finding angle for xz plane
- angle_reading_in_radian = acos( (float)y_value_signed / magnetude_of_acceleration_resulten );
- angle_y_from_accelerometer = (angle_reading_in_radian*180/PI);
- //finding angle for yz plane
- angle_reading_in_radian = acos( (float)z_value_signed / magnetude_of_acceleration_resulten );
- angle_z_from_accelerometer = (angle_reading_in_radian*180/PI);
- }
- void main(void)
- {
- // Declare your local variables here
- // Input/Output Ports initialization
- // Port A initialization
- // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
- // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
- PORTA=0x00;
- DDRA=0x00;
- // Port B initialization
- // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
- // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
- PORTB=0x00;
- DDRB=0x00;
- // Port C initialization
- // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
- // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
- PORTC=0x00;
- DDRC=0x00;
- // Port D initialization
- // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
- // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
- PORTD=0x00;
- DDRD=0x00;
- // Timer/Counter 0 initialization
- // Clock source: System Clock
- // Clock value: 1000.000 kHz
- // Mode: Normal top=FFh
- // OC0 output: Disconnected
- TCCR0=0x00;
- TCNT0=0x00;
- OCR0=0x00;
- // Timer/Counter 1 initialization
- // Clock source: System Clock
- // Clock value: Timer 1 Stopped
- // Mode: Normal top=FFFFh
- // OC1A output: Discon.
- // OC1B output: Discon.
- // Noise Canceler: Off
- // Input Capture on Falling Edge
- // Timer 1 Overflow Interrupt: Off
- // Input Capture Interrupt: Off
- // Compare A Match Interrupt: Off
- // Compare B Match Interrupt: Off
- TCCR1A=0x00;
- TCCR1B=0x00;
- TCNT1H=0x00;
- TCNT1L=0x00;
- ICR1H=0x00;
- ICR1L=0x00;
- OCR1AH=0x00;
- OCR1AL=0x00;
- OCR1BH=0x00;
- OCR1BL=0x00;
- // Timer/Counter 2 initialization
- // Clock source: System Clock
- // Clock value: Timer 2 Stopped
- // Mode: Normal top=FFh
- // OC2 output: Disconnected
- ASSR=0x00;
- TCCR2=0x00;
- TCNT2=0x00;
- OCR2=0x00;
- // External Interrupt(s) initialization
- // INT0: Off
- // INT1: Off
- // INT2: Off
- MCUCR=0x00;
- MCUCSR=0x00;
- // Timer(s)/Counter(s) Interrupt(s) initialization
- TIMSK=0x01;
- // Analog Comparator initialization
- // Analog Comparator: Off
- // Analog Comparator Input Capture by Timer/Counter 1: Off
- ACSR=0x80;
- SFIOR=0x00;
- // I2C Bus initialization
- i2c_init();
- // LCD module initialization
- lcd_init(16);
- // Global enable interrupts
- #asm("sei")
- while (1)
- {
- getting_initails_from_gyro();
- start_with_accelerometer();
- while(1){
- measuring_acceleration();
- process_on_accelerometer_date();
- reading_data_from_gyro();
- gyro_angle_calculation();
- _lcd_ready();
- lcd_clear();
- //show X
- lcd_gotoxy(0,0);
- lcd_putsf("X");
- itoa(angle_x_from_accelerometer,buffer);
- lcd_puts(buffer);
- lcd_gotoxy(0,1);
- lcd_putsf("X");
- itoa(x_angle_gyro,buffer);
- lcd_puts(buffer);
- //show Y
- lcd_gotoxy(5,0);
- lcd_putsf("Y");
- itoa(angle_y_from_accelerometer,buffer);
- lcd_puts(buffer);
- lcd_gotoxy(5,1);
- lcd_putsf("Y");
- itoa(y_angle_gyro,buffer);
- lcd_puts(buffer);
- //show Z
- lcd_gotoxy(10,0);
- lcd_putsf("Z");
- itoa(angle_z_from_accelerometer,buffer);
- lcd_puts(buffer);
- lcd_gotoxy(10,1);
- lcd_putsf("Z");
- itoa(z_angle_gyro,buffer);
- lcd_puts(buffer);
- }
- };
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement