|
发表于 2008-4-10 17:40:00
|
显示全部楼层
谢谢马老师,我用AVR STDIO 编译程序产生的文件是不是会占很大的空间啊,我只要500行的程序,4K 的flash去写不下.
下面是我的程序却占6k还是我什么地方没有设置好啊?
请指点下
#include <avr/io.h>
#include <avr/interrupt.h>
//#include <avr/signal.h>
//#include <intrins.h> //Keil library (is used for _nop()_ operation)
#include <math.h> //Keil library
#include <stdio.h> //Keil library
void calc_sth11(float *p_humidity ,float *p_temperature);
//#include <avr/iomxx.h>
unsigned int OCR0A_v1,OCR0B_v2,OCR1A_v3;
typedef union
{ unsigned int i;
float f;
} value;
enum {TEMP,HUMI};
#define noACK 0
#define ACK 1
#define SETDATA( ) PORTC|=1<<PC0
#define CLRDATA( ) PORTC&=~(1<<PC0)
#define SETSCK( ) PORTC|=1<<PC1
#define CLRSCK( ) PORTC&=~(1<<PC1)
//adr command r/w
#define STATUS_REG_W 0x06 //000 0011 0
#define STATUS_REG_R 0x07 //000 0011 1
#define MEASURE_TEMP 0x03 //000 0001 1
#define MEASURE_HUMI 0x05 //000 0010 1
#define RESET 0x1e //000 1111 0
//sck接PC1,DATA接PC0
char s_write_byte(unsigned char value)
{ //PC0,PC1为输出
unsigned char i,error=0;
DDRC|=0X03;
for(i=0x80;i>0;i/=2) //shift bit for masking
{ if (i & value)
SETDATA( ); //masking value with i , write to SENSI-BUS
else CLRDATA( );
// _nop_();
;
SETSCK(); //clk for SENSI-BUS
;;; //pulswith approx. 5 us
CLRSCK();
}
SETDATA(); //release DATA-line
DDRC|=0X02;
DDRC&=0XFE;
SETSCK( ); //clk #9 for ack
;
error=((PINC>>1)&0x01); //check ack (DATA will be pulled down by SHT11)
;
CLRSCK();
return error; //error=1 in case of no acknowledge
}
char s_read_byte(unsigned char ack)
// reads a byte form the Sensibus and gives an acknowledge in case of "ack=1"
{
unsigned char i,val=0;
DDRC=0X03;
SETDATA(); //release DATA-line
for (i=0x80;i>0;i/=2) //shift bit for masking
{ SETSCK(); //clk for SENSI-BUS
;;;
DDRC|=0X02;
DDRC&=0XFE;
if ((PINC>>1)&0x01) val=(val | i); //read bit
CLRSCK();
;;;
}
DDRC=0X03; //输出
if(!ack)
SETDATA();
else CLRDATA(); //in case of "ack==1" pull down DATA-Line
SETSCK(); //clk #9 for ack
;;; //pulswith approx. 5 us
CLRSCK();
SETDATA(); //release DATA-line
return val;
}
void s_transstart(void)
//----------------------------------------------------------------------------------
// generates a transmission start
// _____ ________
// DATA: |_______|
// ___ ___
// SCK : ___| |___| |______
{ DDRC=0X03;
SETDATA(); CLRSCK(); //Initial state
;
SETSCK();
;
CLRDATA();
;
CLRSCK();
;;;
CLRSCK();
;
SETDATA();
;
CLRSCK();
}
void s_connectionreset(void)
//----------------------------------------------------------------------------------
// communication reset: DATA-line=1 and at least 9 SCK cycles followed by transstart
// _____________________________________________________ ________
// DATA: |_______|
// _ _ _ _ _ _ _ _ _ ___ ___
// SCK : __| |__| |__| |__| |__| |__| |__| |__| |__| |______| |___| |______
{
unsigned char i;
DDRC=0X03;
SETDATA(); CLRSCK(); //Initial state
for(i=0;i<9;i++) //9 SCK cycles
{SETSCK();
;;
CLRSCK();
;;
}
s_transstart(); //transmission start
}
//----------------------------------------------------------------------------------
char s_softreset(void)
//----------------------------------------------------------------------------------
// resets the sensor by a softreset
{
unsigned char error=0;
s_connectionreset(); //reset communication
error+=s_write_byte(RESET); //send RESET-command to sensor
return error; //error=1 in case of no response form the sensor
}
//----------------------------------------------------------------------------------
char s_read_statusreg(unsigned char *p_value, unsigned char *p_checksum)
//----------------------------------------------------------------------------------
// reads the status register with checksum (8-bit)
{
unsigned char error=0;
s_transstart(); //transmission start
error=s_write_byte(STATUS_REG_R); //send command to sensor
*p_value=s_read_byte(ACK); //read status register (8-bit)
*p_checksum=s_read_byte(noACK); //read checksum (8-bit)
return error; //error=1 in case of no response form the sensor
}
//----------------------------------------------------------------------------------
char s_write_statusreg(unsigned char *p_value)
//----------------------------------------------------------------------------------
// writes the status register with checksum (8-bit)
{
unsigned char error=0;
s_transstart(); //transmission start
error+=s_write_byte(STATUS_REG_W);//send command to sensor
error+=s_write_byte(*p_value); //send value of status register
return error; //error>=1 in case of no response form the sensor
}
//----------------------------------------------------------------------------------
char s_measure(unsigned char *p_value, unsigned char *p_checksum, unsigned char mode)
//----------------------------------------------------------------------------------
// makes a measurement (humidity/temperature) with checksum
{
unsigned error=0;
unsigned int i;
s_transstart(); //transmission start
switch(mode){ //send command to sensor
case TEMP : error+=s_write_byte(MEASURE_TEMP); break;
case HUMI : error+=s_write_byte(MEASURE_HUMI); break;
default : break;
}
DDRC|=0X02;
DDRC&=0XFE;
for (i=0;i<65535;i++) if(((PINC>>1)&0x01)==0) break; //wait until sensor has finished the measurement
if((PINC>>1)&0x01) error+=1; // or timeout (~2 sec.) is reached
*(p_value) =s_read_byte(ACK); //read the first byte (MSB)
*(p_value+1)=s_read_byte(ACK); //read the second byte (LSB)
*p_checksum =s_read_byte(noACK); //read checksum
return error;
}
void calc_sth11(float *p_humidity ,float *p_temperature)
//----------------------------------------------------------------------------------------
// calculates temperature [癈] and humidity [%RH]
// input : humi [Ticks] (12 bit)
// temp [Ticks] (14 bit)
// output: humi [%RH]
// temp [癈]
{ const float C1=-4.0; // for 12 Bit
const float C2=+0.0405; // for 12 Bit
const float C3=-0.0000028; // for 12 Bit
const float T1=+0.01; // for 14 Bit @ 5V
const float T2=+0.00008; // for 14 Bit @ 5V
float rh=*p_humidity; // rh: Humidity [Ticks] 12 Bit
float t=*p_temperature; // t: Temperature [Ticks] 14 Bit
float rh_lin; // rh_lin: Humidity linear
float rh_true; // rh_true: Temperature compensated humidity
float t_C; // t_C : Temperature [癈]
t_C=t*0.01 - 40; //calc. temperature from ticks to [癈]
rh_lin=C3*rh*rh + C2*rh + C1; //calc. humidity from ticks to [%RH]
rh_true=(t_C-25)*(T1+T2*rh)+rh_lin; //calc. temperature compensated humidity [%RH]
if(rh_true>100)rh_true=100; //cut if the value is outside of
if(rh_true<0.1)rh_true=0.1; //the physical possible range
*p_temperature=t_C; //return temperature [癈]
*p_humidity=rh_true; //return humidity[%RH]
}
//--------------------------------------------------------------------
float calc_dewpoint(float h,float t)
//--------------------------------------------------------------------
// calculates dew point
// input: humidity [%RH], temperature [癈]
// output: dew point [癈]
{ float logEx,dew_point;
// logEx=0.66077+7.5*t/(237.3+t)+(log10(h)-2); //???
dew_point = (logEx - 0.66077)*237.3/(0.66077+7.5-logEx);
return dew_point;
}
void time0_init()
{
TCCR0B=0X00;
//OCR0A=0X7F;
// OCR0B=0X7F;
TIMSK0=0X01;
TCCR0A=0XB3;//1分频快速PWM模式
TCCR0B=0X01;
}
/*time1_init()
{TCCR1B=0X00;
//OCR1AH=0X00;
// OCR1AL=0XFF;
TCCR1A=0X82;//8分频,8位精度快速PWM模式
TCCR1B=0X12;
TCCR1C=0X00;
}
port_init()
{DDRD&=0XF3; //PD3 DP2 为按键输入
DDRD|=0XC0;
DDRB|=0X06;
}
*/
//----------------------------------------------------------------------------------
int main()
//----------------------------------------------------------------------------------
// sample program that shows how to use SHT11 functions
// 1. connection reset
// 2. measure humidity [ticks](12 bit) and temperature [ticks](14 bit)
// 3. calculate humidity [%RH] and temperature [癈]
// 4. calculate dew point [癈]
// 5. print temperature, humidity, dew point
{
DDRD&=0XF3; //PD3 DP2 为按键输入
DDRD|=0X60; // PD5 PD6 为PWM输出
DDRB|=0X06;
unsigned int K;
float v1,v2,v3;
value humi_val,temp_val;
float dew_point;
unsigned char error,checksum;
unsigned int i;
SREG|=0X80;
time0_init();
// time1_init();
// init_uart();
s_connectionreset();
while(1)
{
error=0;
error+=s_measure((unsigned char*) &humi_val.i,&checksum,HUMI); //measure humidity
error+=s_measure((unsigned char*) &temp_val.i,&checksum,TEMP); //measure temperature
if(error!=0) s_connectionreset(); //in case of an error: connection reset
else
{
humi_val.f=(float)humi_val.i; //converts integer to float
temp_val.f=(float)temp_val.i; //converts integer to float
calc_sth11(&humi_val.f,&temp_val.f); //calculate humidity, temperature
dew_point=calc_dewpoint(humi_val.f,temp_val.f); //calculate dew point
// printf("temp:%5.1fC humi:%5.1f%% dew point:%5.1fC
//",temp_val.f,humi_val.f,dew_point);
}
//----------wait approx. 0.8s to avoid heating up SHTxx------------------------------
for (i=0;i<200;i++); //(be sure that the compiler doesn't eliminate this line!)
//-----------------------------------------------------------------------------------
if(++K==1) PORTB|=0X04;
else {PORTB&=0XFB;K=0;}
v1=0.02*(temp_val.f+30);
v2=0.02* humi_val.f;
v3=0.01* humi_val.f;
OCR0A_v1=v1/3.3*0XFF;
OCR0B_v2=v2/3.3*0XFF;
OCR1A_v3=v3/3.3*0XFF;
if (!(PIND&0X04))
{ if(!(PIND&0X08)) //00调0
{ while((!(PIND&0X04))&(!(PIND&0X08))) {OCR0A_v1=0X00,OCR0B_v2=0X00,OCR1A_v3=0X00;}
}
else {while((!(PIND&0X04))&(PIND&0X08))v1=2.0,v2=2.0,v3=1.0;
OCR0A_v1=v1/3.3*0XFF;//01满量程调节
OCR0B_v2=v2/3.3*0XFF;
OCR1A_v3=v3/3.3*0XFF;
}
}
else if((PIND&0X08)==0)
{while((!(PIND&0X08))&(PIND&0X04))
{OCR0A_v1=0X00,OCR0B_v2=0X00,OCR1A_v3=0X00;}
}
}
}
interrupt (TIMER0_OVF)
{OCR0A=OCR0A_v1;
OCR0B=OCR0B_v2;
} |
|