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