Max6675 CCS C Kodunu C18'e Çevirme

Başlatan orhanc, 03 Ağustos 2010, 19:52:48

orhanc

Bulduğum CCS C max6675 kodu budur ve bunu c18e dönüştürmeye çalıştım ancak proteusda yaptığım denemelerde değerleri okuyamadım bir bakar mısınız ?

/**************************************************************************************
*   max6675.c - communicates with a MAX6675 thermcouple interface chip                *
*   Copyright Jimbob's Ma 2006                                                        *
*                                                                                     *
*   This program is free software; you can redistribute it and/or                     *
*   modify it under the terms of the GNU General Public License                       *
*   as published by the Free Software Foundation version 2                            *
*   of the License.                                                                   *
*                                                                                     *
*   This program is distributed in the hope that it will be useful,                   *
*   but WITHOUT ANY WARRANTY; without even the implied warranty of                    *
*   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the                     *
*   GNU General Public License for more details.                                      *
*                                                                                     *
*   You should have received a copy of the GNU General Public License                 *
*   along with this program; if not, write to the Free Software                       *
*   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.   *
**************************************************************************************/

/*
This is a diver for the MAX6675 K-type thermocouple interface chip. It implements an SPI
bus without the need for dedicated hardware (aka a bit-banged interface). The result from
toFloat_TC() is the temperature in degrees celcius of the thermocouple tip. The rest should
be self-evident. Have a look at the end of the file for example usage.
*/

#ifndef TC_CLK
   #define TC_CLK               PIN_B1            //edit these pins as necessary
#endif

#ifndef TC_CS
   #define TC_CS               PIN_B2
#endif

#ifndef TC_DATA
   #define TC_DATA               PIN_B3
#endif


int1 thermocouple_error;         //a handy dandy global error flag to tell you if a thermocouple is connected or not

void init_TC(void)
{
   output_low(TC_CLK);
   output_low(TC_DATA);
   output_high(TC_CS);            //if we idle high, the chip keeps doing conversions. Change this if you like
}

int16 read_TC(void)               //It takes 200ms (ish) for the MAX6675 to perform a conversion
{
   int8 i;
   int16 data;

   output_low(TC_CS);            //stop any conversion processes
   delay_us(1);               //and give it some time to power up (not very much, admittedly)

   for (i=0;i<16;i++){
      shift_left(&data,2,input(TC_DATA));      //reads in 2 bytes to data from the pin TC_DATA
      output_high(TC_CLK);
      output_low(TC_CLK);
   }

   thermocouple_error=bit_test(data,2);      //this is the thermocouple status bit
      
   output_high(TC_CS);
   return(data);
}

int16 sortout(int16 raw)
{
    return(0x0FFF & (raw>>3));      //returns only the bits converning temperature
}

float toFloat_TC(int16 tmp)
{
   return((float)tmp/4.0);      //adjusts data to floating point format, and accounts for the decimal point
}

float do_everything(void)
{
   init_TC();
   delay_ms(200);               //200ms is a long time to be doing nothing. use a timer interrupt to avoid wasting time here
   return(toFloat_TC(sortout(read_TC())));
}


/*

//example program

#define TC_CLK               PIN_B2
#define TC_CS               PIN_B2
#define TC_DATA               PIN_B1

#include "max6675.c"

void main()
{
   char msg[32];
   delay_ms(50);      //allow oscillator to stabilise

   while(1){
      delay_ms(800);
      sprintf(msg,"%01.2f%cC\r\n",do_everything(),0xB0);
      
      if(thermocouple_error)
         printf("Thermocouple not connected\r\n");   
      else
         printf("%s",msg);
   }
}

*/


C18'e çevirdiğim kod. Tamamını çevirmedim bu kısmı çevirip denedim sadece

init_TC(void)
{
   TC_CLK = 0;
   TC_DATA = 0;
   TC_CS = 1;
} 
 
 int sortout(int raw)
{
    return(0x0FFF & (raw>>3));      //returns only the bits converning temperature
} 
 
int read_TC(void)    //It takes 200ms (ish) for the MAX6675 to perform a conversion
{
   int i;
   int data;

   TC_CS=0;            
   Delay10KTCYx(1);    
   for (i=0;i<16;i++){
//      shift_left(&data,2,input(TC_DATA)); //reads in 2 bytes to data from the pin TC_DATA
     //data |=(TC_DATA<<2);
     data|=(TC_DATA<<2);
      TC_CLK=1;
      TC_CLK=0;
   }
   //thermocouple_error=bit_test(data,2);      //this is the thermocouple status    
   TC_CS=1;
   return(data);
}
i'm doing nothing... Giddy Up  http://www.drorhan.com

orhanc

Cold Junction K Tipi Kullanmayı düşünüyoruz. Sanırım dayanıklılık olarak daha iyiymiş ve oksitlenmesi azmış diye okudum.
i'm doing nothing... Giddy Up  http://www.drorhan.com

orhanc

tamam sağol bir de şunu sorayım bu sıcaklığı sabit tutma olayına PID diyorlarmış sanıyorum. Bu işlem için sıcaklığı array gibi bir yede tutup ortalamasını alıp ona göre ayar mı yapacağız
i'm doing nothing... Giddy Up  http://www.drorhan.com

orhanc

tamam dediğim gibi diziye atıp ortalamasına bakar ona göre iş yaparım
i'm doing nothing... Giddy Up  http://www.drorhan.com

orhanc

#4
Bunu c18e çevirirken sıkıntı olur mu ? Benim kodda sorun ne bakabildin mi ?
i'm doing nothing... Giddy Up  http://www.drorhan.com

orhanc

i'm doing nothing... Giddy Up  http://www.drorhan.com