?? prog1.c
字號:
//portc6 y portc7 al display. portc4 reset PIC. PORTC5 enable display.
//#include <iom64v.h>
//#include <shortnametype.h>
//#include <macros.h>
//#include <eeprom.h>
#include <math.h>
#include <ctype.h>
#include <util/delay.h>
#include <inttypes.h>
#include <stdio.h>
#include <stdlib.h>
#include <avr/wdt.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#define ACK 1
#define noACK 0
#define F_CPU 2000000UL
#define HUMIDITY_DDR DDRC
#define HUMIDITY_PIN PINC
#define HUMIDITY_PORT PORTC
#define PIC_DDR DDRB
#define PIC_PIN PINB
#define PIC_PORT PORTB
#define DATAVALID 0x10
#define DATAACCEPTED 0x08
#define RESETPIC 0x20
#define HUMIDITY_DATA 0x01
#define HUMIDITY_SCK 0x02
#define LED 0x04
//adr command r/w
#define HUMIDITY_STATUS_REG_W 0x06 //000 0011 0
#define HUMIDITY_STATUS_REG_R 0x07 //000 0011 1
#define HUMIDITY_MEASURE_TEMP 0x03 //000 0001 1
#define HUMIDITY_MEASURE_HUMI 0x05 //000 0010 1
#define HUMIDITY_RESET 0x1e //000 1111 0
void HumidityInit(void);
void HumidityDelay(void);
void HumidityWriteByte(unsigned char value);
unsigned char HumidityReadByte(unsigned char ack);
void HumidityTransStart(void);
void HumidityConnectionReset(void);
void HumiditySoftReset(void);
unsigned char HumidityReadStatus(void);
void HumidityWriteStatus(unsigned char value);
unsigned int HumidityMeasure(unsigned char mode);
void HumidityCalc(float *p_humidity ,float *p_temperature);
void HumidityGet(float *p_humidity ,float *p_temperature);
void HumidityUpdate(void);
void enviarPIC(unsigned int value);
char presionupdate(void);
void USART_Transmit( unsigned char data );
void USART_Init( unsigned int baud );
unsigned char USART_Receive( void );
unsigned char HumiError = 0;
float Temperature,Humidity;
unsigned int Temp,Hum,presion;
unsigned int tmp1,tmp2,tmp3;
void HumidityDelay(void)
{
//int i;
//for (i=0;i<20;i++) wdt_reset();
_delay_us(5);
}
void HumidityInit(void)
{
HUMIDITY_DDR |= HUMIDITY_DATA + HUMIDITY_SCK;
HUMIDITY_PORT |= HUMIDITY_DATA + HUMIDITY_SCK;
HumiditySoftReset();
}
void HumidityWriteByte(unsigned char value)
{
unsigned char i;
HUMIDITY_DDR |= HUMIDITY_DATA; //DATA-line in output
for (i=0x80;i>0;i/=2) //shift bit for masking
{
HumidityDelay();
if (i & value) HUMIDITY_PORT |= HUMIDITY_DATA;
else HUMIDITY_PORT &= ~HUMIDITY_DATA;
HumidityDelay();
HUMIDITY_PORT |= HUMIDITY_SCK;
HumidityDelay();
HUMIDITY_PORT &= ~HUMIDITY_SCK;
}
HUMIDITY_PORT |= HUMIDITY_DATA; //release DATA-line
HUMIDITY_DDR &= ~HUMIDITY_DATA; //DATA-line in input
HumidityDelay();
HUMIDITY_PORT |= HUMIDITY_SCK; //clk #9 for ack
HumidityDelay();
if (HUMIDITY_PIN & HUMIDITY_DATA) HumiError = 1; //OJO SI NO ACK no hace nada?
HUMIDITY_PORT &= ~HUMIDITY_SCK;
HumidityDelay();
}
unsigned char HumidityReadByte(unsigned char ack) //para mandar ACK ack=1
{
unsigned char i,val=0;
HUMIDITY_PORT |= HUMIDITY_DATA; //release DATA-line
HUMIDITY_DDR &= ~HUMIDITY_DATA; //DATA-line in input
for (i=0x80;i>0;i/=2) //shift bit for masking
{
HumidityDelay();
HUMIDITY_PORT |= HUMIDITY_SCK; //clk for SENSI-BUS
HumidityDelay();
if (HUMIDITY_PIN & HUMIDITY_DATA) val=(val | i); //read bit
HUMIDITY_PORT &= ~HUMIDITY_SCK;
}
if (ack == 1)
{
HUMIDITY_DDR |= HUMIDITY_DATA; //DATA-line in output
HUMIDITY_PORT &= ~HUMIDITY_DATA; //"ack==1" pull down DATA-Line
HumidityDelay();
HUMIDITY_PORT |= HUMIDITY_SCK;
HumidityDelay();
HUMIDITY_PORT &= ~HUMIDITY_SCK;
}
else
{
HumidityDelay();
HUMIDITY_PORT |= HUMIDITY_SCK;
HumidityDelay();
HUMIDITY_PORT &= ~HUMIDITY_SCK;
}
return val;
}
void HumidityTransStart(void)
{
HUMIDITY_DDR |= HUMIDITY_DATA; //DATA-line in output
HUMIDITY_PORT |= HUMIDITY_DATA; //DATA=1
HUMIDITY_PORT &= ~HUMIDITY_SCK; //SCK=0
HumidityDelay();
HUMIDITY_PORT |= HUMIDITY_SCK; //SCK=1
HumidityDelay();
HUMIDITY_PORT &= ~HUMIDITY_DATA; //DATA=0
HumidityDelay();
HUMIDITY_PORT &= ~HUMIDITY_SCK; //SCK=0
HumidityDelay();
HUMIDITY_PORT |= HUMIDITY_SCK; //SCK=1
HumidityDelay();
HUMIDITY_PORT |= HUMIDITY_DATA; //DATA=1
HumidityDelay();
HUMIDITY_PORT &= ~HUMIDITY_SCK; //SCK=0
HumidityDelay();
}
void HumidityConnectionReset(void)
{
unsigned char i;
HUMIDITY_DDR |= HUMIDITY_DATA; //DATA-line in output
HUMIDITY_PORT |= HUMIDITY_DATA; //DATA=1
HUMIDITY_PORT &= ~HUMIDITY_SCK; //SCK=0
for (i=0;i<9;i++) //9 SCK cycles
{
HumidityDelay();
HUMIDITY_PORT |= HUMIDITY_SCK; //SCK=1
HumidityDelay();
HUMIDITY_PORT &= ~HUMIDITY_SCK; //SCK=0
}
HumidityTransStart(); //transmission start
HumiError = 0;
}
void HumiditySoftReset(void)
{
int i;
HumidityConnectionReset(); //Reset communication
HumidityWriteByte(HUMIDITY_RESET); //send Reset-command to sensor
//for (i=0;i<100;i++) HumidityDelay(); // 11ms delay
_delay_ms(11);
}
unsigned int HumidityMeasure(unsigned char mode)
{
unsigned char msb,lsb;
int i,j;
HumidityTransStart(); //transmission start
switch (mode) //send command to sensor
{
case HUMIDITY_MEASURE_TEMP : HumidityWriteByte(HUMIDITY_MEASURE_TEMP);
break;
case HUMIDITY_MEASURE_HUMI : HumidityWriteByte(HUMIDITY_MEASURE_HUMI);
break;
default : break;
}
HUMIDITY_PORT |= HUMIDITY_DATA; //release DATA-line
HUMIDITY_DDR &= ~HUMIDITY_DATA; //DATA-line in input
for (i=0;i<=200000;i++)
{
//for (j=0;j<1;j++)
//{
wdt_reset();
if((HUMIDITY_PIN & HUMIDITY_DATA) == 0) break; //wait until sensor
//}
} //has finished the measure
if(i > 65530)
{
HumiError=1; // or timeout (~2 sec.) is reached
return 0xffff;
}
msb =HumidityReadByte(ACK); //read the first byte (MSB)
lsb=HumidityReadByte(noACK); //read the second byte (LSB)
//tmp =HumidityReadByte(noACK); //dummy read checksum
return (msb<<8)+lsb;
}
void HumidityCalc(float *p_humidity ,float *p_temperature)
{
float C1=-4.0; // for 12 Bit
float C2=+0.0405; // for 12 Bit
float C3=-0.0000028; // for 12 Bit
float T1=+0.01; // for 14 Bit @ 3V
float T2=+0.00008; // for 14 Bit @ 3V
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 [?C]
t_C=t*0.01 - 40; //calc. temperature from ticks to [?C]
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. temp 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 [?C]
*p_humidity=rh_true; //return humidity[%RH]
}
void HumidityGet(float *p_humidity ,float *p_temperature)
{
unsigned int humi_val,temp_val;
humi_val = HumidityMeasure(HUMIDITY_MEASURE_HUMI); //measure humidity
temp_val = HumidityMeasure(HUMIDITY_MEASURE_TEMP); //measure temperature
if(HumiError == 1) HumidityConnectionReset(); //in case of an error: Reset
else
{
*p_humidity=(float)humi_val; //converts integer to float
*p_temperature=(float)temp_val; //converts integer to float
HumidityCalc(p_humidity,p_temperature); //calculate humidity, temperature
}
}
void HumidityUpdate(void)
{
if (HumiError == 1) HumidityInit();
HumidityGet(&Humidity,&Temperature);
Hum = Humidity; //ojo multiplicar para precision
Temp = Temperature * 10;
}
void enviarPIC(unsigned int value)
{
char a[1];
itoa(value,a,10);
PIC_PORT=a[0];
PORTD |= DATAVALID; //DATAVALID=1
while((PIND & DATAACCEPTED) == 0)
{
wdt_reset();
}
PORTD &= ~DATAVALID; //DATAVALID=0
while((PIND & DATAACCEPTED) != 0)
{
wdt_reset();
}
return;
}
void USART_Init( unsigned int baud )
{
/* Set baud rate */
//#define BAUD 9600
//#include <util/setbaud.h>
//UBRRH = UBRRH_VALUE;
//UBRRL = UBRRL_VALUE;
UBRRH = (unsigned char)(baud>>8);
UBRRL = (unsigned char)baud;
/* Enable receiver and transmitter */
UCSRB = (1<<RXEN)|(1<<TXEN);
/* Set frame format: 8data, 1s top bit */
UCSRC = (1<<URSEL)|(3<<UCSZ0);
}
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) )
;
/* Put data into buffer, sends the data */
UDR = data;
}
unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSRA & (1<<RXC)) )
;
/* Get and return received data from buffer */
return UDR;
}
char presionupdate(void)
{
char t1[3],presiontmp[13],signo,t2,t3,t4;
USART_Transmit('g');
wdt_reset();
USART_Transmit('e');
wdt_reset();
USART_Transmit('t');
wdt_reset();
USART_Transmit(13);
for(int j=0;j<=2;j++)
{
t1[j]=USART_Receive();
wdt_reset();
}
wdt_reset();
if(t1[0]=='o' && t1[1]=='k' && t1[2]=='$')
{
for(int i=0;i<=12;i++)
{
presiontmp[i]=USART_Receive();
wdt_reset();
}
signo=presiontmp[0];
if(presiontmp[7]=='-')
{
presion=0;
wdt_reset();
}
else if(presiontmp[7]=='+')
{
t2=presiontmp[1];
t3=presiontmp[3];
t4=presiontmp[4];
if(presiontmp[9]=='0')
{
if(t2=='1')
presion=1;
else if (t2=='2')
presion=2;
else if (t2=='3')
presion=3;
else if (t2=='4')
presion=4;
else if (t2=='5')
presion=5;
else if (t2=='6')
presion=6;
else if (t2=='7')
presion=7;
else if (t2=='8')
presion=8;
else if (t2=='9')
presion=9;
else
presion=0;
}
else if(presiontmp[9]=='1')
{
if(t2=='1')
presion=10;
else if (t2=='2')
presion=20;
else if (t2=='3')
presion=30;
else if (t2=='4')
presion=40;
else if (t2=='5')
presion=50;
else if (t2=='6')
presion=60;
else if (t2=='7')
presion=70;
else if (t2=='8')
presion=80;
else if (t2=='9')
presion=90;
else
presion=0;
if(t3=='1')
presion=presion+1;
else if (t3=='2')
presion=presion+2;
else if (t3=='3')
presion=presion+3;
else if (t3=='4')
presion=presion+4;
else if (t3=='5')
presion=presion+5;
else if (t3=='6')
presion=presion+6;
else if (t3=='7')
presion=presion+7;
else if (t3=='8')
presion=presion+8;
else if (t3=='9')
presion=presion+9;
else if (t3=='0')
presion=presion+0;
//presion=(atoi(t2))*10+atoi(t3);
}
else if(presiontmp[9]=='2')
{
if(t2=='1')
presion=100;
else if (t2=='2')
presion=200;
else if (t2=='3')
presion=300;
else if (t2=='4')
presion=400;
else if (t2=='5')
presion=500;
else if (t2=='6')
presion=600;
else if (t2=='7')
presion=700;
else if (t2=='8')
presion=800;
else if (t2=='9')
presion=900;
else
presion=0;
if(t3=='1')
presion=presion+10;
else if (t3=='2')
presion=presion+20;
else if (t3=='3')
presion=presion+30;
else if (t3=='4')
presion=presion+40;
else if (t3=='5')
presion=presion+50;
else if (t3=='6')
presion=presion+60;
else if (t3=='7')
presion=presion+70;
else if (t3=='8')
presion=presion+80;
else if (t3=='9')
presion=presion+90;
else if (t3=='0')
presion=presion+0;
if(t4=='1')
presion=presion+1;
else if (t4=='2')
presion=presion+2;
else if (t4=='3')
presion=presion+3;
else if (t4=='4')
presion=presion+4;
else if (t4=='5')
presion=presion+5;
else if (t4=='6')
presion=presion+6;
else if (t4=='7')
presion=presion+7;
else if (t4=='8')
presion=presion+8;
else if (t4=='9')
presion=presion+9;
else if (t4=='0')
presion=presion+0;
//presion=(atoi(t2))*100+(atoi(t3))*10+atoi(t4);
}
}
wdt_reset();
}
else presionupdate();
return signo;
}
int main(void)
{
char sign;
wdt_reset();
WDTCR = 0x0f; // wathdog como en 2.2seg
HumidityInit();
USART_Init(12); // 9600 baudios suponiendo fclk=2MHz
PIC_DDR =0xFF; //puerto pic es output
DDRD |= DATAVALID; //data valid es output
DDRD &= ~DATAACCEPTED; //data accepted es input
DDRD |= RESETPIC;
DDRD |= LED;
PORTD &= ~RESETPIC;
_delay_us(100);
PORTD |= RESETPIC;
while(1)
{
wdt_reset();
HumidityUpdate();
tmp1=Hum/100;
tmp2=(Hum-(tmp1*100))/10;
tmp3=(Hum-(tmp1*100)-(tmp2*10));
enviarPIC(tmp1);
enviarPIC(tmp2);
enviarPIC(tmp3);
wdt_reset();
tmp1=Temp/100;
tmp2=(Temp-(tmp1*100))/10;
tmp3=(Temp-(tmp1*100)-(tmp2*10));
enviarPIC(tmp1);
enviarPIC(tmp2);
enviarPIC(tmp3);
wdt_reset();
sign=presionupdate();
PIC_PORT=sign;
PORTD |= DATAVALID; //DATAVALID=1
while((PIND & DATAACCEPTED) == 0)
{
wdt_reset();
}
PORTD &= ~DATAVALID; //DATAVALID=0
while((PIND & DATAACCEPTED) != 0)
{
wdt_reset();
}
tmp1=presion/100;
tmp2=(presion-(tmp1*100))/10;
tmp3=(presion-(tmp1*100)-(tmp2*10));
enviarPIC(tmp1);
enviarPIC(tmp2);
enviarPIC(tmp3);
wdt_reset();
if(sign=='-'||presion<=10)
PORTD |= LED;
else PORTD &= ~LED;
wdt_reset();
}
return(1);
}
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -