#include "LCD.h" #include <avr/io.h> #include <util/delay.h> #include <stdlib.h> #include <math.h> #include "smart.h"
#define BCOEFFICIENT 3950 // The beta coefficient of the thermistor (usually 3000-4000) #define THERMISTORNOMINAL 10000 // resistance at 25 degrees C #define TEMPERATURENOMINAL 25 // temp. for nominal resistance (almost always 25 C) #define SERIESRESISTOR 10000 // the value of the 'other' resistor
float fCalcNtc(int wADCVal) // from ADC { double fRntc;
fRntc = ((SERIESRESISTOR * ( 1023.0 - (float) wADCVal) /(float) wADCVal)); // SERIESRESISTOR = pullup resistor return(fRntc); } // calculate temperature from resistorvalue float fCalcTemp( float fRntc) { float fTemp;
fTemp = (1.0 / ( (log(fRntc/THERMISTORNOMINAL))/BCOEFFICIENT + 1.0/298.0)) - 273.0; //log = ln return( fTemp); } /*const unsigned int ad_table[] = { 991,989,987,985,983,980,978,975,973,970, //-40'C ~-31'C 966,963,960,957,953,949,945,941,937,932, //-30'C ~-21'C 927,922,918,912,907,900,895,889,882,875, //-20'C ~-11'C 868,861,854,847,839,830,822,814,806,796, //-10'C ~ -1'C
786,778,769,759,749,737,728,718,707,696, // 0'C ~ 9'C 684,674,663,652,640,627,617,606,595,582, // 10'C ~ 19'C 569,559,548,536,524,511,501,490,478,466, // 20'C ~ 29'C 454,444,434,423,411,400,390,381,370,360, // 30'C ~ 39'C 349,341,332,322,313,303,295,287,279,270, // 40'C ~ 49'C 262,254,247,240,232,225,219,212,206,199, // 50'C ~ 59'C 193,187,182,176,170,165,160,155,151,146, // 60'C ~ 69'C 141,137,133,129,124,120,117,113,110,106, // 70'C ~ 79'C 103,100, 97, 94, 91, 88, 85, 83, 80, 78, // 80'C ~ 89'C 75, 73, 71, 69, 66, 64, 62, 61, 59, 57, // 90'C ~ 99'C 55, 53, 50, 47, 44, 42, 41, 41, 41, 41, //100'C ~109'C 41, 40, 39, 38, 36, 35, 34, 33, 32, 32, //110'C ~119'C 31 }; */ volatile unsigned int uiCnt; char cBuf[5] = {0, }; char cFlag = 0;
void TC1_Init() { /* 레지스터 설정 */
// 16 BIT Timer/Counter //
TCCR1A = 0X00;//0B 0000 0000 -> NORMAL MODE, NO PWM MODE TCCR1B = 0X83;//0B 1000 0011 -> FALLING EDGE, NORMAL MODE, 64 분주 TCCR1C = 0X00;//0B 0000 0000 -> BLOCK COMPARE MODE TCNT1H = 0X00;//0B 0000 0000 -> START FROM 0 TCNT1L = 0X00;//0B 0000 0000 -> START FROM 0 TIMSK1 = 0X01;//0B 0000 0001 -> OVERFLOW REGISTER ENABLE TIFR1 = 0X00;//0B 0000 0000 ->BIT CLEAR, FLACK BIT CLEAR SREG |=0X80;//0B 1000 0000 -> GLOBAL INTERRUPT ENABLE
TCNT1H = TCNT1L >> 8; SREG |=0X80;// 0B 1000 0000 -> GLOBAL INTERRUPT ENABLE }
void ADC_Init() { ADCSRA = 0x00; // init ADCSRA = 0x85; // Enable adc, 분주비 32 ADCSRB = 0x00; // free running mode ADMUX = 0x40; // select adc input 0 }
void MTW() { char cBuffer[20]={0, }; char cCS[3] = {0, }; int iCnt; char ucCS;
cBuffer[0] = '$'; cBuffer[1] = 'J'; cBuffer[2] = 'H'; cBuffer[3] = 'M'; cBuffer[4] = 'T'; cBuffer[5] = 'W'; cBuffer[6] = ','; cBuffer[7] = '0'; cBuffer[8] = cBuf[0]; cBuffer[9] = cBuf[1]; cBuffer[10] = cBuf[2]; cBuffer[11] = cBuf[3]; cBuffer[12] = ','; cBuffer[13] = 'C'; cBuffer[14] = '*';
//checksum - from $ to * XOR for(iCnt = 1; iCnt < 14; ++iCnt) { ucCS ^= cBuffer[iCnt]; }
itoa(ucCS, cCS, 16);
cBuffer[15] = cCS[0]; cBuffer[16] = cCS[1];
/*itoa( (ucCS & 0xF0), cBuffer[15], 16); itoa( (ucCS & 0x0F), cBuffer[16], 16);*/
cBuffer[17] = 10; cBuffer[18] = 13; ucCS = 0; USART_PRINT(cBuffer); }
int main(void) { unsigned int uiSum=0; int iCnt; int uiTemp=0; unsigned char i; double steinhart, Res, Temp;
LCD_Init(); ADC_Init(); TC1_Init(); USART0_INIT();
LCD_Print(" Current Temp."); LCD_INST(0x0C); LCD_INST(0x40); LCD_Symbol();
while(1) { uiSum = 0; ADCSRA = 0xD5; while((ADCSRA & 0x10) != 0x10); for(i=0; i<100; ++i) { ADCSRA = 0xD5; while((ADCSRA & 0x10) != 0x10); uiSum += ( (int)ADCL + ((int)ADCH<<8) ) ; } uiSum /= 100; // uiSum = uiSum / 100, 아날로그 신호의 평균값을 내준다. Res = fCalcNtc(uiSum); // calculate temperature from resistorvalue Temp = fCalcTemp(Res); // calculate temperature from resistorvalue Temp = Temp * 10; itoa(Temp, cBuf, 10); cBuf[3] = cBuf[2];
cBuf[2] = '.';
LCD_INST(0xC5); LCD_Print(cBuf); LCD_Data(0x00); LCD_Data('C'); _delay_ms(1000); }
return 0; }
void __vector_20(void) { cFlag ^= 0x01; if(cFlag == 0) MTW(); }
|