Forum: Mikrocontroller und Digitale Elektronik PICf2550 & Relais am IN/OUT Fehler mit PullDown


von Stefan (Gast)


Lesenswert?

Hallo Gemeinde,

ich weiß langsam nicht mehr weiter.

Ich habe an einem Eingang des PICF2550er ein PullDown,

(+)---10kOhm----(PIC)
Der Pin wird dann gegen Masse gezogen von einem Relais
(12V)----(Relais)----(GND)

(GND)----(Relais_Schließer)---(PIC)

funktioniert soweit auch. (INCL. FREILAUFDIODEN AN ALLEN RELAIS!)

NUR (!) jetzt habe ich 2 Ausgänge, die 12V benötigen, d.h. mit über 
Transistor werden 5V Relais gesteuert. Funktioniert auch.

Wenn ich nun den Eingang (s. oben, REED-Kontakt für Festozylinder) 
nutzen will, funktioniert das 1X

Zum verständnis Pseudocode:
warte bis Reed schaltet
schalte Relais 1 an
warte Zeit x
schalte Relais 1 aus
warte Zeit y
von vorne

Dann bleibt der Pulldown GESETZT, d.h. ich kriege keinerlei Rückmeldung, 
das Programm arbeit einfach weiter obwohl der Reedkontakt nicht 
rückmeldet.

Kommentiere ich "schalte Relais 1 an/aus" aus, dann wartet er aber.
Nun ist die Frage ... WIESO ?

Mit einem Messgerät an dem PIN sehe ich, dass er nach dem PullDown auch 
auf GND bleibt, obwohl das Relais definitiv abfällt.

Ich hatte das Problem auch schon vorher mit Relais 2, konnte es dort mit 
einem monoflop aber beheben (warum auch immer ...), nur hier ist das 
Problem weiterhin vorhanden.

Irgend eine Idee woran das liegen kann ???

MFG Stefan

Quellcode:
1
ONOFF=1;
2
RUNENABL=0;
3
DelayH();
4
5
while(1){
6
  CHECK=2;
7
  if(i==u){
8
  }  // NO REPRINT
9
else{
10
  XLCDClear(); 
11
  //sprintf(buffer, "ZER0_Wait_Zyli.!");
12
  sprintf(buffer, "~~ZERO > OPENEND");
13
  while(XLCDIsBusy()); 
14
  XLCDPutRamString(buffer);
15
  sprintf(buffer, "%ld", i); // WRITE i INTO *BUFFER
16
  while(XLCDIsBusy()); 
17
  XLCDL2home();
18
  while(XLCDIsBusy()); 
19
  XLCDPutRamString(buffer);
20
  LEDWAIT=0;
21
  WaitBack(W2);
22
  ZylinderVor=1;  // Ausfahren
23
  }
24
25
  
26
27
28
u=i; // NO REPRINT!
29
30
  DelayL();
31
32
while(ZylinderVorne==1){
33
  DelayL(); // Warte bis der Zylinder vorne ist
34
  if(NOTAUS==1 || NOTSTOP==0){
35
    goto stop;
36
    }
37
  }
38
39
40
41
//if(ZylinderVorne==0){   //Zylinder ist vorne
42
LEDWAIT=0;
43
44
i++; //+1
45
/**
46
XLCDClear(); // CLEAR LCD
47
sprintf(buffer, "~Einwirken ....~");
48
while(XLCDIsBusy()); 
49
XLCDPutRamString(buffer);
50
sprintf(buffer, "%ld", i); // WRITE i INTO *BUFFERÜ
51
while(XLCDIsBusy()); 
52
XLCDL2home();
53
while(XLCDIsBusy()); 
54
XLCDPutRamString(buffer);
55
**/
56
if(ONOFF==1){
57
  RUNENABL=1;
58
  WaitFront(W1);
59
  RUNENABL=0;
60
  DelayH();
61
  ZylinderVorne=0;
62
  }  
63
else{
64
  
65
  WaitFront(W1);// Einwirkzeit
66
  }  
67
68
ZylinderVor=0;  // Zylinder zurück
69
70
71
72
u=i+1;  // Reprint!
73
74
}

: Verschoben durch Admin
von Stefan (Gast)


Lesenswert?

Ach vergessen, hier der Initialisierungsteil.

Hier ist bestimmt einiges unötig, das meiste ist nur durch TRY&ERROR 
versucht worden und hat so halt funkioniert.

Falls hier der Fehler begraben liegt oder falls hier unnötiges enthalten 
ist, bitte melden :D
1
char buffer[100];                
2
    // Hinweise für folgende Zeilen:        // 0=output  1=input
3
  LATA = 0b11111100;                 
4
  TRISA = 0b11111100;               // RA0+RA1 = OUTPUT, ALL OTHER = INPUT's
5
  ADCON1 = 0xFF;                   // A/D aus, 0xFF = 1111 1111
6
  // - USB DISABLING - PIC kann sonnst Schaden nehmen
7
  UCFG = 0x08;                
8
  UCON = 0x04;
9
  UEP0 = 0x16;
10
11
  // Setup Port C
12
  LATC = 0b00000111;
13
  TRISC = 0b00000110;
14
  //TRISC=0x00
15
16
17
  // PORTC PWM DISABLING
18
    PR2=149;          //1.:Register PR2 Wert zuweisen
19
    CCPR1L=0xFF;        //2.:
20
    CCPR2L=0xFF;
21
    CCP2CONbits.DC2B0=0;
22
    CCP2CONbits.DC2B1=0;
23
    CCP1CONbits.DC1B0=0;
24
    CCP1CONbits.DC1B1=0;
25
    TRISCbits.TRISC2=0;      //3.: CCP1 als Ausgang
26
    TRISCbits.TRISC2=0;      //    CCP2 als Ausgang
27
    T2CONbits.T2CKPS1=1;    //4.: TMR2 Prescale setzen (1:16)
28
    T2CONbits.T2CKPS0=0;    //    Wert egal
29
    T2CONbits.TMR2ON=1;      //    Timer2 ON
30
31
// <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<                       DEFINE OUT-INPUT VARIABLES
32
33
// PORT A
34
  #define  LEDWAIT      PORTAbits.RA0     // Out Zeigt an, dass auf Benutzeraktivität gewartet wird
35
  //#define LEDDELAY    PORTAbits.RA1     // Out Zeigt an, dass PIC in einer Warteschleife ist (=Arbeitet wenn blinkt), ist im DELAY
36
  #define AddL       PORTAbits.RA2     // In  Addiert kleinen Wert im Hauptmenü
37
  #define AddH      PORTAbits.RA3    // In  Addiert großen Wert im Hauptmenü
38
  #define RUN        PORTAbits.RA4    // In  RUN Running
39
  #define MENU      PORTAbits.RA5    // In  RI Running
40
41
// PORT B
42
  // BELEGT ==> LCD mit nibbler (statt 8 -> 4 Datenleitungen + R/W,...)
43
44
// PORT C
45
  #define ZylinderVorne    PORTCbits.RC0    // In  Eingangskontakt Zylinder_Ist_Vorne
46
  // RC1 ist nicht vorhanden @ 2550 (Part_of_USB)
47
  #define ZylinderVor    PORTCbits.RC2    // Out Ausgang ==> Zylinder kann vor
48
  #define NOTAUS       PORTCbits.RC5    // In  Gefahr für Mensch (öffner)
49
  #define NOTSTOP       PORTCbits.RC4    // In  Gefahr für Maschine (schließer)
50
  #define RUNENABL    PORTCbits.RC6    // Out Motor darf
51
  #define HEARENABL    PORTCbits.RC7    // Out Heizung darf

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.