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