Rev 1861 Rev 1942
1 #include "reflow.h" 1 #include "reflow.h"
2 #include <math.h> 2 #include <math.h>
3   3  
4 // nastaveni teplot a casu 4 // nastaveni teplot a casu
5 #define TEPLOTA_PREDEHREVU 120 5 #define TEPLOTA_PREDEHREVU 120
6 #define DOBA_PREDEHREVU 60 6 #define DOBA_PREDEHREVU 60
7   7  
8 #define TEPLOTA_VRCHOLU 210 8 #define TEPLOTA_VRCHOLU 210
9 #define DOBA_VRCHOLU 5 9 #define DOBA_VRCHOLU 5
10   10  
11 // CPU IO rozhrani 11 // CPU IO rozhrani
12 #define LCD_RS PIN_C1 // rizeni registru LCD displeje 12 #define LCD_RS PIN_C1 // rizeni registru LCD displeje
13 #define LCD_E PIN_C2 // enable LCD displeje 13 #define LCD_E PIN_C2 // enable LCD displeje
14 #define LCD_DATA_LSB PIN_D0 // data LCD 14 #define LCD_DATA_LSB PIN_D0 // data LCD
15 #include "lcd.c" 15 #include "lcd.c"
16   16  
17 #define TL1 PIN_B3 // tlacitko S1 17 #define TL1 PIN_B3 // tlacitko S1
18 #define TL2 PIN_B2 // tlacitko S2 18 #define TL2 PIN_B2 // tlacitko S2
19 #define TL3 PIN_B1 // tlacitko S3 19 #define TL3 PIN_B1 // tlacitko S3
20 #define TL4 PIN_B0 // tlacitko S4 20 #define TL4 PIN_B0 // tlacitko S4
21   21  
-   22 #define POWER_T4 PIN_A6 // ovladani optotriaku T3
22 #define POWER_T4 PIN_A5 // ovladani optotriaku T4 23 #define POWER_T4 PIN_A5 // ovladani optotriaku T4
23 #define POWER_T5 PIN_A4 // ovladani optotriaku T5 24 #define POWER_T5 PIN_A4 // ovladani optotriaku T5
24   25  
25 #define ADC_PIN PIN_A0 //info, nelze menit - pin pouzit jako input analog 26 #define ADC_PIN PIN_A0 //info, nelze menit - pin pouzit jako input analog
26 #define ADC_PIN_NC PIN_A1 //info, nelze menit - pin pouzit jako input analog 27 #define ADC_PIN_NC PIN_A1 //info, nelze menit - pin pouzit jako input analog
27 #define REF_PIN PIN_A3 //info, nelze menit - pin pouzit jako input reference 2.5V 28 #define REF_PIN PIN_A3 //info, nelze menit - pin pouzit jako input reference 2.5V
28   29  
29 // interni 30 // interni
30 #define PowerOn() output_low(POWER_T4);output_low(POWER_T5) 31 #define PowerOn() output_low(POWER_T4);output_low(POWER_T5)
31 #define PowerOff() output_high(POWER_T4);output_high(POWER_T5) 32 #define PowerOff() output_high(POWER_T4);output_high(POWER_T5)
32   33  
33 // globalni promenne 34 // globalni promenne
34 struct time 35 struct time
35 { 36 {
36 volatile unsigned int8 hod; 37 volatile unsigned int8 hod;
37 volatile unsigned int8 min; 38 volatile unsigned int8 min;
38 volatile unsigned int8 sec; 39 volatile unsigned int8 sec;
39 }cas; 40 }cas;
40   41  
41 // funkce 42 // funkce
42 void GeneralCpuInit() 43 void GeneralCpuInit()
43 { 44 {
44 output_high(POWER_T4); 45 output_high(POWER_T4);
45 output_high(POWER_T5); 46 output_high(POWER_T5);
46 port_b_pullups(true); 47 port_b_pullups(true);
47 48
48 setup_psp(PSP_DISABLED); 49 setup_psp(PSP_DISABLED);
49 setup_spi(SPI_SS_DISABLED); 50 setup_spi(SPI_SS_DISABLED);
50 51
51 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //nepouzit 52 setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1); //nepouzit
52 setup_timer_1(T1_DISABLED); //nepouzit 53 setup_timer_1(T1_DISABLED); //nepouzit
53 setup_timer_2(T2_DIV_BY_16,249,10); //rtc 40ms 54 setup_timer_2(T2_DIV_BY_16,249,10); //rtc 40ms
54 55
55 setup_comparator(NC_NC_NC_NC); 56 setup_comparator(NC_NC_NC_NC);
56 setup_vref(FALSE); 57 setup_vref(FALSE);
57 58
58 enable_interrupts(GLOBAL); 59 enable_interrupts(GLOBAL);
59 enable_interrupts(INT_TIMER2); 60 enable_interrupts(INT_TIMER2);
60 61
61 setup_adc_ports(AN0_AN1_VSS_VREF); //A0 vstup cidla, A1 nepozit, A3 - ref. 2.5V 62 setup_adc_ports(AN0_AN1_VSS_VREF); //A0 vstup cidla, A1 nepozit, A3 - ref. 2.5V
62 setup_adc(ADC_CLOCK_DIV_8); 63 setup_adc(ADC_CLOCK_DIV_8);
63 SET_ADC_CHANNEL(0); //AN0, PIN_A0 64 SET_ADC_CHANNEL(0); //AN0, PIN_A0
64 } 65 }
65   66  
66 unsigned int16 adc(void) 67 unsigned int16 adc(void)
67 { 68 {
68 unsigned int16 analog; 69 unsigned int16 analog;
69 unsigned int8 a; 70 unsigned int8 a;
70   71  
71 analog = 0; 72 analog = 0;
72 for (a=0;a<32;a++) 73 for (a=0;a<32;a++)
73 { 74 {
74 analog += read_adc(); 75 analog += read_adc();
75 delay_us(50); 76 delay_us(50);
76 } 77 }
77 return (analog >> 5 ); // prumer = analog/32 78 return (analog >> 5 ); // prumer = analog/32
78 } 79 }
79   80  
80 int16 teplota(void) 81 int16 teplota(void)
81 { 82 {
-   83  
-   84 BYTE CONST TEMP_CALLIBRATION[20] = {0x90,0xb7,0x19,0x15,0x36,0x54,0x50,0xb5,0,0x24};
-   85  
-   86 int16 Temp;
-   87  
82 float32 Rpt; 88 /* float32 Rpt;
83 float32 Tpt; 89 float32 Tpt;
84   90  
85 Rpt = 1.0*adc()*2350.0/1024.0; //zapojeni OZ -> R=U/Iconst 91 Rpt = 1.0*adc()*2350.0/1024.0; //zapojeni OZ -> R=U/Iconst
86 92
87 #define A 3.90802e-3 93 #define A 3.90802e-3
88 #define B -5.802e-7 94 #define B -5.802e-7
89 95
90 Tpt = (-A + sqrt(A*A - 4*B*(1.0 - Rpt/1000.0)))/2.0/B; 96 Tpt = (-A + sqrt(A*A - 4*B*(1.0 - Rpt/1000.0)))/2.0/B;
-   97 */
91   98  
92 return (unsigned int16)Tpt; -  
93 } -  
94   99  
95 void baterie(void) -  
96 { 100  
97 static int8 stav=0; -  
98 switch (stav) -  
99 { -  
100 case 0: stav++; -  
101 lcd_define_char(0,LCD_CHAR_BAT0); -  
102 break; -  
103 case 1: stav++; -  
104 lcd_define_char(0,LCD_CHAR_BAT20); -  
105 break; -  
106 case 2: stav++; -  
107 lcd_define_char(0,LCD_CHAR_BAT40); -  
108 PowerOff(); -  
109 break; -  
110 case 3: stav++; -  
111 lcd_define_char(0,LCD_CHAR_BAT60); -  
112 break; 101 return Temp;
113 case 4: stav++; -  
114 lcd_define_char(0,LCD_CHAR_BAT80); -  
115 break; -  
116 case 5: stav=0; -  
117 lcd_define_char(0,LCD_CHAR_BAT100); -  
118 PowerOn(); -  
119 break; -  
120 default: stav=0; -  
121 } -  
122 } 102 }
123   103  
-   104  
124 #int_TIMER2 105 #int_TIMER2
125 void Rtc(void) //40ms 106 void Rtc(void) //40ms
126 { 107 {
127 static unsigned int8 ms40=0; 108 static unsigned int8 ms40=0;
128 struct time* time; 109 struct time* time;
129 110
130 time=&cas; 111 time=&cas;
131 if ( ++ms40 < 25) return; 112 if ( ++ms40 < 25) return;
132 113
133 ms40=0; 114 ms40=0;
134 if (++(time->sec) >= 60) 115 if (++(time->sec) >= 60)
135 { 116 {
136 time->sec=0; //1min 117 time->sec=0; //1min
137 if (++(time->min) >= 60) 118 if (++(time->min) >= 60)
138 { 119 {
139 time->min = 0; //1hod 120 time->min = 0; //1hod
140 (time->hod)++; 121 (time->hod)++;
141 } 122 }
142 } 123 }
143 } 124 }
144   125  
145 void nullcas(struct time* time) 126 void nullcas(struct time* time)
146 { 127 {
147 disable_interrupts(INT_TIMER2); 128 disable_interrupts(INT_TIMER2);
148 129
149 time->sec=0; 130 time->sec=0;
150 time->hod=0; 131 time->hod=0;
151 time->min=0; 132 time->min=0;
152 133
153 enable_interrupts(INT_TIMER2); 134 enable_interrupts(INT_TIMER2);
154 } 135 }
155   136  
156 // start 137 // start
157 void main() 138 void main()
158 { 139 {
159 int8 tmp; 140 int8 tmp;
160 -  
161 GeneralCpuInit(); 141 GeneralCpuInit();
162 -  
163 PowerOff(); 142 PowerOff();
164 143
165 lcd_init(); 144 lcd_init();
166 lcd_define_char(1,LCD_CHAR_STUPEN); 145 lcd_define_char(1,LCD_CHAR_STUPEN);
167 -  
168 printf(lcd_putc,"\fbatt: \20"); -  
169 146
170 nullcas(&cas); 147 nullcas(&cas);
171 148
172 for (;;){ 149 while(true)
-   150 {
173 delay_ms(300); 151 delay_ms(300);
174 152
175 if (cas.sec != tmp){ 153 if (cas.sec != tmp){
176 tmp=cas.sec; 154 tmp=cas.sec;
177 lcd_gotoxy(9,1); 155 lcd_gotoxy(9,1);
178 printf(lcd_putc,"%2u:%02u:%02u",cas.hod,cas.min,cas.sec); 156 printf(lcd_putc,"%2u:%02u:%02u",cas.hod,cas.min,cas.sec);
179 } 157 }
180 158
181 baterie(); -  
182 lcd_gotoxy(1,2); 159 lcd_gotoxy(1,2);
183 printf(lcd_putc,"teplota: %ld\21C ",teplota()); 160 printf(lcd_putc,"teplota: %ld\21C ",teplota());
184 } 161 }
185 } 162 }