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