1 | /* Vacuum Station
|
2 | By Stefan Haemmerle
|
3 | */
|
4 |
|
5 | // LCD modul
|
6 | sbit LCD_RS at RA1_bit;
|
7 | sbit LCD_EN at RA5_bit;
|
8 | sbit LCD_D4 at RB4_bit;
|
9 | sbit LCD_D5 at RB5_bit;
|
10 | sbit LCD_D6 at RB6_bit;
|
11 | sbit LCD_D7 at RB7_bit;
|
12 | sbit LCD_RS_Direction at TRISA1_bit;
|
13 | sbit LCD_EN_Direction at TRISA5_bit;
|
14 | sbit LCD_D4_Direction at TRISB4_bit;
|
15 | sbit LCD_D5_Direction at TRISB5_bit;
|
16 | sbit LCD_D6_Direction at TRISB6_bit;
|
17 | sbit LCD_D7_Direction at TRISB7_bit;
|
18 |
|
19 |
|
20 | // Hysterese
|
21 | sbit MENU_sw at RA2_bit;
|
22 | sbit SELECT_sw at RA3_bit;
|
23 | sbit ENTER_sw at RA4_bit;
|
24 | sbit START_sw at RB0_bit;
|
25 | sbit Pumpen_Relais at RB3_bit;
|
26 | sbit Wechsel_Ventil at RB2_bit;
|
27 | sbit Entluef_Ventil at RB1_bit;
|
28 | sbit Sensor at RA0_bit;
|
29 | sbit Sensor_Direction at TRISA0_bit;
|
30 |
|
31 |
|
32 | // Nachrichten definition
|
33 |
|
34 | char NA2[] = " Pause = ";
|
35 | char NA3[] = " Vacuum = ";
|
36 | char NA4[] = " Druck =-";
|
37 | char NA5[] = " Y/N = ";
|
38 |
|
39 |
|
40 | unsigned short SS_Pos = 10;
|
41 | unsigned short Mbar_Pos = 10;
|
42 | unsigned short AN_Zeit[] = {0, 0};
|
43 | unsigned short Aus_Zeit[] = {0, 0,};
|
44 | unsigned short Mbar [] = {0, 0};
|
45 | unsigned short Modus_AUSWAHL = 0 ;
|
46 | unsigned short Repeat_Cycle=0, Num_Cycles=0;
|
47 | unsigned short i, j, k, Timer_An, Get_Input, Cur_Pos, Cur_On;
|
48 | unsigned short temp, refresh, Num, HalfSec, Blink, ChangeMin=0, ChangeSec=0;
|
49 | unsigned short aus_ss, an_SS;
|
50 | unsigned short max_druck, druck_raw, Zone = 3;
|
51 |
|
52 | int temp1;
|
53 | char Temper[7];
|
54 |
|
55 |
|
56 | void Disp_Erste_zeile(){
|
57 | if(!Timer_An){
|
58 | switch (Modus_Auswahl){
|
59 | case 0: Lcd_Cmd(_LCD_CLEAR);
|
60 | Lcd_Out(1,1, ">Pausendauer");
|
61 | break;
|
62 | case 1: Lcd_Cmd(_LCD_CLEAR);
|
63 | Lcd_Out(1,1, ">Vacuumdauer");
|
64 | break;
|
65 | case 2: Lcd_Cmd(_LCD_CLEAR);
|
66 | Lcd_Out(1,1, ">Druck");
|
67 | break;
|
68 | case 3: Lcd_Cmd(_LCD_CLEAR);
|
69 | Lcd_Out(1,1, ">Wiederholung");
|
70 | break;
|
71 |
|
72 | }
|
73 | }
|
74 | else{
|
75 | if (Wechsel_Ventil == 1) {
|
76 | Lcd_Cmd(_LCD_CLEAR);
|
77 | Lcd_Out(1,1, "Vacuum");
|
78 | Lcd_Out(1,14, "~");
|
79 | Lcd_Chr(1,15, Mbar[0,0]);
|
80 |
|
81 | }
|
82 | if (Wechsel_Ventil == 0) {
|
83 | Lcd_Cmd(_LCD_CLEAR);
|
84 | Lcd_Out(1,1, "Pause");
|
85 | Lcd_Out(1,14, "~");
|
86 | Lcd_Chr(1,15, Num_Cycles/10+48);
|
87 | Lcd_Chr(1,16, Num_Cycles%10+48);
|
88 | }
|
89 | }
|
90 | }
|
91 |
|
92 | void Disp_Char(unsigned short col, unsigned short chr){
|
93 | Lcd_Chr(2, col, chr+48);
|
94 | }
|
95 |
|
96 | void Disp_Modus(){
|
97 |
|
98 | for(i=0; i<2; i++){
|
99 | if(Modus_Auswahl == 0){
|
100 | Lcd_Out(2,1, NA2);
|
101 | Disp_Char(SS_Pos+i,Aus_Zeit[i]);
|
102 | }
|
103 | if(Modus_Auswahl == 1){
|
104 | Lcd_Out(2,1, NA3);
|
105 | Disp_Char(SS_Pos+i,AN_Zeit[i]);
|
106 | }
|
107 | if(Modus_Auswahl == 2){
|
108 | Lcd_Out(2,1, NA4);
|
109 | Disp_Char(Mbar_Pos+i,AN_Zeit[i]);
|
110 | }
|
111 |
|
112 | if(Modus_Auswahl == 3){
|
113 | Lcd_Out(2,1, NA5);
|
114 | Disp_Char(8,Repeat_Cycle);
|
115 | Lcd_Out(2,9, " ");
|
116 |
|
117 | break;
|
118 | }
|
119 | }
|
120 | }
|
121 |
|
122 | void Delay_X(){
|
123 | Delay_ms(300);
|
124 | }
|
125 |
|
126 | void cursor_links(){
|
127 | for(j=0; j<5; j++){
|
128 | Lcd_Cmd(_LCD_MOVE_CURSOR_LEFT);
|
129 | }
|
130 | }
|
131 |
|
132 | void Speicher_Daten(){
|
133 | EEPROM_Write(0,Aus_Zeit[0]);
|
134 | EEPROM_Write(1,Aus_Zeit[1]);
|
135 | EEPROM_Write(2,An_Zeit[0]);
|
136 | EEPROM_Write(3,An_Zeit[1]);
|
137 | EEPROM_Write(4,Mbar[0]);
|
138 | EEPROM_Write(5,Mbar[1]);
|
139 | EEPROM_Write(6,Repeat_Cycle);
|
140 | EEPROM_Write(9,1); // Addresse 8 speicher EEPROM Write flag
|
141 |
|
142 | }
|
143 |
|
144 | void Lese_Daten(){
|
145 | Aus_Zeit[0]=EEPROM_Read(0);
|
146 | Aus_Zeit[1]=EEPROM_Read(1);
|
147 | AN_Zeit[0]=EEPROM_Read(2);
|
148 | AN_Zeit[1]=EEPROM_Read(3);
|
149 | Mbar[0]=EEPROM_Read(4);
|
150 | Mbar[1]=EEPROM_Read(5);
|
151 | Repeat_Cycle=EEPROM_Read(6);
|
152 | }
|
153 |
|
154 | void deaktiviere_timer(){
|
155 | INTCON = 0x00;
|
156 | Wechsel_ventil = 0;
|
157 | Num_Cycles = 0;
|
158 | INTCON.T0IF = 0;
|
159 | Timer_An = 0;
|
160 | Blink = 0xff;
|
161 | Modus_auswahl = 0;
|
162 | Disp_erste_zeile();
|
163 | Lese_Daten();
|
164 | Disp_Modus();
|
165 | }
|
166 |
|
167 | void interrupt(){
|
168 | Num ++;
|
169 | if(Num == 18)
|
170 | {
|
171 | HalfSec ++;
|
172 | Num = 0;
|
173 | Blink = ~Blink;
|
174 | if (HalfSec == 2)
|
175 | {
|
176 | HalfSec = 0;
|
177 | ChangeSec = 1;
|
178 | }
|
179 | }
|
180 | TMR0 = 39;
|
181 | INTCON.T0IF = 0;
|
182 | }
|
183 |
|
184 | void Lese_druck (){
|
185 |
|
186 | temp1 = sensor;
|
187 | druck_raw = temp1 * 222;
|
188 |
|
189 |
|
190 | }
|
191 |
|
192 | void Pumpensteuerung (){
|
193 | if(Wechsel_Ventil==0 && Entluef_Ventil == 1 && druck_raw < Mbar[0,0]){
|
194 | Pumpen_relais = 1;
|
195 | }
|
196 | else
|
197 | Pumpen_relais = 0;
|
198 | }
|
199 |
|
200 |
|
201 |
|
202 | void main () {
|
203 | CMCON = 7;
|
204 | TRISA = 0b00111100;
|
205 | TRISB = 0b00000001;
|
206 | PORTB=0;
|
207 | PORTA=0;
|
208 | Pumpen_Relais = 0;
|
209 | Wechsel_Ventil = 0;
|
210 | Entluef_Ventil = 0;
|
211 | Timer_An = 0;
|
212 | Get_Input = 0;
|
213 | Cur_Pos = 0;
|
214 | Cur_On = 0;
|
215 | refresh = 0;
|
216 | Num = 0;
|
217 | HalfSec = 0;
|
218 |
|
219 | Lcd_Init();
|
220 | Lcd_Cmd(_LCD_CLEAR);
|
221 | Lcd_Cmd(_LCD_CURSOR_OFF);
|
222 | Lcd_Out(1,1, "Meditek");
|
223 | Lcd_Out(2,1, "Prototyp V1.0");
|
224 | delay_ms(1000);
|
225 | i=0;
|
226 |
|
227 | while(i<1){
|
228 | Delay_X();
|
229 | i ++;
|
230 | }
|
231 | Lcd_Cmd(_LCD_CLEAR);
|
232 | Disp_erste_Zeile();
|
233 | if(EEPROM_Read(9) == 1){
|
234 | Lese_Daten();
|
235 | }
|
236 |
|
237 | Disp_modus();
|
238 |
|
239 | do {
|
240 |
|
241 | if(!MENU_sw && !Timer_An){
|
242 | Delay_X();
|
243 | if(!Get_Input){
|
244 | Modus_auswahl = Modus_auswahl+1;
|
245 | if(Modus_auswahl > 2) Modus_auswahl=0;
|
246 | Disp_Erste_zeile();
|
247 | Disp_modus();
|
248 | }
|
249 | if(Get_Input){
|
250 | if(Modus_Auswahl==0){ // Set OFF time
|
251 | Aus_Zeit[Cur_Pos] ++;
|
252 | temp = Aus_Zeit[Cur_Pos];
|
253 | switch (Cur_Pos){
|
254 | case 0: if(temp > 5) Aus_Zeit[Cur_Pos]=0;
|
255 | break;
|
256 | case 1: if(temp > 9) Aus_Zeit[Cur_Pos]=0;
|
257 | break;
|
258 | case 2: if(temp > 5) Aus_Zeit[Cur_Pos]=0;
|
259 | break;
|
260 | case 3: if(temp > 9) Aus_Zeit[Cur_Pos]=0;
|
261 | break;
|
262 | }
|
263 | Disp_Char(ss_Pos+Cur_Pos, Aus_Zeit[Cur_Pos]);
|
264 |
|
265 | }
|
266 | if(Modus_Auswahl==1){ // Set ON time
|
267 | An_Zeit[Cur_Pos] ++;
|
268 | temp = An_Zeit[Cur_Pos];
|
269 | switch(Cur_Pos){
|
270 |
|
271 | case 0: if(temp > 5) An_Zeit[Cur_Pos]=0;
|
272 | break;
|
273 | case 1: if(temp > 9) An_Zeit[Cur_Pos]=0;
|
274 | break;
|
275 | }
|
276 | Disp_Char(ss_Pos+Cur_Pos, An_Zeit[Cur_Pos]);
|
277 | }
|
278 | if(Modus_Auswahl==2){ // Set mbar
|
279 | mbar[Cur_Pos] ++;
|
280 | temp = mbar[Cur_Pos];
|
281 | switch(Cur_Pos){
|
282 |
|
283 | case 0: if(temp > 9) Mbar [Cur_Pos]=0;
|
284 | break;
|
285 | case 1: if(temp > 9) Mbar [Cur_Pos]=0;
|
286 | break;
|
287 | }
|
288 | Disp_Char(mbar_Pos+Cur_Pos, mbar[Cur_Pos]);
|
289 | }
|
290 | if(Modus_Auswahl==3){ // Set cyclic option
|
291 | Repeat_Cycle ++;
|
292 | if(Repeat_Cycle > 1) Repeat_Cycle=0;
|
293 | Disp_Char(8, Repeat_Cycle);
|
294 | }
|
295 | Lcd_Cmd(_LCD_MOVE_CURSOR_LEFT);
|
296 | }
|
297 | } // END if(!Menu_sw)
|
298 |
|
299 | if(!SELECT_sw && !Timer_an){
|
300 | Delay_X();
|
301 | Get_Input = 1;
|
302 | if(Modus_Auswahl < 4) {
|
303 | if(Cur_On) {
|
304 | Cur_Pos ++;
|
305 | if (Cur_Pos == 2) {
|
306 | Lcd_Cmd(_LCD_MOVE_CURSOR_RIGHT);
|
307 | Cur_Pos ++;
|
308 | }
|
309 | if(Cur_Pos > 2) {
|
310 | Lcd_Cmd(_LCD_MOVE_CURSOR_RIGHT);
|
311 | Cur_Pos = 0;
|
312 | cursor_links();
|
313 | }
|
314 | else Lcd_Cmd(_LCD_MOVE_CURSOR_RIGHT);
|
315 | }
|
316 | if(!Cur_On) {
|
317 | Cur_On = 1;
|
318 | cursor_links();
|
319 | Lcd_Cmd(_LCD_UNDERLINE_ON);
|
320 | }
|
321 | }
|
322 | else {
|
323 | if(!Cur_On) {
|
324 | Cur_On = 1;
|
325 | for(j=0; j<7; j++){
|
326 | Lcd_Cmd(_LCD_MOVE_CURSOR_LEFT);
|
327 | }
|
328 | Lcd_Cmd(_LCD_UNDERLINE_ON);
|
329 | }
|
330 | }
|
331 |
|
332 | } // if(!SELECT_sw && !Timer_On) ends here
|
333 |
|
334 | if(!ENTER_sw && Get_Input){
|
335 | Delay_X();
|
336 | Get_Input = 0;
|
337 | Cur_On = 0;
|
338 | Cur_Pos = 0;
|
339 | Disp_modus();
|
340 | Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off
|
341 | }
|
342 |
|
343 | if (!START_sw && !Get_Input){
|
344 | Delay_X();
|
345 |
|
346 | switch(Timer_an){
|
347 | case 0:
|
348 | Timer_an = 1;
|
349 | Disp_erste_zeile();
|
350 | OPTION_REG = 0x07;
|
351 | TMR0 = 354;
|
352 | INTCON = 0xA0;
|
353 | INTCON.T0IF = 0;
|
354 | Modus_auswahl = 0;
|
355 | Blink = 0;
|
356 | Disp_modus();
|
357 | Speicher_Daten();
|
358 | break;
|
359 | case 1: deaktiviere_timer();
|
360 | break;
|
361 | }
|
362 | }
|
363 |
|
364 | if(Timer_an){
|
365 | aus_ss = aus_zeit[0]*10 + aus_zeit[1];
|
366 | an_ss = an_zeit[0]*10 + an_zeit[1];
|
367 |
|
368 | switch(Blink){
|
369 | case 0: Lcd_Chr(2,ss_Pos+2,' ');
|
370 | break;
|
371 | case 255: Lcd_Chr(2,ss_Pos+2,':');
|
372 | break;
|
373 | }
|
374 |
|
375 | if(!aus_SS && !wechsel_ventil){
|
376 | if(an_SS){
|
377 | Wechsel_Ventil = 1;
|
378 | Modus_auswahl = 1;
|
379 | Disp_erste_zeile();
|
380 | Disp_modus();
|
381 |
|
382 | }
|
383 |
|
384 | else {
|
385 | deaktiviere_timer();
|
386 | }
|
387 | }
|
388 |
|
389 | if(!an_SS && wechsel_ventil){
|
390 | if(Repeat_Cycle ==1){
|
391 | Wechsel_ventil = 0;
|
392 | Num_Cycles++;
|
393 | Pumpensteuerung();
|
394 | if(Num_Cycles > 99){
|
395 | deaktiviere_timer();
|
396 | }
|
397 | else {
|
398 | lese_Daten();
|
399 | Modus_auswahl = 0;
|
400 | Disp_erste_Zeile();
|
401 | Disp_modus();
|
402 |
|
403 | }
|
404 | }
|
405 | else {
|
406 | deaktiviere_timer();
|
407 | }
|
408 | }
|
409 |
|
410 | if(ChangeSEC) {
|
411 | switch(Modus_auswahl){
|
412 | case 0: if(aus_SS == 0){
|
413 | aus_SS = 59;
|
414 |
|
415 | }
|
416 | else if (aus_SS >>0)
|
417 | aus_SS --;
|
418 | aus_zeit[0] = Aus_ss/10;
|
419 | aus_zeit[1] = Aus_ss%10;
|
420 |
|
421 | break;
|
422 |
|
423 | case 1: if(an_SS == 0){
|
424 | an_SS = 59;
|
425 | }
|
426 | else if(an_SS >> 0)
|
427 | an_SS --;
|
428 | an_zeit[0] = an_ss/10;
|
429 | an_zeit[1] = an_ss%10;
|
430 | break;
|
431 | }
|
432 | Disp_modus();
|
433 | }
|
434 |
|
435 | }
|
436 |
|
437 |
|
438 | }while(1);
|
439 | }
|