Rev 1958 Rev 2177
1 /**** IR Mrakomer 4 ****/ 1 /**** IR Mrakomer 4 ****/
2 #define VERSION "4.1" 2 #define VERSION "4.1"
3 #define ID "$Id: irmrak4.c 1958 2011-04-24 14:44:01Z kakl $" 3 #define ID "$Id: irmrak4.c 2177 2011-09-05 18:56:16Z kaklik $"
4   4  
5 #include "irmrak4.h" 5 #include "irmrak4.h"
6   6  
7 #bit CREN = 0x18.4 // USART registers 7 #bit CREN = 0x18.4 // USART registers
8 #bit SPEN = 0x18.7 8 #bit SPEN = 0x18.7
9 #bit OERR = 0x18.1 9 #bit OERR = 0x18.1
10 #bit FERR = 0x18.2 10 #bit FERR = 0x18.2
11   11  
12 #include <string.h> 12 #include <string.h>
13   13  
14 #CASE // Case sensitive compiler 14 #CASE // Case sensitive compiler
15   15  
16 #define MAXHEAT 20 // Number of cycles for heating 16 #define MAXHEAT 20 // Number of cycles for heating
17 #define MAXOPEN 20 // Number of cycles for dome open 17 #define MAXOPEN 20 // Number of cycles for dome open
18 #define MEASURE_DELAY 6000 // Delay to a next measurement 18 #define MEASURE_DELAY 6000 // Delay to a next measurement
19 #define RESPONSE_DELAY 100 // Reaction time after receiving a command 19 #define RESPONSE_DELAY 100 // Reaction time after receiving a command
20 #define SAFETY_COUNT 90 // Time of one emergency cycle 20 #define SAFETY_COUNT 90 // Time of one emergency cycle
21 #define SEND_DELAY 50 // Time between two characters on RS232 21 #define SEND_DELAY 50 // Time between two characters on RS232
22 #define TEMPERATURE_INSIDE 1800 // Keep this temperature inside MM's box 22 #define TEMPERATURE_INSIDE 1800 // Keep this temperature inside MM's box
23   23  
24 #define DOME PIN_B4 // Dome controll port 24 #define DOME PIN_B4 // Dome controll port
25 #define HEATING PIN_B3 // Heating for defrosting 25 #define HEATING PIN_B3 // Heating for defrosting
26   26  
27   27  
28 char VER[4]=VERSION; // Buffer for concatenate of a version string 28 char VER[4]=VERSION; // Buffer for concatenate of a version string
29   29  
30 int8 heat; // Status variables 30 int8 heat; // Status variables
31 int8 open; 31 int8 open;
32   32  
33 inline void toggle_dome(void) // Wire exercise 33 inline void toggle_dome(void) // Wire exercise
34 { 34 {
35 if (open>0) 35 if (open>0)
36 {output_toggle(DOME);} // Toggle = Open Dome 36 {output_toggle(DOME);} // Toggle = Open Dome
37 else 37 else
38 {output_high(DOME);} // Do not toggle = Close Dome 38 {output_high(DOME);} // Do not toggle = Close Dome
39 } 39 }
40   40  
41 void delay(int16 cycles) // Wire exercise with delay 41 void delay(int16 cycles) // Wire exercise with delay
42 { 42 {
43 int16 i; 43 int16 i;
44   44  
45 for(i=0; i<cycles; i++) {toggle_dome(); delay_us(100);} 45 for(i=0; i<cycles; i++) {toggle_dome(); delay_us(100);}
46 } 46 }
47   47  
48 void welcome(void) // Welcome message 48 void welcome(void) // Welcome message
49 { 49 {
50 char REV[50]=ID; // Buffer for concatenate of a version string 50 char REV[50]=ID; // Buffer for concatenate of a version string
51   51  
52 if (REV[strlen(REV)-1]=='$') REV[strlen(REV)-1]=0; 52 if (REV[strlen(REV)-1]=='$') REV[strlen(REV)-1]=0;
53 printf("\r\n\r\n# Mrakomer %s (C) 2007 UST\n\r",VER); // Welcome message 53 printf("\r\n\r\n# Mrakomer %s (C) 2011 UST\r\n",VER); // Welcome message
54 printf("#%s\r\n",&REV[4]); 54 printf("#%s\r\n",&REV[4]);
55 // printf("#\r\n"); 55 // printf("#\r\n");
56 // printf("# commands: h, c, o, l, x, i, r, a, s, u\r\n"); 56 // printf("# commands: h, c, o, l, x, i, r, a, s, u\r\n");
57 // printf("# h_eat, c_old, o_pen, l_ock, x_open, "); 57 // printf("# h_eat, c_old, o_pen, l_ock, x_open, ");
58 // printf("i_nfo, r_epeat, a_uto, s_single, u_pdate\r\n"); 58 // printf("i_nfo, r_epeat, a_uto, s_single, u_pdate\r\n");
59 // printf("#\r\n"); 59 // printf("#\r\n");
60 // printf("# ver seq in[1/100 C] sky[1/100 C] sky[1/100 C] "); 60 // printf("# ver seq in[1/100 C] sky[1/100 C] sky[1/100 C] ");
61 // printf("out[1/100 C] heat[s] dome[s] check\r\n\r\n"); 61 // printf("out[1/100 C] heat[s] dome[s] check\r\n\r\n");
62   62  
63 //---WDT 63 //---WDT
64 restart_wdt(); 64 restart_wdt();
65 } 65 }
66   66  
67   67  
68 #include "smb.c" // System Management Bus driver 68 #include "smb.c" // System Management Bus driver
69 #include "TOUCH.C" 69 #include "TOUCH.C"
70   70  
71   71  
72 // Read sensor's RAM 72 // Read sensor's RAM
73 // Returns temperature in °K 73 // Returns temperature in °K
74 int16 ReadTemp(int8 addr, int8 select) 74 int16 ReadTemp(int8 addr, int8 select)
75 { 75 {
76 unsigned char arr[6]; // Buffer for the sent bytes 76 unsigned char arr[6]; // Buffer for the sent bytes
77 int8 crc; // Readed CRC 77 int8 crc; // Readed CRC
78 int16 temp; // Readed temperature 78 int16 temp; // Readed temperature
79   79  
80 addr<<=1; 80 addr<<=1;
81   81  
82 SMB_STOP_bit(); //If slave send NACK stop comunication 82 SMB_STOP_bit(); //If slave send NACK stop comunication
83 SMB_START_bit(); //Start condition 83 SMB_START_bit(); //Start condition
84 SMB_TX_byte(addr); 84 SMB_TX_byte(addr);
85 SMB_TX_byte(RAM_Access|select); 85 SMB_TX_byte(RAM_Access|select);
86 SMB_START_bit(); //Repeated Start condition 86 SMB_START_bit(); //Repeated Start condition
87 SMB_TX_byte(addr); 87 SMB_TX_byte(addr);
88 arr[2]=SMB_RX_byte(ACK); //Read low data,master must send ACK 88 arr[2]=SMB_RX_byte(ACK); //Read low data,master must send ACK
89 arr[1]=SMB_RX_byte(ACK); //Read high data,master must send ACK 89 arr[1]=SMB_RX_byte(ACK); //Read high data,master must send ACK
90 temp=make16(arr[1],arr[2]); 90 temp=make16(arr[1],arr[2]);
91 crc=SMB_RX_byte(NACK); //Read PEC byte, master must send NACK 91 crc=SMB_RX_byte(NACK); //Read PEC byte, master must send NACK
92 SMB_STOP_bit(); //Stop condition 92 SMB_STOP_bit(); //Stop condition
93   93  
94 arr[5]=addr; 94 arr[5]=addr;
95 arr[4]=RAM_Access|select; 95 arr[4]=RAM_Access|select;
96 arr[3]=addr; 96 arr[3]=addr;
97 arr[0]=0; 97 arr[0]=0;
98 if (crc != PEC_calculation(arr)) temp=0; // Calculate and check CRC 98 if (crc != PEC_calculation(arr)) temp=0; // Calculate and check CRC
99   99  
100 return temp; 100 return temp;
101 } 101 }
102   102  
103 // compute CRC 103 // compute CRC
104 // *sn - pointer to the byte array 104 // *sn - pointer to the byte array
105 // num - length of array 105 // num - length of array
106 inline int8 TM_check_CRC(unsigned int8 *sn, unsigned int8 num) 106 inline int8 TM_check_CRC(unsigned int8 *sn, unsigned int8 num)
107 { 107 {
108 // CRC table 108 // CRC table
109 const int8 TouchCRC[256]= { 109 const int8 TouchCRC[256]= {
110 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65, 110 0, 94, 188, 226, 97, 63, 221, 131, 194, 156, 126, 32, 163, 253, 31, 65,
111 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220, 111 157, 195, 33, 127, 252, 162, 64, 30, 95, 1, 227, 189, 62, 96, 130, 220,
112 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98, 112 35, 125, 159, 193, 66, 28, 254, 160, 225, 191, 93, 3, 128, 222, 60, 98,
113 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255, 113 190, 224, 2, 92, 223, 129, 99, 61, 124, 34, 192, 158, 29, 67, 161, 255,
114 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7, 114 70, 24, 250, 164, 39, 121, 155, 197, 132, 218, 56, 102, 229, 187, 89, 7,
115 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154, 115 219, 133, 103, 57, 186, 228, 6, 88, 25, 71, 165, 251, 120, 38, 196, 154,
116 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36, 116 101, 59, 217, 135, 4, 90, 184, 230, 167, 249, 27, 69, 198, 152, 122, 36,
117 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185, 117 248, 166, 68, 26, 153, 199, 37, 123, 58, 100, 134, 216, 91, 5, 231, 185,
118 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205, 118 140, 210, 48, 110, 237, 179, 81, 15, 78, 16, 242, 172, 47, 113, 147, 205,
119 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80, 119 17, 79, 173, 243, 112, 46, 204, 146, 211, 141, 111, 49, 178, 236, 14, 80,
120 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238, 120 175, 241, 19, 77, 206, 144, 114, 44, 109, 51, 209, 143, 12, 82, 176, 238,
121 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115, 121 50, 108, 142, 208, 83, 13, 239, 177, 240, 174, 76, 18, 145, 207, 45, 115,
122 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139, 122 202, 148, 118, 40, 171, 245, 23, 73, 8, 86, 180, 234, 105, 55, 213, 139,
123 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22, 123 87, 9, 235, 181, 54, 104, 138, 212, 149, 203, 41, 119, 244, 170, 72, 22,
124 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168, 124 233, 183, 85, 11, 136, 214, 52, 106, 43, 117, 151, 201, 74, 20, 246, 168,
125 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53}; 125 116, 42, 200, 150, 21, 75, 169, 247, 182, 232, 10, 84, 215, 137, 107, 53};
126   126  
127 int8 CRC; 127 int8 CRC;
128 int8 i; 128 int8 i;
129   129  
130 CRC=0; 130 CRC=0;
131 for(i=0;i<num;i++) CRC=TouchCRC[CRC ^ *(sn+i)]; 131 for(i=0;i<num;i++) CRC=TouchCRC[CRC ^ *(sn+i)];
132 return(CRC); 132 return(CRC);
133 } 133 }
134   134  
135   135  
136 /*-------------------------------- MAIN --------------------------------------*/ 136 /*-------------------------------- MAIN --------------------------------------*/
137 void main() 137 void main()
138 { 138 {
139 unsigned int16 seq, temp, tempa; 139 unsigned int16 seq, temp, tempa;
140 signed int16 ta, to1, to2, tTouch; 140 signed int16 ta, to1, to2, tTouch;
141 int8 tLSB,tMSB; // Temperatures from TouchMemory 141 int8 tLSB,tMSB; // Temperatures from TouchMemory
142 int8 safety_counter; 142 int8 safety_counter;
143 int8 heatTime; 143 int8 heatTime;
144 int1 repeat; // Status flags 144 int1 repeat; // Status flags
145 int1 automatic; 145 int1 automatic;
146   146  
147 output_high(DOME); // Close Dome 147 output_high(DOME); // Close Dome
148 output_low(HEATING); // Heating off 148 output_low(HEATING); // Heating off
149   149  
150 delay_ms(1000); 150 delay_ms(1000);
151 restart_wdt(); 151 restart_wdt();
152   152  
153 seq=0; // Variables initiation 153 seq=0; // Variables initiation
154 heat=0; 154 heat=0;
155 open=0; 155 open=0;
156 heatTime=0; 156 heatTime=0;
157 repeat=TRUE; 157 repeat=TRUE;
158 automatic=FALSE; 158 automatic=FALSE;
159   159  
160 welcome(); 160 welcome();
161   161  
162 tempa=ReadTemp(SA, RAM_Tamb); // Dummy read 162 tempa=ReadTemp(SA, RAM_Tamb); // Dummy read
163 temp=ReadTemp(SA, RAM_Tobj1); 163 temp=ReadTemp(SA, RAM_Tobj1);
164 touch_present(); //Issues a reset of Touch Memory device 164 touch_present(); //Issues a reset of Touch Memory device
165 touch_write_byte(0xCC); 165 touch_write_byte(0xCC);
166 touch_write_byte(0x44); 166 touch_write_byte(0x44);
167   167  
168 delay_ms(1000); 168 delay_ms(1000);
169 //---WDT 169 //---WDT
170 restart_wdt(); 170 restart_wdt();
171 171
172 while(TRUE) // Main Loop 172 while(TRUE) // Main Loop
173 { 173 {
174 safety_counter=SAFETY_COUNT; // Heating and Dome Count Down 174 safety_counter=SAFETY_COUNT; // Heating and Dome Count Down
175 do 175 do
176 { 176 {
177 if (safety_counter<SAFETY_COUNT) safety_counter++; 177 if (safety_counter<SAFETY_COUNT) safety_counter++;
178   178  
179 delay(RESPONSE_DELAY); 179 delay(RESPONSE_DELAY);
180   180  
181 if (safety_counter>=SAFETY_COUNT) 181 if (safety_counter>=SAFETY_COUNT)
182 { 182 {
183 if (heat>0) { output_high(HEATING); } else { output_low(HEATING); } 183 if (heat>0) { output_high(HEATING); } else { output_low(HEATING); }
184   184  
185 if (heat>0) heat--; 185 if (heat>0) heat--;
186 if (open>0) open--; 186 if (open>0) open--;
187   187  
188 safety_counter=0; 188 safety_counter=0;
189 //---WDT 189 //---WDT
190 restart_wdt(); 190 restart_wdt();
191 } 191 }
192 } while (!kbhit()&&!repeat); 192 } while (!kbhit()&&!repeat);
193   193  
194 //---WDT 194 //---WDT
195 restart_wdt(); 195 restart_wdt();
196 { // Retrieve command 196 { // Retrieve command
197 char ch='k'; 197 char ch='k';
198   198  
199 if(kbhit()) ch=getc(); 199 if(kbhit()) ch=getc();
200   200  
201 switch (ch) 201 switch (ch)
202 { 202 {
203 case 'h': 203 case 'h':
204 heat=MAXHEAT; // Need heating 204 heat=MAXHEAT; // Need heating
205 automatic=FALSE; 205 automatic=FALSE;
206 break; 206 break;
207   207  
208 case 'c': 208 case 'c':
209 heat=0; // Need colder 209 heat=0; // Need colder
210 automatic=FALSE; 210 automatic=FALSE;
211 break; 211 break;
212   212  
213 case 'o': 213 case 'o':
214 open=MAXOPEN; // Open the dome 214 open=MAXOPEN; // Open the dome
215 automatic=FALSE; 215 automatic=FALSE;
216 break; 216 break;
217   217  
218 case 'x': 218 case 'x':
219 open=MAXOPEN; // Open the dome 219 open=MAXOPEN; // Open the dome
220 heat=MAXHEAT; // Need heating 220 heat=MAXHEAT; // Need heating
221 automatic=FALSE; 221 automatic=FALSE;
222 break; 222 break;
223   223  
224 case 'l': 224 case 'l':
225 open=0; // Lock the dome 225 open=0; // Lock the dome
226 automatic=FALSE; 226 automatic=FALSE;
227 break; 227 break;
228   228  
229 case 'i': 229 case 'i':
230 if (open==0) welcome(); // Information about version, etc... 230 if (open==0) welcome(); // Information about version, etc...
231 break; // Only when dome is closed 231 break; // Only when dome is closed
232   232  
233 case 'r': 233 case 'r':
234 repeat=TRUE; // Repeated measure mode 234 repeat=TRUE; // Repeated measure mode
235 automatic=FALSE; 235 automatic=FALSE;
236 break; 236 break;
237   237  
238 case 's': 238 case 's':
239 repeat=FALSE; // Single measure mode 239 repeat=FALSE; // Single measure mode
240 automatic=FALSE; 240 automatic=FALSE;
241 break; 241 break;
242   242  
243 case 'a': 243 case 'a':
244 repeat=TRUE; // Automatic mode 244 repeat=TRUE; // Automatic mode
245 automatic=TRUE; 245 automatic=TRUE;
246 break; 246 break;
247   247  
248 case 'u': 248 case 'u':
249 reset_cpu(); // Update firmware 249 reset_cpu(); // Update firmware
250 } 250 }
251 } 251 }
252 CREN=0; CREN=1; // Reinitialise USART 252 CREN=0; CREN=1; // Reinitialise USART
253   253  
254 seq++; // Increment the number of measurement 254 seq++; // Increment the number of measurement
255   255  
256 tempa=ReadTemp(SA, RAM_Tamb); // Read temperatures from sensor 256 tempa=ReadTemp(SA, RAM_Tamb); // Read temperatures from sensor
257 ta=tempa*2-27315; // °K -> °C 257 ta=tempa*2-27315; // °K -> °C
258   258  
259 temp=ReadTemp(SA, RAM_Tobj1); 259 temp=ReadTemp(SA, RAM_Tobj1);
260 if (temp>0x48E1) {to1=-27315;} else {to1=temp*2-27315;} 260 if (temp>0x48E1) {to1=-27315;} else {to1=temp*2-27315;}
261 temp=ReadTemp(SA, RAM_Tobj2); 261 temp=ReadTemp(SA, RAM_Tobj2);
262 if (temp>0x48E1) {to2=-27315;} else {to2=temp*2-27315;} 262 if (temp>0x48E1) {to2=-27315;} else {to2=temp*2-27315;}
263   263  
264 touch_present(); //Issues a reset of Touch Memory device 264 touch_present(); //Issues a reset of Touch Memory device
265 touch_write_byte(0xCC); 265 touch_write_byte(0xCC);
266 touch_write_byte(0x44); 266 touch_write_byte(0x44);
267 267
268 //---WDT 268 //---WDT
269 restart_wdt(); 269 restart_wdt();
270 delay(MEASURE_DELAY); // Delay to a next measurement 270 delay(MEASURE_DELAY); // Delay to a next measurement
271   271  
272 { 272 {
273 int8 SN[10]; 273 int8 SN[10];
274 int8 n; 274 int8 n;
275   275  
276 touch_present(); //Issues a reset and returns true if the touch device is there. 276 touch_present(); //Issues a reset and returns true if the touch device is there.
277 touch_write_byte(0xCC); 277 touch_write_byte(0xCC);
278 touch_write_byte(0xBE); 278 touch_write_byte(0xBE);
279 for(n=0;n<9;n++) SN[n]=touch_read_byte(); 279 for(n=0;n<9;n++) SN[n]=touch_read_byte();
280 tLSB=SN[0]; 280 tLSB=SN[0];
281 tMSB=SN[1]; 281 tMSB=SN[1];
282 if ((SN[8]==TM_check_CRC(SN,8))&&(SN[7]==0x10)) // Check CRC and family code to prevent O's error 282 if ((SN[8]==TM_check_CRC(SN,8))&&(SN[7]==0x10)) // Check CRC and family code to prevent O's error
283 { 283 {
284 tTouch=make16(tMSB,tLSB); 284 tTouch=make16(tMSB,tLSB);
285 tTouch=tTouch*6+tTouch/4; // 1bit = 0,0625gradC recalculate to 1/100gradC 285 tTouch=tTouch*6+tTouch/4; // 1bit = 0,0625gradC recalculate to 1/100gradC
286 } 286 }
287 else 287 else
288 { 288 {
289 tTouch=-27315; 289 tTouch=-27315;
290 } 290 }
291 } 291 }
292 292
293 if(automatic) // Solve automatic mode 293 if(automatic) // Solve automatic mode
294 { 294 {
295 if (heatTime==0) 295 if (heatTime==0)
296 { 296 {
297 if((tTouch<=-300)&&(ta<=300)) {heat=(700-tTouch)/400;} else {heat=1;} // Needs warmer? 297 if((tTouch<=-300)&&(ta<=300)) {heat=(700-tTouch)/400;} else {heat=1;} // Needs warmer?
298 heatTime=MAXHEAT; 298 heatTime=MAXHEAT;
299 } 299 }
300 heatTime--; 300 heatTime--;
301 301
302 if(ta>2000) heat=0; // Overtemperature protection 302 if(ta>2000) heat=0; // Overtemperature protection
303 if(tTouch>2000) heat=0; 303 if(tTouch>2000) heat=0;
304 if(ta<-10000) heat=0; // Sensor Error protection 304 if(ta<-10000) heat=0; // Sensor Error protection
305 if(tTouch<-10000) heat=0; 305 if(tTouch<-10000) heat=0;
306 306
307 if((abs(to1-to2)<100)&&(tTouch>to1)&&(abs(tTouch-to1)>800)) open=1; // Control the dome 307 if((abs(to1-to2)<100)&&(tTouch>to1)&&(abs(tTouch-to1)>800)) open=1; // Control the dome
308 if(to1<-10000) open=0; // Sensor Error protection 308 if(to1<-10000) open=0; // Sensor Error protection
309 if(tTouch<-10000) open=0; 309 if(tTouch<-10000) open=0;
310 } 310 }
311   311  
312 { // printf 312 { // printf
313 char output[8]; // Output buffer 313 char output[8]; // Output buffer
314 int8 j; // String pointer 314 int8 j; // String pointer
315 int8 check=0; // Checksum is calculated between '$' and '*' 315 int8 check=0; // Checksum is calculated between '$' and '*'
316   316  
317 delay(SEND_DELAY); 317 delay(SEND_DELAY);
318 putc('$'); 318 putc('$');
319 delay(SEND_DELAY); 319 delay(SEND_DELAY);
320 sprintf(output,"M%s \0",VER); 320 sprintf(output,"M%s \0",VER);
321 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; } 321 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; }
322 sprintf(output,"%Lu \0", seq); 322 sprintf(output,"%Lu \0", seq);
323 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; } 323 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; }
324 sprintf(output,"%Ld \0", ta); 324 sprintf(output,"%Ld \0", ta);
325 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; } 325 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; }
326 sprintf(output,"%Ld \0", to1); 326 sprintf(output,"%Ld \0", to1);
327 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; } 327 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; }
328 sprintf(output,"%Ld \0", to2); 328 sprintf(output,"%Ld \0", to2);
329 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; } 329 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; }
330 sprintf(output,"%Ld \0",tTouch); 330 sprintf(output,"%Ld \0",tTouch);
331 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; } 331 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; }
332 sprintf(output,"%u \0", heat); 332 sprintf(output,"%u \0", heat);
333 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; } 333 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; }
334 sprintf(output,"%u \0", open); 334 sprintf(output,"%u \0", open);
335 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; } 335 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; }
336 sprintf(output,"*%X\r\n\0", check); 336 sprintf(output,"*%X\r\n\0", check);
337 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j++]); } 337 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j++]); }
338 delay(SEND_DELAY); 338 delay(SEND_DELAY);
339 } 339 }
340 340
341 //---WDT 341 //---WDT
342 restart_wdt(); 342 restart_wdt();
343 } 343 }
344 } 344 }
345   345  
346   346  
347 #include "dbloader.c" // Space reservation for the BootLoader 347 #include "dbloader.c" // Space reservation for the BootLoader