Used RAM (bytes): 83 (35%) Free RAM (bytes): 157 (65%) Used RAM (bytes): 83 (35%) Free RAM (bytes): 157 (65%)
So there is 65% free ram..
I would appreciate your help,
Thanks.
Code: Select all
float Vout;
float Vdd = 5.00;
int maxTemp = 200;
int maxHist = 50;
unsigned int RS2 = 200000;
unsigned int RS1 = 200000;
float Rth;
float temperature;
float Tn = 25 + 273.15;
unsigned int Bth = 3950;
const float ADC_resolution = 0.0048828; // ADC resolution in volts = 5 / 1024
unsigned int adc_value, test_temp, cnt;
unsigned short mask(unsigned short num);
unsigned short digit_no, digit100, digit10, digit1, digit, i;
unsigned short set, but1, but2, but3, tol, ttol, his, se, stem, tstem, ch1, ch2;
unsigned long adc_test;
#define SHIFT_DATA PORTC.F1 // 74HC595 Data
#define SHIFT_LATCH PORTC.F2 // 74HC595 Latch
#define SHIFT_CLOCK PORTC.F0 // 74HC595 Clock
unsigned short mask(unsigned short num) {
switch (num) {
case 0 : return 0xC0;
case 1 : return 0xF9;
case 2 : return 0xA4;
case 3 : return 0xB0;
case 4 : return 0x99;
case 5 : return 0x92;
case 6 : return 0x82;
case 7 : return 0xF8;
case 8 : return 0x80;
case 9 : return 0x90;
}
}
void latch_595() {
SHIFT_LATCH = 1;
asm nop;
SHIFT_LATCH = 0;
}
void shift_out_HC595(char one_digit) {
char x;
for (x=0; x<=7; ++x) {
if (one_digit & 0x80) SHIFT_DATA = 1;
else SHIFT_DATA = 0;
one_digit <<= 1;
SHIFT_CLOCK = 1;
asm nop;
SHIFT_CLOCK = 0;
}
}
void interrupt() {
if (TMR0IF_bit == 1) {
if (digit_no==0) {
PORTC.F3 = 0;
PORTC.F4 = 0;
PORTC.F5 = 0; // Turn off both displays
shift_out_HC595(digit1); // Set mask for displaying ones on PORTD
latch_595();
PORTC.F3 = 1; // Turn on display for ones (LSD)
digit_no = 1;
} else if (digit_no==1) {
PORTC.F3 = 0;
PORTC.F4 = 0;
PORTC.F5 = 0; // Turn off both displays
shift_out_HC595(digit10); // Set mask for displaying tens on PORTD
latch_595();
PORTC.F4 = 1; // Turn on display for tens (MSD)
digit_no = 2;
} else {
PORTC.F3 = 0;
PORTC.F4 = 0;
PORTC.F5 = 0; // Turn off both displays
shift_out_HC595(digit100); // Set mask for displaying tens on PORTD
latch_595();
PORTC.F5 = 1; // Turn on display for tens (MSD)
digit_no = 0;
}
TMR0 = 0; // Reset counter TMRO
INTCON = 0x20; // Bit T0IF=0, T0IE=1
}
}
void Display_Temperature(unsigned int ftemp) {
digit = ftemp % 10u;
digit1 = mask(digit); // Prepare mask for displaying ones
if (ftemp/10) {
digit = (char)(ftemp / 10u) % 10u;
digit10 = mask(digit); // Prepare mask for displaying tens
} else {
digit10 = 0xFF;
}
if (ftemp/100) {
digit = (char)(ftemp / 100u) % 10u;
digit100 = mask(digit); // Prepare mask for displaying tens
} else {
digit100 = 0xFF;
}
}
void SetTemp_Menu(unsigned int fstem) {
if (se == 0) {
digit1 = 0xFF;
digit10 = 0x06;
digit100 = 0x92;
delay_ms(200);
se = 1;
}
Display_Temperature(stem);
}
void SetHist_Menu(unsigned int ftol) {
if (his == 0) {
digit1 = 0x12;
digit10 = 0xCF;
digit100 = 0x89;
delay_ms(200);
his = 1;
}
Display_Temperature(tol);
}
void main() {
OPTION_REG = 0x80; // Set timer TMR0
TMR0 = 0;
INTCON = 0xA0; // Disable interrupt PEIE,INTE,RBIE,T0IE
ANSEL = 0b00000001;
TRISA = 0b00011111; // PORTA All Inputs, Except RA5
PORTA = 0b00100000;
TRISC = 0b00000000; // set PORTC to be output
PORTC = 0b00111000;
CMCON0 = 0x07; // Disbale comparators
ch2=ch1=0;
but1,but2,but3,set=0;
his,se=0;
stem = 145;
tol = 5;
while(1){
/*
// for stability take more adc samples
adc_test = 0;
for (cnt=0; cnt <= 7; cnt++) {
adc_test = adc_test + ADC_Read(0);
delay_ms(3);
}
adc_value = adc_test >> 3;
*/
adc_value = ADC_Read(0);
Vout = adc_value * ADC_resolution;
Rth = ((RS2 * Vdd) / Vout) - RS2;
temperature = (Bth*Tn) / (Bth + log(Rth / RS2) * Tn);
temperature = temperature - 273.15;
test_temp = temperature;
switch(set) {
case 0: Display_Temperature(test_temp); break;
case 1: SetTemp_Menu(stem); break;
case 2: SetHist_Menu(tol); break;
}
if(test_temp >= 1 && test_temp <= stem - tol) {
PORTA.F5=1;
}
if(test_temp >= stem || test_temp <= 0) {
PORTA.F5=0;
}
if (PORTA.F3==0) but1 = 1; // If set button is pressed
if (but1==1 && PORTA.F3==1) {
but1 = 0;
set++;
if (set==1) {
tstem=stem;
ttol=tol;
}
if (set==2) {
se = 0;
}
if (set>=3) {
set=0;
his=0;
}
}
if (PORTA.F1==0) but3 = 1; // If up button is pressed
if (but3==1 && PORTA.F1==1) {
but3 = 0;
if (set == 1) {
stem = stem + tol;
if(stem>maxTemp) stem=1;
} else if (set == 2) {
tol++;
if(tol>maxHist) tol=1;
}
}
if (PORTA.F2==0) but2 = 1; // If down button is pressed
if (but2==1 && PORTA.F2==1) {
but2 = 0;
if (set == 1) {
stem = stem - tol;
if(stem<=0) stem=maxTemp;
} else if (set == 2) {
tol--;
if(tol<=0) tol=maxHist;
}
}
}
}