Rev 1283 Rev 1284
Line 1... Line 1...
1 /**** IR Mrakomer 4 ****/ 1 /**** IR Mrakomer 4 ****/
2 #define VERSION "4.0" 2 #define VERSION "4.0"
3 #define ID "$Id: irmrak4.c 1283 2009-01-07 14:07:16Z kakl $" 3 #define ID "$Id: irmrak4.c 1284 2009-01-07 21:05:29Z kakl $"
4 #include "irmrak4.h" 4 #include "irmrak4.h"
5   5  
6 #define MAXHEAT 20 // Number of cycles for heating 6 #define MAXHEAT 20 // Number of cycles for heating
7 #define MAXOPEN 20 // Number of cycles for dome open 7 #define MAXOPEN 20 // Number of cycles for dome open
8 #define MEASURE_DELAY 10000 // Delay to a next measurement 8 #define MEASURE_DELAY 10000 // Delay to a next measurement
Line 22... Line 22...
22 char REV[50]=ID; 22 char REV[50]=ID;
23   23  
24 int8 heat; // Status variables 24 int8 heat; // Status variables
25 int8 open; 25 int8 open;
26   26  
27 inline void toggle_dome(void) 27 inline void toggle_dome(void) // Wire exercise
28 { 28 {
29 if (open>0) 29 if (open>0)
30 {output_toggle(DOME);} 30 {output_toggle(DOME);}
31 else 31 else
32 {output_low(DOME);} 32 {output_low(DOME);}
33 } 33 }
34   34  
35 void delay(int16 cycles) 35 void delay(int16 cycles) // Wire exercise with delay
36 { 36 {
37 int16 i; 37 int16 i;
38   38  
39 for(i=0; i<cycles; i++) {toggle_dome(); delay_us(100);} 39 for(i=0; i<cycles; i++) {toggle_dome(); delay_us(100);}
40 } 40 }
41   41  
-   42 void welcome(void) // Welcome message
-   43 {
-   44 printf("\n\r* Mrakomer %s (C) 2007 KAKL *\n\r",VER); // Welcome message
-   45 printf("* %s *\n\r",REV);
-   46 printf("<#sequence> <ambient [1/100 C]> <sky [1/100 C]> ");
-   47 printf("<heating [s]> <dome [s]>\n\r\n\r");
-   48 }
42   49  
-   50  
43 #include "smb.c" 51 #include "smb.c" // System Management Bus driver
44   52  
45   53  
46 // Read sensor RAM 54 // Read sensor RAM
47 // Returns temperature in °K 55 // Returns temperature in °K
48 int16 ReadTemp(int8 addr, int8 select) 56 int16 ReadTemp(int8 addr, int8 select)
Line 51... Line 59...
51 int8 crc; // Readed CRC 59 int8 crc; // Readed CRC
52 int16 temp; // Readed temperature 60 int16 temp; // Readed temperature
53   61  
54 addr<<=1; 62 addr<<=1;
55   63  
56 SMB_STOP_bit(); //If slave send NACK stop comunication 64 SMB_STOP_bit(); //If slave send NACK stop comunication
57 SMB_START_bit(); //Start condition 65 SMB_START_bit(); //Start condition
58 SMB_TX_byte(addr); 66 SMB_TX_byte(addr);
59 SMB_TX_byte(RAM_Access|select); 67 SMB_TX_byte(RAM_Access|select);
60 SMB_START_bit(); //Repeated Start condition 68 SMB_START_bit(); //Repeated Start condition
61 SMB_TX_byte(addr); 69 SMB_TX_byte(addr);
62 arr[2]=SMB_RX_byte(ACK); //Read low data,master must send ACK 70 arr[2]=SMB_RX_byte(ACK); //Read low data,master must send ACK
63 arr[1]=SMB_RX_byte(ACK); //Read high data,master must send ACK 71 arr[1]=SMB_RX_byte(ACK); //Read high data,master must send ACK
64 temp=MAKE16(arr[1],arr[2]); 72 temp=MAKE16(arr[1],arr[2]);
65 crc=SMB_RX_byte(NACK); //Read PEC byte, master must send NACK 73 crc=SMB_RX_byte(NACK); //Read PEC byte, master must send NACK
66 SMB_STOP_bit(); //Stop condition 74 SMB_STOP_bit(); //Stop condition
67   75  
68 arr[5]=addr; 76 arr[5]=addr;
69 arr[4]=RAM_Access|select; 77 arr[4]=RAM_Access|select;
70 arr[3]=addr; 78 arr[3]=addr;
71 arr[0]=0; 79 arr[0]=0;
72 if (crc != PEC_calculation(arr)) temp=0; // Calculate and check CRC 80 if (crc != PEC_calculation(arr)) temp=0; // Calculate and check CRC
73   81  
74 return temp; 82 return temp;
75 } 83 }
76   84  
-   85 /*-----------------------------------------------------------------------*/
77 void main() 86 void main()
78 { 87 {
79 unsigned int16 seq, temp, tempa; 88 unsigned int16 seq, temp, tempa;
80 signed int16 ta, to; 89 signed int16 ta, to;
81 int8 safety_counter; 90 int8 safety_counter;
82   91  
-   92 output_low(DOME); // Close Dome
83 output_low(HEATING); // Heating off 93 output_low(HEATING); // Heating off
84 setup_wdt(WDT_2304MS); // Setup Watch Dog 94 setup_wdt(WDT_2304MS); // Setup Watch Dog
85 setup_adc_ports(NO_ANALOGS); 95 setup_adc_ports(NO_ANALOGS);
86 setup_adc(ADC_OFF); 96 setup_adc(ADC_OFF);
87 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); 97 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
Line 92... Line 102...
92 // setup_oscillator(OSC_4MHZ|OSC_INTRC,+2); // Pokud je nutna kalibrace RCosc 102 // setup_oscillator(OSC_4MHZ|OSC_INTRC,+2); // Pokud je nutna kalibrace RCosc
93 setup_oscillator(OSC_8MHZ|OSC_INTRC); 103 setup_oscillator(OSC_8MHZ|OSC_INTRC);
94   104  
95 delay_ms(1000); 105 delay_ms(1000);
96 restart_wdt(); 106 restart_wdt();
97 printf("\n\r* Mrakomer %s (C) 2007 KAKL *\n\r",VER); // Welcome message -  
-   107  
98 printf("* %s *\n\r",REV); 108 welcome();
99 printf("<#sequence> <ambient [1/100 C]> <sky [1/100 C]> "); -  
100 printf("<heating [s]> <dome [s]>\n\r\n\r"); -  
-   109
101 tempa=ReadTemp(SA, RAM_Tamb); // Dummy read 110 tempa=ReadTemp(SA, RAM_Tamb); // Dummy read
102 temp=ReadTemp(SA, RAM_Tobj1); 111 temp=ReadTemp(SA, RAM_Tobj1);
103   112  
104 seq=0; 113 seq=0; // Variables initiation
105 heat=0; 114 heat=0;
106 open=0; 115 open=0;
107   116  
108 // enable_interrupts(GLOBAL); -  
109 // enable_interrupts(INT_RDA); -  
110   -  
111 //---WDT 117 //---WDT
112 restart_wdt(); 118 restart_wdt();
113   119  
114 while(TRUE) 120 while(TRUE) // Main Loop
115 { 121 {
116 while(kbhit()) getc(); // Flush USART buffer 122 while(kbhit()) getc(); // Flush USART buffer
117 CREN=0; CREN=1; // Reinitialise USART 123 CREN=0; CREN=1; // Reinitialise USART
118   124  
119 safety_counter=0; 125 safety_counter=SAFETY_COUNT; // Heating and Dome Count Down
120   -  
121 do 126 do
122 { 127 {
123 if (safety_counter<SAFETY_COUNT) safety_counter++; 128 if (safety_counter<SAFETY_COUNT) safety_counter++;
124   129  
125 delay(RESPONSE_DELAY); 130 delay(RESPONSE_DELAY);
Line 141... Line 146...
141 safety_counter=0; 146 safety_counter=0;
142 //---WDT 147 //---WDT
143 restart_wdt(); 148 restart_wdt();
144 } 149 }
145 } while (!kbhit()); 150 } while (!kbhit());
146   151
147 //---WDT 152 //---WDT
148 restart_wdt(); 153 restart_wdt();
149 { 154 { // Retrieve command
150 char ch; 155 char ch;
151   156  
152 ch=getc(); 157 ch=getc();
153   158  
154 switch (ch) 159 switch (ch)
Line 163... Line 168...
163   168  
164 case 'o': 169 case 'o':
165 open=MAXOPEN; // Open the dome 170 open=MAXOPEN; // Open the dome
166 break; 171 break;
167   172  
-   173 case 'x':
-   174 open=MAXOPEN; // Open the dome
-   175 heat=MAXHEAT; // Need heating
-   176 break;
-   177  
168 case 'l': 178 case 'l':
169 open=0; // Lock the dome 179 open=0; // Lock the dome
170 break; 180 break;
-   181  
-   182 case 'i':
-   183 welcome(); // Information about version, etc...
-   184 break;
171 } 185 }
172 } 186 }
173   187  
174 seq++; // Increment the number of measurement 188 seq++; // Increment the number of measurement
175   189  
Line 178... Line 192...
178   192  
179 ta=tempa*2-27315; // °K -> °C 193 ta=tempa*2-27315; // °K -> °C
180 to=temp*2-27315; 194 to=temp*2-27315;
181   195  
182 { // printf 196 { // printf
183 char output[10]; // Output buffer 197 char output[8]; // Output buffer
184 int8 j; // Counter 198 int8 j; // String pointer
185   199  
186 delay(SEND_DELAY); 200 delay(SEND_DELAY);
187 sprintf(output,"#%Lu ", seq); 201 sprintf(output,"#%Lu ", seq);
188 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j++]); } 202 j=0; while(output[j]!=0) { delay(SEND_DELAY); putc(output[j++]); }
189 sprintf(output,"%Ld ", ta); 203 sprintf(output,"%Ld ", ta);