Forum: Mikrocontroller und Digitale Elektronik Pumpensteuerung - Finde den Fehler PIC 16f628a


von Steve Modena (Gast)


Angehängte Dateien:

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
 }

von C-hater (Gast)


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).

von Cyborg (Gast)


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.

von Steve Modena (Gast)


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.

von Steve Modena (Gast)


Lesenswert?

MikroC ist der Compiler und ich bekomm keinen Fehler beim Compilieren 
kann das Programm aufspielen nur zeigt mir das display nichts an.

von Steve Modena (Gast)


Lesenswert?

und stefan hämmerle bin ich

von Test (Gast)


Lesenswert?

Beim 16F628A ist der Pin RA5 nur als Input zu benutzen.
Siehe Bild im Datenblatt Port RA5

von Georg G. (df2au)


Lesenswert?

Steht der Port für Enable wirklich auf Ausgang? Ich kenne den PIC nicht, 
aber beiden anderen Steuersignalen setzt du tris auf 0, bei Enable auf 
1.

Steve Modena schrieb:
> TRISA = 0b00111100;
>   TRISB = 0b00000001;

von Christian M. (Gast)


Lesenswert?

Vielleicht weil default E = port.3 und RS = port.2 ist? Wie wär's mit 
einem Lcd_Config vor dem Lcd_Init...?

Gruss Chregu

von Kurt B. (kurt-b)


Lesenswert?

Steve Modena schrieb:
> Hallo,
>
> bin neu hier und hoffe

Deine Spannungsversorgung scheint etwas seltsam.
GND1 und GND2 und die beiden 10 pF und die Versorgungsbuchse J1 Pin2.

Sind alle GND miteinander verbunden?

 Kurt

von Steve Modena (Gast)


Lesenswert?

Wenn mir jemand das Programm macht würde ich ihn auch dafür bezahlen :) 
könnt euch per mail melden stefanhaemmerle@freenet.de

von Steve Modena (Gast)


Lesenswert?

Die Spannungsversorgung hab ich noch abgeändert hab eben gesehen das ich 
das alte sheet hochgeladen hab. Es ist nur noch ein Stromkreis ich lade 
gleich das angepasste Schaltbild hoch

von Steve Modena (Gast)


Angehängte Dateien:

Lesenswert?

Hier die aktuellen sheets

von Steve Modena (Gast)


Lesenswert?

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

von Test (Gast)


Lesenswert?

Enable vom Display kannst Du nicht an RA5 hängen, da
dieser Pin nicht als Ausgang zu schalten ist.
Nimm RA2 oder RA3 als Anschuss für EN vom Display und
leg einen Taster auf RA5.

von Cyborg (Gast)


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.

von Steve Modena (Gast)


Lesenswert?

Alles klar danke schonmal für die tipps

von Steve Modena (Gast)


Lesenswert?

Das ist der RA5/MCLR/VPP Port geht das das ich da einen Taster dran mach 
der den Pic nicht resettet

von Steve Modena (Gast)


Lesenswert?

Habs gefunden hat sich erledigt Danke

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.