Rev 1862 Rev 1884
1 /**** IR Mrakomer 4 ****/ 1 /**** IR Mrakomer 4 ****/
2 #define VERSION "4.1" 2 #define VERSION "4.1"
3 #define ID "$Id: irmrak4.c 1862 2011-02-20 17:22:55Z kakl $" 3 #define ID "$Id: irmrak4.c 1884 2011-02-26 10:11:40Z kakl $"
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) 2007 UST\n\r",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, told; 140 signed int16 ta, to1, to2, tTouch, taOld;
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, heatPower;
143 int1 repeat; // Status flags 144 int1 repeat; // Status flags
144 int1 automatic; 145 int1 automatic;
145   146  
146 output_high(DOME); // Close Dome 147 output_high(DOME); // Close Dome
147 output_low(HEATING); // Heating off 148 output_low(HEATING); // Heating off
148   149  
149 delay_ms(1000); 150 delay_ms(1000);
150 restart_wdt(); 151 restart_wdt();
151   152  
152 seq=0; // Variables initiation 153 seq=0; // Variables initiation
153 heat=0; 154 heat=0;
154 open=0; 155 open=0;
-   156 heatTime=0;
-   157 heatPower=0;
-   158 taOld=2000;
155 repeat=TRUE; 159 repeat=TRUE;
156 automatic=FALSE; 160 automatic=FALSE;
157   161  
158 welcome(); 162 welcome();
159   163  
160 tempa=ReadTemp(SA, RAM_Tamb); // Dummy read 164 tempa=ReadTemp(SA, RAM_Tamb); // Dummy read
161 temp=ReadTemp(SA, RAM_Tobj1); 165 temp=ReadTemp(SA, RAM_Tobj1);
162 touch_present(); //Issues a reset of Touch Memory device 166 touch_present(); //Issues a reset of Touch Memory device
163 touch_write_byte(0xCC); 167 touch_write_byte(0xCC);
164 touch_write_byte(0x44); 168 touch_write_byte(0x44);
165   169  
166 delay_ms(1000); 170 delay_ms(1000);
167 //---WDT 171 //---WDT
168 restart_wdt(); 172 restart_wdt();
169 173
170 while(TRUE) // Main Loop 174 while(TRUE) // Main Loop
171 { 175 {
172 safety_counter=SAFETY_COUNT; // Heating and Dome Count Down 176 safety_counter=SAFETY_COUNT; // Heating and Dome Count Down
173 do 177 do
174 { 178 {
175 if (safety_counter<SAFETY_COUNT) safety_counter++; 179 if (safety_counter<SAFETY_COUNT) safety_counter++;
176   180  
177 delay(RESPONSE_DELAY); 181 delay(RESPONSE_DELAY);
178   182  
179 if (safety_counter>=SAFETY_COUNT) 183 if (safety_counter>=SAFETY_COUNT)
180 { 184 {
181 if (heat>0) { output_high(HEATING); } else { output_low(HEATING); } 185 if (heat>0) { output_high(HEATING); } else { output_low(HEATING); }
182   186  
183 if (heat>0) heat--; 187 if (heat>0) heat--;
184 if (open>0) open--; 188 if (open>0) open--;
185   189  
186 safety_counter=0; 190 safety_counter=0;
187 //---WDT 191 //---WDT
188 restart_wdt(); 192 restart_wdt();
189 } 193 }
190 } while (!kbhit()&&!repeat); 194 } while (!kbhit()&&!repeat);
191   195  
192 //---WDT 196 //---WDT
193 restart_wdt(); 197 restart_wdt();
194 { // Retrieve command 198 { // Retrieve command
195 char ch='k'; 199 char ch='k';
196   200  
197 if(kbhit()) ch=getc(); 201 if(kbhit()) ch=getc();
198   202  
199 switch (ch) 203 switch (ch)
200 { 204 {
201 case 'h': 205 case 'h':
202 heat=MAXHEAT; // Need heating 206 heat=MAXHEAT; // Need heating
203 automatic=FALSE; 207 automatic=FALSE;
204 break; 208 break;
205   209  
206 case 'c': 210 case 'c':
207 heat=0; // Need colder 211 heat=0; // Need colder
208 automatic=FALSE; 212 automatic=FALSE;
209 break; 213 break;
210   214  
211 case 'o': 215 case 'o':
212 open=MAXOPEN; // Open the dome 216 open=MAXOPEN; // Open the dome
213 automatic=FALSE; 217 automatic=FALSE;
214 break; 218 break;
215   219  
216 case 'x': 220 case 'x':
217 open=MAXOPEN; // Open the dome 221 open=MAXOPEN; // Open the dome
218 heat=MAXHEAT; // Need heating 222 heat=MAXHEAT; // Need heating
219 automatic=FALSE; 223 automatic=FALSE;
220 break; 224 break;
221   225  
222 case 'l': 226 case 'l':
223 open=0; // Lock the dome 227 open=0; // Lock the dome
224 automatic=FALSE; 228 automatic=FALSE;
225 break; 229 break;
226   230  
227 case 'i': 231 case 'i':
228 if (open==0) welcome(); // Information about version, etc... 232 if (open==0) welcome(); // Information about version, etc...
229 break; // Only when dome is closed 233 break; // Only when dome is closed
230   234  
231 case 'r': 235 case 'r':
232 repeat=TRUE; // Repeated measure mode 236 repeat=TRUE; // Repeated measure mode
233 automatic=FALSE; 237 automatic=FALSE;
234 break; 238 break;
235   239  
236 case 's': 240 case 's':
237 repeat=FALSE; // Single measure mode 241 repeat=FALSE; // Single measure mode
238 automatic=FALSE; 242 automatic=FALSE;
239 break; 243 break;
240   244  
241 case 'a': 245 case 'a':
242 repeat=TRUE; // Automatic mode 246 repeat=TRUE; // Automatic mode
243 automatic=TRUE; 247 automatic=TRUE;
244 break; 248 break;
245   249  
246 case 'u': 250 case 'u':
247 reset_cpu(); // Update firmware 251 reset_cpu(); // Update firmware
248 } 252 }
249 } 253 }
250 CREN=0; CREN=1; // Reinitialise USART 254 CREN=0; CREN=1; // Reinitialise USART
251   255  
252 seq++; // Increment the number of measurement 256 seq++; // Increment the number of measurement
253   257  
254 tempa=ReadTemp(SA, RAM_Tamb); // Read temperatures from sensor 258 tempa=ReadTemp(SA, RAM_Tamb); // Read temperatures from sensor
255 ta=tempa*2-27315; // °K -> °C 259 ta=tempa*2-27315; // °K -> °C
256   260  
257 temp=ReadTemp(SA, RAM_Tobj1); 261 temp=ReadTemp(SA, RAM_Tobj1);
258 if (temp>0x48E1) {to1=-27315;} else {to1=temp*2-27315;} 262 if (temp>0x48E1) {to1=-27315;} else {to1=temp*2-27315;}
259 temp=ReadTemp(SA, RAM_Tobj2); 263 temp=ReadTemp(SA, RAM_Tobj2);
260 if (temp>0x48E1) {to2=-27315;} else {to2=temp*2-27315;} 264 if (temp>0x48E1) {to2=-27315;} else {to2=temp*2-27315;}
261   265  
262 touch_present(); //Issues a reset of Touch Memory device 266 touch_present(); //Issues a reset of Touch Memory device
263 touch_write_byte(0xCC); 267 touch_write_byte(0xCC);
264 touch_write_byte(0x44); 268 touch_write_byte(0x44);
265 269
266 //---WDT 270 //---WDT
267 restart_wdt(); 271 restart_wdt();
268 delay(MEASURE_DELAY); // Delay to a next measurement 272 delay(MEASURE_DELAY); // Delay to a next measurement
269   273  
270 { 274 {
271 int8 SN[10]; 275 int8 SN[10];
272 int8 n; 276 int8 n;
273   277  
274 touch_present(); //Issues a reset and returns true if the touch device is there. 278 touch_present(); //Issues a reset and returns true if the touch device is there.
275 touch_write_byte(0xCC); 279 touch_write_byte(0xCC);
276 touch_write_byte(0xBE); 280 touch_write_byte(0xBE);
277 for(n=0;n<9;n++) SN[n]=touch_read_byte(); 281 for(n=0;n<9;n++) SN[n]=touch_read_byte();
278 tLSB=SN[0]; 282 tLSB=SN[0];
279 tMSB=SN[1]; 283 tMSB=SN[1];
280 if ((SN[8]==TM_check_CRC(SN,8))&&(SN[7]==0x10)) // Check CRC and family code to prevent O's error 284 if ((SN[8]==TM_check_CRC(SN,8))&&(SN[7]==0x10)) // Check CRC and family code to prevent O's error
281 { 285 {
282 tTouch=make16(tMSB,tLSB); 286 tTouch=make16(tMSB,tLSB);
283 tTouch=tTouch*6+tTouch/4; // 1bit = 0,0625gradC recalculate to 1/100gradC 287 tTouch=tTouch*6+tTouch/4; // 1bit = 0,0625gradC recalculate to 1/100gradC
284 } 288 }
285 else 289 else
286 { 290 {
287 tTouch=-27315; 291 tTouch=-27315;
288 } 292 }
289 } 293 }
290 294
291 if(automatic) // Solve automatic mode 295 if(automatic) // Solve automatic mode
292 { 296 {
-   297 if (heatTime==0)
-   298 {
293 if(((ta<400)||(ta<(tTouch+400)))&&(ta<2000)&&(ta<told)) heat=1; // Need heating 299 if((ta<taOld)&&(heatPower<20)) heatPower++; // Need wormer ?
-   300 if((ta>taOld)&&(heatPower>0)) heatPower--; // Need colder ?
-   301
-   302 if((ta>=300)&&(ta<2000)) heatPower=1;
-   303 if(ta>=2000) heatPower=0;
-   304  
294 told=ta; 305 taOld=ta;
-   306 heatTime=20;
295 if((abs(to1-to2)<100)&&(tTouch>to1)&&(abs(tTouch-to1)>800)) 307 if(ta>-10000) heat=heatPower;
-   308 }
-   309 heatTime--;
-   310
296 open=1; // Open the dome 311 if((abs(to1-to2)<100)&&(tTouch>to1)&&(abs(tTouch-to1)>800)) open=1; // Open the dome
297 } 312 }
298   313  
299 { // printf 314 { // printf
300 char output[8]; // Output buffer 315 char output[8]; // Output buffer
301 int8 j; // String pointer 316 int8 j; // String pointer
302 int8 check=0; // Checksum is calculated between '$' and '*' 317 int8 check=0; // Checksum is calculated between '$' and '*'
303   318  
304 delay(SEND_DELAY); 319 delay(SEND_DELAY);
305 putc('$'); 320 putc('$');
306 delay(SEND_DELAY); 321 delay(SEND_DELAY);
307 sprintf(output,"M%s \0",VER); 322 sprintf(output,"M%s \0",VER);
308 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++]; }
309 sprintf(output,"%Lu \0", seq); 324 sprintf(output,"%Lu \0", seq);
310 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++]; }
311 sprintf(output,"%Ld \0", ta); 326 sprintf(output,"%Ld \0", ta);
312 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++]; }
313 sprintf(output,"%Ld \0", to1); 328 sprintf(output,"%Ld \0", to1);
314 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++]; }
315 sprintf(output,"%Ld \0", to2); 330 sprintf(output,"%Ld \0", to2);
316 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++]; }
317 sprintf(output,"%Ld \0",tTouch); 332 sprintf(output,"%Ld \0",tTouch);
318 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++]; }
319 sprintf(output,"%u \0", heat); 334 sprintf(output,"%u \0", heat);
320 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++]; }
321 sprintf(output,"%u \0", open); 336 sprintf(output,"%u \0", open);
322 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; } 337 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j]); check^=output[j++]; }
323 sprintf(output,"*%X\r\n\0", check); 338 sprintf(output,"*%X\r\n\0", check);
324 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j++]); } 339 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j++]); }
325 delay(SEND_DELAY); 340 delay(SEND_DELAY);
326 } 341 }
327 342
328 //---WDT 343 //---WDT
329 restart_wdt(); 344 restart_wdt();
330 } 345 }
331 } 346 }
332   347  
333   348  
334 #include "dbloader.c" // Space reservation for the BootLoader 349 #include "dbloader.c" // Space reservation for the BootLoader