查看: 5628|回复: 26
|
湿度感应系统的电路(新问题)CCS C Compiler Version 3.41和Version 4.092的差别
[复制链接]
|
|
发表于 1-12-2008 03:05 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 26-11-2008 12:47 PM
|
显示全部楼层
首先要谢谢版主的加分鼓励,更要谢谢你为我指点迷津。
原帖由 pic 于 26-11-2008 08:37 AM 发表 你这样很麻烦, 你其实可以把R2改成VR/POT, 一样可以改变Freq。
你说的R2,是指C3,那个代表湿度感应器的capacitor吗?VR/POT是否就是Varistor,Housing and potting flame retardant to UL 94 V-0 HighE series呢?是不是直接拿VR/POT代替C3就可以了?我刚试过,但却行不通。。。是否我误解了你的意思呢?
原帖由 pic 于 26-11-2008 08:37 AM 发表 其实, 还要配合EEprom 才会准确, 你并没有完全的模拟。如果只是要产生Freq, 也可以用Proteus 的Freq generator.。
我刚试过了。我是用 DPATTERN GENERATOR,然后 Pulse width 放 50us,也勾了Equal Mark/Space Timing。根据那个Program,LCD显示的湿度数据理应是50%,但得到的数据还是一直飘浮不定。
我也试过用DCLOCK,Period放50us,得到的数据还是一样飘浮不定。
我发现VSM Oscilloscope显示出很不稳定的Pulse。是不是这个原因而使到我的湿度数据的不稳定的?没错的话,用CLOCK应该是最稳定了的。。。但还是行不通。。。但在我买的时候,直接用Hardware来测试时,却是完全没这个问题。。。
原帖由 pic 于 26-11-2008 08:37 AM 发表 我怀疑那个code可以用, 你可以放完整厂家提供的C code 吗?
我是有从商家那得到一个挺复杂的C code。经过我和商家的讨论研究后,才做我现在这个简单的C code。以下是那个原本的C code。
////////////////////////////////////////////////////////
// Humidity and temperature sensor
////////////////////////////////////////////////////////
// PIN_A0 = Temperature sensor (LM35)
// PIN_C0 = Humidity sensor
// PIN_C1 = Switch (Demo/Real mode)
// PORTB = LCD Module
////////////////////////////////////////////////////////
// - LCD display the Temperature, Humidity and Memory status
////////////////////////////////////////////////////////
#include <16f876A.h>
#device adc=10 //set 10-bit adc (5mV sensitiviy)
#use delay(clock=20000000)
#use rs232(baud=9600,xmit=PIN_C6,rcv=PIN_C7,PARITY=N)
#fuses hs,noprotect,nowdt,nolvp
#define use_portb_lcd TRUE
#include <lcd.c>
#byte PORTA=5 //define PORT A address
#byte PORTB=6 //define PORT B address
#byte PORTC=7 //define PORT C address
int Temp_value=0;
int Hum_value=0;
long timer_cnt=0;
long timer_set=0;
int start=1;
int add=0;
int add_tmp=0;
int total_data=0;
char rx=0;
int sw1_set=0;
int demo=0;
#int_rda //Serial port interrupt
void serial_isr(){
rx=getc();
if(rx=='d'){ //Received 'd'? (Download data)
add_tmp=0;
printf("\f"); //Clear screen
printf("\rTotal Data: %u\n",total_data);
do{ //Read data from eeprom
Temp_value=read_eeprom(add_tmp);
Hum_value=read_eeprom(add_tmp+1);
printf("\r%u: \tTemp:%u'C ;\tHum: %u\n",add_tmp/2+1,Temp_value,Hum_value);
add_tmp+=2;
}while(add_tmp<total_data*2);
}
if(rx=='c'){ //Received 'c'? (Clear Memory)
add_tmp=0;
do{
write_eeprom(add_tmp,0xff); //set all eeprom to 0xff
add_tmp++;
}while(add_tmp<255);
write_eeprom(255,0); //Total data =0
add=0;
total_data=0;
start=1; //Start again
printf("\rMemory Clear\n");
lcd_gotoxy(4,2);
printf(lcd_putc," ");
}
}
main()
{
set_tris_a(0b00000001); //Initialize input/output pin
set_tris_b(0b00000000); //0: output; 1: input
set_tris_c(0b10000011);
setup_port_a(ALL_ANALOG); //analog setup
setup_adc(ADC_CLOCK_INTERNAL);
set_adc_channel(0); //Set adc pin at A0
delay_ms(10);
enable_interrupts(int_rda); //Enable rs232 interrupt
enable_interrupts(GLOBAL);
lcd_init(); //Initialize LCD
delay_ms(100);
lcd_putc("\fTp: Hum: ");
lcd_putc("\nMm: Mod:Real");
timer_set=18000;
delay_ms(100);
if(read_eeprom(255)!= 0xff){ //Read total value from eeprom
total_data=read_eeprom(255);
add=total_data*2; //Continue data reading
}
lcd_gotoxy(5,2);
printf(lcd_putc,"%u",total_data);
do{
///////////////////////////////////////
// Switch input (Demo/Real mode)
///////////////////////////////////////
if(input(PIN_C1)==0 && sw1_set==0){
sw1_set=1;
demo=1;
lcd_gotoxy(13,2);
printf(lcd_putc,"Demo"); //Display demo at lcd
timer_set=10; //timing= 10 x 100msec= 1sec
}
if(input(PIN_C1)==1 && sw1_set==1){
sw1_set=2;
}
if(input(PIN_C1)==0 && sw1_set==2){
sw1_set=3;
demo=0;
lcd_gotoxy(13,2);
printf(lcd_putc,"Real"); //Display real at lcd
timer_set=18000; //timing= 18000x100msec=30min
}
if(input(PIN_C1)==1 && sw1_set==3){
sw1_set=0;
}
///////////////////////////////////////
// Timer process (1sec/30min)
///////////////////////////////////////
if(timer_cnt>=timer_set || start==1){
timer_cnt=0;
start=0;
//Temperature reading
Temp_value=read_adc()/2;
lcd_gotoxy(4,1);
printf(lcd_putc,"%u'C",Temp_value); //Display the temperature at LCD
//Humidity reading
Hum_value=0;
do{
}while(input(PIN_C0)==1);
do{
}while(input(PIN_C0)==0);
do{
delay_us(1); //Detect high frequency
Hum_value++;
}while(input(PIN_C0)==1);
do{ //Detect low frequency
delay_us(1);
Hum_value++;
}while(input(PIN_C0)==0);
lcd_gotoxy(13,1);
printf(lcd_putc,"%u ",Hum_value); //Display the humidity at LCD
if(add<250){
write_eeprom(add,Temp_value); //save eeprom
write_eeprom(add+1,Hum_value);
add+=2; //add + 2
total_data++;
write_eeprom(255,total_data); //save total data
lcd_gotoxy(4,2);
printf(lcd_putc,"%u ",total_data);
}else{
lcd_gotoxy(4,2);
printf(lcd_putc,"FULL");
}
}
timer_cnt++;
delay_ms(100); //delay 100msec
}while(1);
}
感觉上这好像也不是厂家的C CODE,像是那商家自己写的。这个C CODE有用到RS232来接去电脑。而里面提到的EEPROM也不像是跟DATASHEET那样,用来算湿度,而只是用来储存湿度数据而已,但我并不清楚是那 HH10D 还是 PIC 的 EEPROM。
[ 本帖最后由 Ha_He_Hi_Ho_Hu 于 26-11-2008 12:58 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 26-11-2008 08:17 AM
|
显示全部楼层
回复 1# Ha_He_Hi_Ho_Hu 的帖子
很用心发问, 有交代来龙去脉, 有说明应用, 有图解,有说明问题, 和遇到的问题,有努力尝试做过,值得加分鼓励。 |
|
|
|
|
|
|
|
发表于 26-11-2008 08:37 AM
|
显示全部楼层
原帖由 Ha_He_Hi_Ho_Hu 于 25-11-2008 04:27 PM 发表
1。因为Proteus没有这个 ICM7555 的 Simulator Module,所以我用NE555来代替,请问可以吗?
可以。
2。用不一样的Capacitor Components,请问行得通吗?
你这样很麻烦, 你其实可以把R2改成VR/POT, 一样可以改变Freq。
在Proteus里,有很多款的Capacitor,而我只是直接买了个HH10D Humidity SensorModule,并不知道它是用哪一种Components,所以我一概用CAP (Generic non-electrolyticcapacitor)来替代,请问行得通吗?
可以。
3。湿度感应器的电路接法不对?
我没有在Proteus接过感应的电路,如果像我上面的接法,是不是完全错了?我把湿度感应器完全当成是一个Capacitor。。。
其实, 还要配合EEprom 才会准确, 你并没有完全的模拟。
如果只是要产生Freq, 也可以用Proteus 的Freq generator.。
我怀疑那个code可以用, 你可以放完整厂家提供的C code 吗? |
|
|
|
|
|
|
|
发表于 27-11-2008 11:27 AM
|
显示全部楼层
原帖由 Ha_He_Hi_Ho_Hu 于 26-11-2008 12:47 PM 发表
你说的R2,是指C3,那个代表湿度感应器的capacitor吗?VR/POT是否就是Varistor,Housing and pottingflame retardant to UL 94 V-0 HighEseries呢?是不是直接拿VR/POT代替C3就可以了?我刚试过,但却行不通。。。是否我误解了你的意思呢?.
误解了。 是R2, 不是C3。
555 的目的是产生Freq, 而湿度的sensor 是“C3”, 改变C3 或R2 都会有同样的结果, 就是Freq 改变。
所以把R2改成Pot是方便改变Freq 输出频率。
我刚试过了。我是用 DPATTERN GENERATOR,然后 Pulse width 放 50us,也勾了Equal Mark/Space Timing。根据那个Program,LCD显示的湿度数据理应是50%,但得到的数据还是一直飘浮不定。
我也试过用DCLOCK,Period放50us,得到的数据还是一样飘浮不定。
应该是程序的问题, 那个程序只是非常简单的量Freq, 不精确。
感觉上这好像也不是厂家的C CODE,像是那商家自己写的。这个CCODE有用到RS232来接去电脑。而里面提到的EEPROM也不像是跟DATASHEET那样,用来算湿度,而只是用来储存湿度数据而已,但我并不清楚是那 HH10D 还是 PIC 的 EEPROM。
程序完全是最简单和不精确的, 也没有读取Calibration value。
write_eeprom(), read_eeprom() 是16F 的internal EEprom。 |
|
|
|
|
|
|
|
楼主 |
发表于 27-11-2008 12:37 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 27-11-2008 01:47 PM
|
显示全部楼层
原帖由 Ha_He_Hi_Ho_Hu 于 27-11-2008 12:37 PM 发表
可是那个是HH10D Module里已经定好了的,如果换去POT的话,不就跟它的电路不一样了吗?
是要你在Proteus 哪里, 也就是你的Proteus R4 500K 改成Pot, 那么你就不需要换一直换Proteus 的C3 来模拟不同的Freq 输出。
你Zip 你的Proteus+ C code+ .cof, 我有空时试试看如何不稳。 (放一个link 下载)
不久前我客户的产品中也有湿度计, 我是用Sensirion SHT10, Hope 的HHT02, 数码输出,类似I2C , 直接输出就是湿度+ 温度。 |
|
|
|
|
|
|
|
楼主 |
发表于 27-11-2008 03:01 PM
|
显示全部楼层
原帖由 pic 于 27-11-2008 01:47 PM 发表
是要你在Proteus 哪里, 也就是你的Proteus R4 500K 改成Pot, 那么你就不需要换一直换Proteus 的C3 来模拟不同的Freq 输出。
你Zip 你的Proteus+ C code+ .cof, 我有空时试试看如何不稳。 (放一个link 下载)
不久前我客户的产品中也有湿度计, 我是用Sensirion SHT10, Hope 的HHT02, 数码输出,类似I2C , 直接输出就是湿度+ 温度。
我试R4 500K 改成Pot-HG了。但数据还是很不稳定。
不好意思。。。请问要怎样放link来让人下载呢? |
|
|
|
|
|
|
|
发表于 27-11-2008 04:41 PM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 27-11-2008 09:17 PM
|
显示全部楼层
原帖由 时日无多 于 27-11-2008 04:41 PM 发表
SCL和SDA没有上拉电阻
嗯。。。因为我目前的程式没有用到那个M24C01 EEPROM,所以我的问题应该暂时跟它没关系。
而HH10D的DATASHEET说可以直接接去Microcontroller的。 |
|
|
|
|
|
|
|
发表于 29-11-2008 07:50 AM
|
显示全部楼层
|
|
|
|
|
|
|
楼主 |
发表于 1-12-2008 11:43 AM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 1-12-2008 12:11 PM
|
显示全部楼层
原帖由 Ha_He_Hi_Ho_Hu 于 1-12-2008 11:43 AM 发表
哦!谢谢你!我已经上传了。
加了:
1. int16 Hum_value=0; // Use 16bit
2. Hum_value=0; // reset to zero- ////////////////////////////////////////////////////////
- // Humidity sensor
- ////////////////////////////////////////////////////////
- // PIN_C0 = Humidity sensor
- // PORTB = LCD Module
- ////////////////////////////////////////////////////////
- // - LCD display the Humidity
- ////////////////////////////////////////////////////////
- #include <16f877.h>
- #use delay(clock=20000000)
- #fuses hs,noprotect,nowdt,nolvp
- #define use_portb_lcd TRUE
- #include <lcd.c>
- #byte PORTB=6 //define PORT B address
- #byte PORTC=7 //define PORT C address
- void main()
- {
- int16 Hum_value=0; // Use 16bit
- set_tris_b(0b00000000); //0: output; 1: input
- set_tris_c(0b10000011);
- lcd_init(); //Initialize LCD
- delay_ms(100);
- do
- {
- Hum_value=0; // reset to zero
- //Measure humidity
- do{
- }while(input(PIN_C0)==1);
- //Do nothing for the first cycle
- do{
- }while(input(PIN_C0)==0);
- do{
- delay_us(1); //Detect high frequency
- Hum_value++;
- }while(input(PIN_C0)==1);
- do{
- delay_us(1); //Detect low frequency
- Hum_value++;
- }while(input(PIN_C0)==0);
- printf(lcd_putc,"Humidity Now:%lu",Hum_value); //Display the humidity at LCD
- //1us will increase 1%RH
- //if duty cycle = 50us, then RH = 50%
- delay_ms(1000); //avoid reading unstable
-
- lcd_putc("\f"; //clear the LCD
-
- }while(1);
- }
复制代码 |
|
|
|
|
|
|
|
楼主 |
发表于 1-12-2008 01:21 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 1-12-2008 01:38 PM
|
显示全部楼层
原帖由 Ha_He_Hi_Ho_Hu 于 1-12-2008 01:21 PM 发表
如果我有其他问题的话,是要在这个帖里继续求助,还是另外开一个专门的帖呢?
就继续吧。。。连贯性。。。 |
|
|
|
|
|
|
|
楼主 |
发表于 1-5-2009 06:16 PM
|
显示全部楼层
各位大大,不好意思,我又遇到问题了。。。
我想问,CCS C Compiler Version 3.41和CCS C Compiler Version 4.092的差别有什么方法能减少呢?
在这个Project里,我是用CCS C Compiler Version 3.41来写和Compile我的Program。
因为一些原因,我在一个店家的帮助下,使用了他的CCS C Compiler Version 4.092 来写和Compile我的Program。
之后,我发现到这两个Version所Compile的差别是有这么大的!
就像我之前说的,我的Program是量Freq的。虽然不准确,但我之后会在Calibrate它。
最大的问题就出在这个Freq的测量计算。
首先我就说用Proteus ISIS的Simulation结果吧!
为了方便,我把那个繁复的Humidity Module换成了Frequency Generator(Digital Type: Pattern;Pulse Width: 65u)。
如果是用CCS C Compiler Version 3.41的话,LCD显示的数据是36。
如果是用CCS C Compiler Version 4.092 的话,LCD显示的数据是55。
差很远!
之后我也把个别Program load了进去我的PIC,放在我的Circuit走。但是,答案还是一样。
我暂时不管当时的Humidity真正是多少,但我的LCD的显示:
如果是用CCS C Compiler Version 3.41的话,LCD显示的数据是41。
如果是用CCS C Compiler Version 4.092 的话,LCD显示的数据是60。
差很远!
一开始我以为是Program Code的问题。。。这两个Compiler的Program Code的差别就只有
CCS C Compiler Version 4.092:setup_port_a(AN0_AN1_AN3);
CCS C Compiler Version 3.41:setup_adc_ports( RA0_RA1_RA3_ANALOG );
因为我是用RA4来成为那个Humidity Sensor的Input,所以我以为有分别。但经我查证过后,发现到A4是不会成为analog input pin的,就算用setup_adc_ports( ALL_ANALOG );也没关系。所以应该不关这个的问题。
我会用CCS C Compiler Version 3.41这个旧版本是因为。。。是那个店家给的,不知从哪得来的不合法软件。。。(请不要Shoot我。。。一个穷学生买不起正版的。。。)
所以,想请问各位大大,你们有什么方法能够解决这个不同版本的问题吗?
如果有什么不方便的,也可以PM我。。。谢谢大家!
[ 本帖最后由 Ha_He_Hi_Ho_Hu 于 1-5-2009 07:38 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 3-5-2009 10:30 AM
|
显示全部楼层
原帖由 Ha_He_Hi_Ho_Hu 于 1-5-2009 06:16 PM 发表
各位大大,不好意思,我又遇到问题了。。。
我想问,CCS C Compiler Version 3.41和CCS C Compiler Version 4.092的差别有什么方法能减少呢?
在这个Project里,我是用CCS C Compiler Version 3.41来写和Compi ...
我不清楚差别在那里。
不过如果这样, 直接用v3 compile不久可以了吗?
有什么东西一定要v4才有吗? |
|
|
|
|
|
|
|
楼主 |
发表于 4-5-2009 10:07 PM
|
显示全部楼层
原帖由 fritlizt 于 3-5-2009 10:30 AM 发表
我不清楚差别在那里。
不过如果这样, 直接用v3 compile不久可以了吗?
有什么东西一定要v4才有吗?
这位大大说的v3和v4是version3和version4吗?我就是不清楚。。。
但可以肯定的是,这两个version显示的数据有蛮大的差别。。。可能是所制造的.HEX FILE不一样吧。。。 |
|
|
|
|
|
|
|
发表于 5-5-2009 08:21 PM
|
显示全部楼层
原帖由 Ha_He_Hi_Ho_Hu 于 4-5-2009 10:07 PM 发表
这位大大说的v3和v4是version3和version4吗?我就是不清楚。。。
但可以肯定的是,这两个version显示的数据有蛮大的差别。。。可能是所制造的.HEX FILE不一样吧。。。
如果是一样的code , 那很可能是compiler 的bug... |
|
|
|
|
|
|
| |
本周最热论坛帖子
|