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