Вы находитесь на странице: 1из 4

/*****************************************************

This program was produced by the


CodeWizardAVR V2.03.4 Standard
Automatic Program Generator
© Copyright 1998-2008 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 7/28/2010
Author :
Company :
Comments:

Chip type : ATmega8535L


Program type : Application
Clock frequency : 4.000000 MHz
Memory model : Small
External RAM size : 0
Data Stack size : 128
*****************************************************/
#include <mega8535.h>
// Standard Input/Output functions
#include <stdio.h>
#include <delay.h>
#include <math.h>
// Declare your global variables here
#define CS PORTB.2
#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<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)
// 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;
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")
while (1)
{
int gx,gy,gz,gy2;
//float gy2;
vX=read_HC(0);
vY=read_HC(1);
vZ=read_HC(2);
vRef=read_HC(3);
gx=(vX-vRef)*0.22;
gy=(vY-vRef)*0.22;
gz=(vZ-vRef)*0.22;
printf("21+2 %03d %03d %03d\n\r",gx,gy,gz);
delay_ms(150);
};
}

Вам также может понравиться