Rev Author Line No. Line
1274 kakl 1 /**** IR Mrakomer 4 ****/
2 #define VERSION "4.0"
1277 kakl 3 #define ID "$Id: irmrak4.c 1289 2009-01-08 19:13:06Z kakl $"
1274 kakl 4 #include "irmrak4.h"
5  
1289 kakl 6 #CASE // Case sensitive compiler
7  
1280 kakl 8 #define MAXHEAT 20 // Number of cycles for heating
9 #define MAXOPEN 20 // Number of cycles for dome open
1287 kakl 10 #define MEASURE_DELAY 6000 // Delay to a next measurement
1280 kakl 11 #define RESPONSE_DELAY 100 // Reaction time after receiving a command
1287 kakl 12 #define SAFETY_COUNT 90 // Time of one emergency cycle
1280 kakl 13 #define SEND_DELAY 50 // Time between two characters on RS232
1275 kakl 14  
1274 kakl 15 #define DOME PIN_B4 // Dome controll port
16 #define HEATING PIN_B3 // Heating for defrosting
17  
18 #bit CREN = 0x18.4 // USART registers
19 #bit SPEN = 0x18.7
20 #bit OERR = 0x18.1
21 #bit FERR = 0x18.2
22  
1280 kakl 23 char VER[4]=VERSION; // Buffer for concatenate of a version string
1274 kakl 24 char REV[50]=ID;
25  
1280 kakl 26 int8 heat; // Status variables
1274 kakl 27 int8 open;
28  
1284 kakl 29 inline void toggle_dome(void) // Wire exercise
1275 kakl 30 {
31 if (open>0)
1285 kakl 32 {output_toggle(DOME);} // Toggle = Open Dome
33 else
34 {output_high(DOME);} // Do not toggle = Close Dome
1275 kakl 35 }
1274 kakl 36  
1284 kakl 37 void delay(int16 cycles) // Wire exercise with delay
1274 kakl 38 {
1275 kakl 39 int16 i;
1278 kakl 40  
1275 kakl 41 for(i=0; i<cycles; i++) {toggle_dome(); delay_us(100);}
42 }
1274 kakl 43  
1284 kakl 44 void welcome(void) // Welcome message
45 {
46 printf("\n\r* Mrakomer %s (C) 2007 KAKL *\n\r",VER); // Welcome message
47 printf("* %s *\n\r",REV);
48 printf("<#sequence> <ambient [1/100 C]> <sky [1/100 C]> ");
49 printf("<heating [s]> <dome [s]>\n\r\n\r");
50 }
1274 kakl 51  
52  
1284 kakl 53 #include "smb.c" // System Management Bus driver
1274 kakl 54  
1284 kakl 55  
1280 kakl 56 // Read sensor RAM
57 // Returns temperature in °K
1281 kakl 58 int16 ReadTemp(int8 addr, int8 select)
1274 kakl 59 {
60 unsigned char arr[6]; // Buffer for the sent bytes
61 int8 crc; // Readed CRC
62 int16 temp; // Readed temperature
63  
1275 kakl 64 addr<<=1;
65  
1284 kakl 66 SMB_STOP_bit(); //If slave send NACK stop comunication
67 SMB_START_bit(); //Start condition
1275 kakl 68 SMB_TX_byte(addr);
69 SMB_TX_byte(RAM_Access|select);
1284 kakl 70 SMB_START_bit(); //Repeated Start condition
1275 kakl 71 SMB_TX_byte(addr);
1284 kakl 72 arr[2]=SMB_RX_byte(ACK); //Read low data,master must send ACK
73 arr[1]=SMB_RX_byte(ACK); //Read high data,master must send ACK
1289 kakl 74 temp=make16(arr[1],arr[2]);
1284 kakl 75 crc=SMB_RX_byte(NACK); //Read PEC byte, master must send NACK
76 SMB_STOP_bit(); //Stop condition
1274 kakl 77  
78 arr[5]=addr;
79 arr[4]=RAM_Access|select;
80 arr[3]=addr;
81 arr[0]=0;
82 if (crc != PEC_calculation(arr)) temp=0; // Calculate and check CRC
83  
84 return temp;
85 }
86  
1284 kakl 87 /*-----------------------------------------------------------------------*/
1274 kakl 88 void main()
89 {
1280 kakl 90 unsigned int16 seq, temp, tempa;
1274 kakl 91 signed int16 ta, to;
1280 kakl 92 int8 safety_counter;
1288 kakl 93 int1 repeat;
1274 kakl 94  
1285 kakl 95 output_high(DOME); // Close Dome
1274 kakl 96 output_low(HEATING); // Heating off
97 setup_wdt(WDT_2304MS); // Setup Watch Dog
98 setup_adc_ports(NO_ANALOGS);
99 setup_adc(ADC_OFF);
100 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
101 setup_timer_1(T1_DISABLED);
102 setup_timer_2(T2_DISABLED,0,1);
103 setup_comparator(NC_NC_NC_NC);
104 setup_vref(FALSE);
105 // setup_oscillator(OSC_4MHZ|OSC_INTRC,+2); // Pokud je nutna kalibrace RCosc
1283 kakl 106 setup_oscillator(OSC_8MHZ|OSC_INTRC);
1274 kakl 107  
108 delay_ms(1000);
109 restart_wdt();
1284 kakl 110  
1285 kakl 111 seq=0; // Variables initiation
112 heat=0;
113 open=0;
1288 kakl 114 repeat=FALSE;
1289 kakl 115  
1284 kakl 116 welcome();
1285 kakl 117  
1274 kakl 118 tempa=ReadTemp(SA, RAM_Tamb); // Dummy read
119 temp=ReadTemp(SA, RAM_Tobj1);
120  
1286 kakl 121 delay_ms(1000);
1280 kakl 122 //---WDT
1274 kakl 123 restart_wdt();
124  
1284 kakl 125 while(TRUE) // Main Loop
1274 kakl 126 {
1284 kakl 127 safety_counter=SAFETY_COUNT; // Heating and Dome Count Down
1278 kakl 128 do
1274 kakl 129 {
1280 kakl 130 if (safety_counter<SAFETY_COUNT) safety_counter++;
1274 kakl 131  
1280 kakl 132 delay(RESPONSE_DELAY);
133  
134 if (safety_counter>=SAFETY_COUNT)
135 {
1288 kakl 136 if (heat>0) heat--;
1280 kakl 137 if (open>0) open--;
138  
139 safety_counter=0;
140 //---WDT
141 restart_wdt();
142 }
1288 kakl 143 } while (!kbhit()&&!repeat);
1285 kakl 144  
1280 kakl 145 //---WDT
146 restart_wdt();
1284 kakl 147 { // Retrieve command
1288 kakl 148 char ch='k';
1278 kakl 149  
1288 kakl 150 if(kbhit()) ch=getc();
1278 kakl 151  
1274 kakl 152 switch (ch)
153 {
154 case 'h':
1280 kakl 155 heat=MAXHEAT; // Need heating
1274 kakl 156 break;
1278 kakl 157  
1274 kakl 158 case 'c':
1280 kakl 159 heat=0; // Need colder
1274 kakl 160 break;
1278 kakl 161  
1274 kakl 162 case 'o':
163 open=MAXOPEN; // Open the dome
164 break;
1278 kakl 165  
1284 kakl 166 case 'x':
167 open=MAXOPEN; // Open the dome
168 heat=MAXHEAT; // Need heating
169 break;
170  
1274 kakl 171 case 'l':
172 open=0; // Lock the dome
173 break;
1284 kakl 174  
175 case 'i':
1287 kakl 176 if (open==0) welcome(); // Information about version, etc...
177 break; // Only when dome is closed
1288 kakl 178  
179 case 'r':
180 repeat=TRUE; // Repeate measure mode
181 break;
182  
183 case 's':
184 repeat=FALSE; // Single measure mode
185 break;
1274 kakl 186 }
187 }
1288 kakl 188 // while(kbhit()) getc(); // Flush USART buffer
189 CREN=0; CREN=1; // Reinitialise USART
1274 kakl 190  
1280 kakl 191 seq++; // Increment the number of measurement
1274 kakl 192  
193 tempa=ReadTemp(SA, RAM_Tamb); // Read temperatures from sensor
194 temp=ReadTemp(SA, RAM_Tobj1);
195  
196 ta=tempa*2-27315; // °K -> °C
197 to=temp*2-27315;
198  
199 { // printf
1284 kakl 200 char output[8]; // Output buffer
201 int8 j; // String pointer
1278 kakl 202  
1282 kakl 203 delay(SEND_DELAY);
204 sprintf(output,"#%Lu ", seq);
205 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j++]); }
206 sprintf(output,"%Ld ", ta);
207 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j++]); }
208 sprintf(output,"%Ld ", to);
209 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j++]); }
1283 kakl 210 sprintf(output,"%u ", heat);
1282 kakl 211 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j++]); }
212 sprintf(output,"%u\n\r\0", open);
213 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j++]); }
1274 kakl 214 }
1280 kakl 215  
1289 kakl 216 if(heat>0) { output_high(HEATING); } else { output_low(HEATING); }
217  
1280 kakl 218 delay(MEASURE_DELAY); // Delay to a next measurement
219 //---WDT
220 restart_wdt();
1274 kakl 221 }
222 }
223