Rev 919 Rev 928
1 /**** IR Mrakomer3 ****/ 1 /**** IR Mrakomer3 ****/
2 #define VERSION "3.0" 2 #define VERSION "3.0"
3 #define ID "$Id: irmrak3.c 919 2007-12-12 23:39:01Z kakl $" 3 #define ID "$Id: irmrak3.c 928 2007-12-24 09:52:55Z kakl $"
4 #include "irmrak3.h" 4 #include "irmrak3.h"
-   5 #bit SSPM3=0x14.3
5   6  
6 #define SA 0x00 // Slave Address (0 for single slave / 0x5A<<1 default) 7 #define SA 0x00 // Slave Address (0 for single slave / 0x5A<<1 default)
7 #define RAM_Access 0x00 // RAM access command 8 #define RAM_Access 0x00 // RAM access command
8 #define RAM_Tobj1 0x07 // To1 address in the eeprom 9 #define RAM_Tobj1 0x07 // To1 address in the eeprom
9 #define RAM_Tamb 0x06 // Ta address in the eeprom 10 #define RAM_Tamb 0x06 // Ta address in the eeprom
10 #define HEATING PIN_A2 // Heating for defrosting 11 #define HEATING PIN_A2 // Heating for defrosting
11 #define MAXHEAT 60 // Number of cycles for heating 12 #define MAXHEAT 60 // Number of cycles for heating
12   13  
13 char VER[4]=VERSION; 14 char VER[4]=VERSION;
14 char REV[50]=ID; 15 char REV[50]=ID;
15   16  
16 unsigned char PEC_calculation(unsigned char pec[]) // CRC calculation 17 unsigned char PEC_calculation(unsigned char pec[]) // CRC calculation
17 { 18 {
18 unsigned char crc[6]; 19 unsigned char crc[6];
19 unsigned char BitPosition=47; 20 unsigned char BitPosition=47;
20 unsigned char shift; 21 unsigned char shift;
21 unsigned char i; 22 unsigned char i;
22 unsigned char j; 23 unsigned char j;
23 unsigned char temp; 24 unsigned char temp;
24   25  
25 do 26 do
26 { 27 {
27 crc[5]=0; /* Load CRC value 0x000000000107 */ 28 crc[5]=0; /* Load CRC value 0x000000000107 */
28 crc[4]=0; 29 crc[4]=0;
29 crc[3]=0; 30 crc[3]=0;
30 crc[2]=0; 31 crc[2]=0;
31 crc[1]=0x01; 32 crc[1]=0x01;
32 crc[0]=0x07; 33 crc[0]=0x07;
33 BitPosition=47; /* Set maximum bit position at 47 */ 34 BitPosition=47; /* Set maximum bit position at 47 */
34 shift=0; 35 shift=0;
35   36  
36 //Find first 1 in the transmited message 37 //Find first 1 in the transmited message
37 i=5; /* Set highest index */ 38 i=5; /* Set highest index */
38 j=0; 39 j=0;
39 while((pec[i]&(0x80>>j))==0 && i>0) 40 while((pec[i]&(0x80>>j))==0 && i>0)
40 { 41 {
41 BitPosition--; 42 BitPosition--;
42 if(j<7) 43 if(j<7)
43 { 44 {
44 j++; 45 j++;
45 } 46 }
46 else 47 else
47 { 48 {
48 j=0x00; 49 j=0x00;
49 i--; 50 i--;
50 } 51 }
51 }/*End of while */ 52 }/*End of while */
52   53  
53 shift=BitPosition-8; /*Get shift value for crc value*/ 54 shift=BitPosition-8; /*Get shift value for crc value*/
54   55  
55   56  
56 //Shift crc value 57 //Shift crc value
57 while(shift) 58 while(shift)
58 { 59 {
59 for(i=5; i<0xFF; i--) 60 for(i=5; i<0xFF; i--)
60 { 61 {
61 if((crc[i-1]&0x80) && (i>0)) 62 if((crc[i-1]&0x80) && (i>0))
62 { 63 {
63 temp=1; 64 temp=1;
64 } 65 }
65 else 66 else
66 { 67 {
67 temp=0; 68 temp=0;
68 } 69 }
69 crc[i]<<=1; 70 crc[i]<<=1;
70 crc[i]+=temp; 71 crc[i]+=temp;
71 }/*End of for*/ 72 }/*End of for*/
72 shift--; 73 shift--;
73 }/*End of while*/ 74 }/*End of while*/
74   75  
75 //Exclusive OR between pec and crc 76 //Exclusive OR between pec and crc
76 for(i=0; i<=5; i++) 77 for(i=0; i<=5; i++)
77 { 78 {
78 pec[i] ^=crc[i]; 79 pec[i] ^=crc[i];
79 }/*End of for*/ 80 }/*End of for*/
80 } while(BitPosition>8);/*End of do-while*/ 81 } while(BitPosition>8);/*End of do-while*/
81   82  
82 return pec[0]; 83 return pec[0];
83 }/*End of PEC_calculation*/ 84 }/*End of PEC_calculation*/
84   85  
85   86  
86 int16 ReadTemp(int8 addr, int8 select) // Read sensor RAM 87 int16 ReadTemp(int8 addr, int8 select) // Read sensor RAM
87 { 88 {
88 unsigned char arr[6]; // Buffer for the sent bytes 89 unsigned char arr[6]; // Buffer for the sent bytes
89 int8 crc; // Readed CRC 90 int8 crc; // Readed CRC
90 int16 temp; // Readed temperature 91 int16 temp; // Readed temperature
91   92  
92 i2c_stop(); 93 i2c_stop();
93 i2c_start(); 94 i2c_start();
94 i2c_write(addr); 95 i2c_write(addr);
95 i2c_write(RAM_Access|select); // Select the teperature sensor in device 96 i2c_write(RAM_Access|select); // Select the teperature sensor in device
96 i2c_start(); 97 i2c_start();
97 i2c_write(addr); 98 i2c_write(addr);
98 arr[2]=i2c_read(1); // lo 99 arr[2]=i2c_read(1); // lo
99 arr[1]=i2c_read(1); // hi 100 arr[1]=i2c_read(1); // hi
100 temp=MAKE16(arr[1],arr[2]); 101 temp=MAKE16(arr[1],arr[2]);
101 crc=i2c_read(0); //crc 102 crc=i2c_read(0); //crc
102 i2c_stop(); 103 i2c_stop();
103   104  
104 arr[5]=addr; 105 arr[5]=addr;
105 arr[4]=RAM_Access|select; 106 arr[4]=RAM_Access|select;
106 arr[3]=addr; 107 arr[3]=addr;
107 arr[0]=0; 108 arr[0]=0;
108 if (crc != PEC_calculation(arr)) temp=0; // Calculate and check CRC 109 if (crc != PEC_calculation(arr)) temp=0; // Calculate and check CRC
109   110  
110 return temp; 111 return temp;
111 } 112 }
112   113  
113 void main() 114 void main()
114 { 115 {
115 unsigned int16 n, temp, tempa; 116 unsigned int16 n, temp, tempa;
116 signed int16 ta, to; 117 signed int16 ta, to;
117 int8 i; 118 int8 i;
118   119  
119 output_low(HEATING); // Heating off 120 output_low(HEATING); // Heating off
120 setup_wdt(WDT_2304MS); // Setup Watch Dog 121 setup_wdt(WDT_2304MS); // Setup Watch Dog
121 setup_adc_ports(NO_ANALOGS); 122 setup_adc_ports(NO_ANALOGS);
122 setup_adc(ADC_OFF); 123 setup_adc(ADC_OFF);
123 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); 124 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
124 setup_timer_1(T1_DISABLED); 125 setup_timer_1(T1_DISABLED);
125 setup_timer_2(T2_DISABLED,0,1); 126 setup_timer_2(T2_DISABLED,0,1);
126 setup_comparator(NC_NC_NC_NC); 127 setup_comparator(NC_NC_NC_NC);
127 setup_vref(FALSE); 128 setup_vref(FALSE);
128 setup_oscillator(OSC_4MHZ|OSC_INTRC); 129 setup_oscillator(OSC_4MHZ|OSC_INTRC);
129   130  
-   131 // SSPM3=1;
-   132  
130 delay_ms(1000); 133 delay_ms(1000);
131 printf("\n\r* Mrakomer %s (C) 2007 KAKL *\n\r",VER); // Welcome message 134 printf("\n\r* Mrakomer %s (C) 2007 KAKL *\n\r",VER); // Welcome message
132 printf("* %s *\n\r\n\r",REV); 135 printf("* %s *\n\r\n\r",REV);
133 tempa=ReadTemp(SA, RAM_Tamb); // Dummy read 136 tempa=ReadTemp(SA, RAM_Tamb); // Dummy read
134 temp=ReadTemp(SA, RAM_Tobj1); 137 temp=ReadTemp(SA, RAM_Tobj1);
135   138  
136 n=0; 139 n=0;
137 i=MAXHEAT; 140 i=MAXHEAT;
138   141  
139 while(TRUE) 142 while(TRUE)
140 { 143 {
141 n++; 144 n++;
142   145  
-   146 if (kbhit())
-   147 {
-   148 delay_ms(200);
143 if (kbhit()) if ('w'==getc()) i=0; // Would you like warmer? 149 if ('w'==getc()) i=0; // Would you like warmer?
-   150 }
144   151  
145 tempa=ReadTemp(SA, RAM_Tamb); // Read temperatures from sensor 152 tempa=ReadTemp(SA, RAM_Tamb); // Read temperatures from sensor
146 temp=ReadTemp(SA, RAM_Tobj1); 153 temp=ReadTemp(SA, RAM_Tobj1);
147   154  
148 if((0==tempa)||(0==temp)) // Transfer error? 155 if((0==tempa)||(0==temp)) // Transfer error?
149 { 156 {
150 printf("%Lu;ta:-273;ts:-273;Error\n\r",n); 157 printf("%Lu;ta:-273;ts:-273;Error\n\r",n);
151 output_low(HEATING); 158 output_low(HEATING);
152 } 159 }
153 else 160 else
154 { 161 {
155 to=(signed int16)(temp*2-27315)/100; 162 to=(signed int16)(temp*2-27315)/100;
156 ta=(signed int16)(tempa*2-27315)/100; 163 ta=(signed int16)(tempa*2-27315)/100;
157   164  
158 printf("%Lu;ta:%Ld;ts:%Ld;",n,ta,to); 165 printf("%Lu;ta:%Ld;ts:%Ld;",n,ta,to);
159 if (i>=MAXHEAT) 166 if (i>=MAXHEAT)
160 { 167 {
161 printf("OK\n\r"); 168 printf("OK\n\r");
162 output_low(HEATING); 169 output_low(HEATING);
163 } 170 }
164 else 171 else
165 { 172 {
166 printf("Heating\n\r"); 173 printf("Heating\n\r");
167 output_high(HEATING); 174 output_high(HEATING);
168 i++; 175 i++;
169 } 176 }
170 }; 177 };
171 restart_wdt(); 178 restart_wdt();
172 delay_ms(900); 179 delay_ms(900);
173 } 180 }
174 } 181 }
175   182