PIC18F4680: 5V-Spannung auf digitalen I/O schalten

OP #1787428
Lesenswert?

Hallo,

ich habe folgendes Problem: An die Eingänge RA0 bis RA3 möchte ich über 
Kippschalter eine Spannung von 5V anlegen, um damit eine logische 1 im 
Programm hervorzurufen. Liegt keine Spannung an, entsprechend eine 
logische 0.

Ich habe dabei sowohl Variante A als auch B durchprobiert (siehe Bild). 
In beiden Fällen liegt am geschlossenen Schalter 5V an, bei geöffnetem 
0V.
Leider reagiert der PIC überhaupt nicht. Habt ihr eine Idee?

Evtl. liegt aber auch ein Software- oder Konfigurationsfehler vor.
Hier mein Code (Auszug):
1
//+++++++++++++++++++++++++++++++++++ Definitionswerte ++++++++++++++++++++++++++++++++++
2
#define SWITCH_SL    PORTAbits.RA0              //PORT für Schlusslicht(SL)-Schalter, Switch-Nummer = 0, PORTA0
3
#define SWITCH_BL    PORTAbits.RA1              //PORT für Bremslicht(BL)-Schalter, Switch-Nummer = 1, PORTA1
4
#define SWITCH_GBL    PORTAbits.RA2              //PORT für Gefahrenbremslicht(GBL)-Schalter, Switch-Nummer = 2, PORTA2
5
#define SWITCH_BK    PORTAbits.RA3              //PORT für Bremslichtkammer(BK)-Schalter, Switch-Nummer = 3, PORTA3
6
#define SWITCH_ANZAHL  4                    //die Anzahl der Eingangsswitches
7

8
//+++++++++++++++++++++++++++++++++++ Deklarationen ++++++++++++++++++++++++++++++++++
9

10
unsigned char SWITCH[SWITCH_ANZAHL] = {0,0,0,0};        //Abfrage der Switch-Eingänge
11
unsigned char SWITCH_NR = 0;                  //Zählvariable für die DEBOUNCER-Funktion
12

13

14
//++++++++++++++++++++++++++++++++++ Abfrage der Schalter ++++++++++++++++++++++++++++
15
void DEBOUNCER (void)
16
{  
17
  for (SWITCH_NR = 0; SWITCH_NR < SWITCH_ANZAHL; SWITCH_NR++)        //Funktion zählt alle Switchnummern durch, um diese neu zu belegen
18
  {
19
    switch  (SWITCH_NR)                          //SWITCH-Array wird mit den Werten vom Eingang belegt.
20
    {
21
      case 0:
22
        if ( SWITCH_SL )    //so einlesen funktioniert nicht
23
        {
24
          SWITCH[SWITCH_NR] = 1;
25
        }
26
        else
27
        {
28
          SWITCH[SWITCH_NR] = 0;
29
        }
30
        
31
        break;
32
      case 1:
33
        SWITCH[SWITCH_NR] = SWITCH_BL;  //und so auch nicht :(
34
        break;
35
      case 2:
36
        SWITCH[SWITCH_NR] = SWITCH_GBL;  
37
        break;    
38
      case 3:
39
        SWITCH[SWITCH_NR] = 1;    //wird die 1 in den Code geschrieben, funktioniert alles.
40
        break;  
41
    }    
42
  }
43
}
44

45

46
//++++++++++++++++++++++++++++++++++ MAIN-PROGRAMM ++++++++++++++++++++++++++++
47
void main(void)
48
{
49
  ADCON1 = 7;                          //PORTA-Pins defined as digital I/Os
50
  TRISA = 0b11111111;                      //Definiere PORTA als Input (1).
51
  TRISB = 0b11111111;
52
  TRISC = 0;
53
  
54
  TRISD = 0;                      //Definiere PORTD als Output (0).
55
                             
56
  while(1)
57
  {
58
    DEBOUNCER();
59
  }  
60
}

Ich benutze im Übrigen MPLAP IDE v8.53 mit dem Compiler MPLAP C18.
Datenblätter und Ähnliches kann ich auf Wunsch nachreichen.


Vielen Dank schon mal vorab!
Angehängte Dateien:
OP #1787488
Lesenswert?

Hallo Stampede,

danke für die schnelle Antwort.

zu 1. Alles klar!

zu 2. Ausgabe usw. habe ich vom Code entfernt, da ich das mit der 
einprogrammierten 1 getestet habe und alles soweit funktioniert. Es 
scheitert nur an der Schnittstelle von 5V draußen und die Berechnung als 
logische 1 im Programm.

zu 3. Mit
1
ADCON1 = 7;
 definiert man die PORTA-Pins als digitale I/Os, was ich vorgenommen 
habe. Direkt deaktivieren kann man den ADC meines Erachtens nach nicht, 
bzw. nur, wenn man ihn vorher konfiguriert hat, was ich nicht getan 
habe.

Der Knackpunkt erscheint mir deshalb in der Funktion DEBOUNCER oder in 
der Konfiguration.

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