佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 5442|回复: 26

湿度感应系统的电路(新问题)CCS C Compiler Version 3.41和Version 4.092的差别

[复制链接]
发表于 1-12-2008 03:05 PM | 显示全部楼层
原帖由 pic 于 1-12-2008 01:38 PM 发表

就继续吧。。。连贯性。。。


OK!谢谢你。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 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 编辑 ]
回复

使用道具 举报

 楼主| 发表于 25-11-2008 04:27 PM | 显示全部楼层 |阅读模式
我现在在做一个Project,是做一个自动湿度控制系统,用在测试气体感应器的测试箱(Humidity Controlled Test Chamber for Application of Gas Sensor Characterization)。

我的Project不用管气体感应器的部分,所以着重在湿度控制系统。但因为这挺复杂的,我以后可能还有问题, 所以我一个一个问题问可以吗?

首先我只是做湿度感应器,PIC和LCD的电路。
Input是湿度感应器,Output是LCD display,而PIC就是Controller。

在这个Project的一开始,我需要用Proteus Isis 来做湿度感应系统的电路,然后Simulate它。但我却遇到了问题。

因为我是用已经做好了的湿度感应器电子,叫做HH10D Humidity Sensor Module,所以我得用Proteus再一次把它的电路再画出来。问题就出在这里了。

我在买这HH10D的时候就叫商家测试它能不能用,发现没问题。而且我也从商家那里拿到了它的PIC C Programming Code(用的软件是CCS PCW C-Compiler)。到我用Proteus来Simulate它的时候,就发现跟Hardware得到的Output不一样。

以下是 HH10D Humidity Sensor Module 的 Data Sheet:






根据以上第二副图,我的Proteus电路是:

C3=Humidity Sensor

根据理论来说,Capacitive增加,湿度跟着增加。
基本上我是没有用到那个M24C01 EEPROM的,但为了完全跟着那HH10D Humidity Sensor Module的电路,所以我把它也放进了我的电路里。

我的 C Programming Code 如下(购买时确定过,没问题):
////////////////////////////////////////////////////////
//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 Baddress
#byte PORTC=7       //define PORT C address

void main()
{
          int Hum_value=0;
          set_tris_b(0b00000000); //0= output; 1= input
          set_tris_c(0b10000011);
          lcd_init();                               //Initialize LCD
          delay_ms(100);

do
{
//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:%u",Hum_value);      //Display the humidity at LCD
                                                                                                  //1us will increase 1%RH
                                                                                                  //if T = 50us, then RH = 50%

           delay_ms(1000);             //avoid reading unstable

            lcd_putc("\f");                  //clear the LCD

           }while(1);
}

我的Simulation Result (C3=10nF):

LCD显示的RH一直变动,幅度很大,一时20%,一时850%。

我的Simulation Result (C3=100pF):

LCD显示的RH也一直变动,但变动的时间很慢,也是时高时低。

从以上的Result就看得出来,我的RH%跟我的Program有很大的不同。
从C3=10nF的例子来看,看得出Oscilloscope的一个full cycle是大约7.5ms。根据我的Program,RH应该是 7.5ms / 1us = 7500%左右。但Simulation的Result却完全不一样。

从C3=100pF的例子来看,看得出Oscilloscope的一个full cycle是大约80us。根据我的Program,RH应该是 80us / 1us = 80%左右。但Simulation的Result却完全不一样。

我不知道那里出了问题,所以想问看各位大大的意见。基本上我觉得有几个问题可能导致这个情况发生,但又不肯定,所以就列出来,请教各位大大。

1。因为Proteus没有这个 ICM7555 的 Simulator Module,所以我用NE555来代替,请问可以吗?
这个 HH10D 用的 Timer 是 ICM7555,但因为Proteus没有这个 ICM7555 的 Simulator Module,所以我用NE555,可以吗? 我上网查了下,基本上它们是一样的,只是ICM7555用比较少电力(consume less power)。以下是我在网上找到的 ICM7555 资料:
  • Exact equivalent in most applications for NE/SE555
  • Low supply current: 80&#181;A (typical)
  • Extremely low trigger, threshold, and reset currents:     20pA (typical)
  • High-speed operation: 500kHz guaranteed
  • Wide operating supply voltage: 3v to 16v  
  • Normal reset function. No crow-barring of supply during     output transition
  • Can be used with higher-impedance timing elements than     the bipolar 555 for longer time constants
  • Timing from microseconds to hours
  • Operates in both astable and monostable modes
  • Adjustable duty cycle
  • Output source/sink driver can drive TTL/CMOS.
以上资料可在http://www.talkingelectronics.com/FreeProjects/555/555-P1.html找到。

2。用不一样的Capacitor Components,请问行得通吗?
在Proteus里,有很多款的Capacitor,而我只是直接买了个HH10D Humidity Sensor Module,并不知道它是用哪一种Components,所以我一概用CAP (Generic non-electrolytic capacitor)来替代,请问行得通吗?

3。湿度感应器的电路接法不对?
我没有在Proteus接过感应的电路,如果像我上面的接法,是不是完全错了?我把湿度感应器完全当成是一个Capacitor。。。

4。其他我完全没头绪的问题
我的电路知识很差,有很多我完全都没想过的问题,所以要请各位大大指教。

其实这只是我Project的一小部分,但却让我碰了一鼻子灰,所以真的希望各位大大能帮助我。

[ 本帖最后由 Ha_He_Hi_Ho_Hu 于 1-5-2009 06:21 PM 编辑 ]

评分

参与人数 1积分 +30 收起 理由
pic + 30 很用心发问, 有交代来龙去脉, 有说明应用

查看全部评分

回复

使用道具 举报

发表于 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.。

4。其他我完全没头绪的问题

我怀疑那个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。
回复

使用道具 举报

Follow Us
 楼主| 发表于 27-11-2008 12:37 PM | 显示全部楼层
原帖由 pic 于 27-11-2008 11:27 AM 发表

误解了。 是R2, 不是C3。
555 的目的是产生Freq, 而湿度的sensor 是“C3”, 改变C3 或R2 都会有同样的结果, 就是Freq 改变。
所以把R2改成Pot是方便改变Freq 输出频率。


你是说那DATASHEET里500k的R2吗?在DIS和TRIG之间的那个?我还以为是我那Proteus电路的R2呢。。。不好意思误解了。。。

可是那个是HH10D Module里已经定好了的,如果换去POT的话,不就跟它的电路不一样了吗?


原帖由 pic 于 27-11-2008 11:27 AM 发表
应该是程序的问题, 那个程序只是非常简单的量Freq, 不精确。


可是当我买的时候,那商家是当着我的面,改写Program,然后用programmer放进PIC的。
那时的湿度数据挺稳定的,都是在50%左右。

原帖由 pic 于 27-11-2008 11:27 AM 发表
程序完全是最简单和不精确的, 也没有读取Calibration value。

write_eeprom(), read_eeprom() 是16F 的internal EEprom。


我也觉得有问题。。。所以我才说那是商家自己写的C CODE。。。虽然当时他展示给我看的时候还OK,但看了那DATASHEET后,就觉得好像不对。

就算那程序不精确,但现在的问题是,虽然我跟着那datasheet设计,Proteus 却 simulate 不到当时他展示的稳定数据。请问大大你知道有什么原因会导致这问题发生吗?
回复

使用道具 举报

发表于 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 , 直接输出就是湿度+ 温度。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 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 | 显示全部楼层
SCL和SDA没有上拉电阻
回复

使用道具 举报

 楼主| 发表于 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 | 显示全部楼层
原帖由 Ha_He_Hi_Ho_Hu 于 27-11-2008 03:01 PM 发表
不好意思。。。请问要怎样放link来让人下载呢?

可以用 http://www.Rapidshare.com
回复

使用道具 举报

 楼主| 发表于 1-12-2008 11:43 AM | 显示全部楼层
原帖由 pic 于 29-11-2008 07:50 AM 发表

可以用 http://www.Rapidshare.com


哦!谢谢你!我已经上传了。
http://rapidshare.com/files/169055880/Proteus.rar.html
回复

使用道具 举报

发表于 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
  1. ////////////////////////////////////////////////////////
  2. //    Humidity sensor
  3. ////////////////////////////////////////////////////////
  4. //    PIN_C0 = Humidity sensor
  5. //    PORTB = LCD Module
  6. ////////////////////////////////////////////////////////
  7. //    - LCD display the Humidity
  8. ////////////////////////////////////////////////////////

  9. #include <16f877.h>
  10. #use delay(clock=20000000)
  11. #fuses hs,noprotect,nowdt,nolvp
  12. #define use_portb_lcd TRUE
  13. #include <lcd.c>

  14. #byte PORTB=6 //define PORT B address
  15. #byte PORTC=7 //define PORT C address

  16. void main()
  17. {
  18.    int16 Hum_value=0; // Use 16bit

  19.    set_tris_b(0b00000000);    //0: output; 1: input
  20.    set_tris_c(0b10000011);

  21.    lcd_init(); //Initialize LCD
  22.    delay_ms(100);

  23.    do
  24.    {
  25.       Hum_value=0; // reset to zero

  26.      //Measure humidity
  27.      do{
  28.      }while(input(PIN_C0)==1);        
  29.                                      //Do nothing for the first cycle
  30.      do{
  31.      }while(input(PIN_C0)==0);

  32.      do{
  33.          delay_us(1);                //Detect high frequency
  34.          Hum_value++;
  35.        }while(input(PIN_C0)==1);

  36.      do{
  37.          delay_us(1);                //Detect low frequency
  38.          Hum_value++;
  39.        }while(input(PIN_C0)==0);

  40.      printf(lcd_putc,"Humidity Now:%lu",Hum_value);  //Display the humidity at LCD
  41.                                                     //1us will increase 1%RH
  42.                                                     //if duty cycle = 50us, then RH = 50%
  43.      delay_ms(1000);  //avoid reading unstable
  44.       
  45.      lcd_putc("\f";  //clear the LCD
  46.       
  47.    }while(1);
  48. }
复制代码
回复

使用道具 举报

 楼主| 发表于 1-12-2008 01:21 PM | 显示全部楼层
原帖由 pic 于 1-12-2008 12:11 PM 发表


加了:
1. int16 Hum_value=0; // Use 16bit
2. Hum_value=0; // reset to zero////////////////////////////////////////////////////////
//    Humidity sensor
/////////////////////////////////////// ...


谢谢你哦!原来真是我的程式有问题。。。要用16bit和Reset数据。。。

真得很谢谢你!

那我现在就继续我的Project了。。。
要学看怎样弄 Keypad的 程式,也要尝试把 M24C01 EEPROM的CALIBRATION DATA 放进我的程式里。

pic大大,如果我有其他问题的话,是要在这个帖里继续求助,还是另外开一个专门的帖呢?
回复

使用道具 举报

发表于 1-12-2008 01:38 PM | 显示全部楼层
原帖由 Ha_He_Hi_Ho_Hu 于 1-12-2008 01:21 PM 发表
如果我有其他问题的话,是要在这个帖里继续求助,还是另外开一个专门的帖呢?

就继续吧。。。连贯性。。。
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 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...
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 19-4-2024 12:43 PM , Processed in 0.075334 second(s), 27 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表