Pumpensteuerung - Finde den Fehler PIC 16f628a

Gast #4841660
Lesenswert?

Hallo,

bin neu hier und hoffe ihr nehmt es mir nicht übel das ich als erstes ne 
Frage poste aber ich komm einfach nicht weiter und weis mittlerweile 
auch nicht mehr wo ich ansetzen soll. Bin noch relativ neu im 
Programmieren und hoffe ihr könnt mir da was beibringen.

Zur Funktion

Einstellbare ein und Ausschaltzeit einstellbarer druck und Loop ja/nein

es soll während der Pausendauer ein einstellbarer Unterdruck im 
Vakuumspeicher, der von einem Druck Sensor (Vergleicher) gemessen wird 
erzeugt werden. Ist die pause zu ende soll das Vakuum  über ein Wechsel 
Ventil in die Anlage freigegeben werden. Nach Ablauf dieser zeit soll 
der druck im System über ein Entlüftungsventil abgelassen werden. Das 
ganze wird auf dem Display angezeigt. Leider Funktioniert es nicht die 
erste Schaltung ohne den Sensor ging Problemlos allerdings musste ich um 
den Sensor anzubringen den EN vom Display an RA5 legen um einen 
Analogpin beschalten zu können.

Mir wird am Display nun nichts angezeigt und ich weiß nicht woran das 
liegt.
Meine frage ist kann das so überhaupt funktionieren oder bin ich 
komplett auf dem Holzweg.

Compiler ist MicroC

Danke schon mal

LG Stefan


Der Code:
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
 }
Angehängte Dateien:
Gast #4841667
Lesenswert?

Steve Modena schrieb:
> Compiler ist MicroC

Hast Du schon einen anderen Compiler ausprobiert, z.B. den von VisualC? 
Mit welchem Compiler hat der hier:

/* Vacuum Station
   By Stefan Haemmerle

das Programm übersetzt?

Vielleicht solltest Du auch mal schreiben, was genau Deine 
Fehlermeldungen sind (z.B. parse-Error beim Compilieren).
Gast #4841693
Lesenswert?

Wozu gibts einen Debugger, wenn ihn doch keiner benutzt?

Die großen Elkos hinter deinen Spannungsreglern würde ich
mal raus schmeißen. Das entspricht nämlich nicht der Spezifikation
des Spannungregler-Datenblatts.
Die Spannungsversorgung sollte auch etwas präziser angeben werden,
also ob AC oder DC. Dicke Elkos kommen gewöhnlich VOR dem Regler
wenn die Versorgung über Trafo und Gleichrichter erfolgt.
Gast #4841703
Lesenswert?

Danke für die Antwort Spannungsversorgung is DC und kommt vom einem 9v
Steckernetzteil. Die Elektrik funktioniert auch soweit konnte das mit 
einem anderen funktionierendem Programm testen nur eben ohne 
einstellbaren druck und ohne sensor.
Gast #4841914
Lesenswert?

Steve Modena schrieb:
> hab denke ich den Fehler RA5 ist nur ein trigger input bin mir nicht
> sicher ob ich da den en vom display dran hängen kann

Für den EN brauchst du einen Ausgang, oder ist das unlogisch?

Den 100µF am Ausgang des Reglers hat da nichts verloren.
Man belastet Linearregler nicht so hoch kapazitiv, denn das
macht die Regelung träge.
Wenn, dann gehört der an den Reglereingang, aber wenn DCin
schon genug gesiebt ist und kaum riple hat, kann man sich
den Elko auch ganz sparen. Spielt keine Rolle wenn es im
Moment geht. Am Ausgang ist das Pfusch, mit der Option
bald aus zufallen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren