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