Forum: Mikrocontroller und Digitale Elektronik PIC18F4680: 5V-Spannung auf digitalen I/O schalten


von Marcus Z. (zacha)


Angehängte Dateien:

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!

von Stampede (Gast)


Lesenswert?

Hi,

1. Auf jeden Fall Varaiante b wählen.
2. Der PIC reagiert nicht ? Der Code hat ja auch keine Ausgabe in 
irgendeiner For.
3. ADC deaktiviert und die PortA so auf digital umgestellt?

Stampede

von Marcus Z. (zacha)


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.

von uncle sam (Gast)


Lesenswert?

> ADCON1 = 7;

Probier mal Datenblatt Seite 247/248:

ADCON0=0;
ADCON1=15;

von Marcus Z. (zacha)


Lesenswert?

Vielen Dank, uncle sam!

Das scheint zu funktionieren! Ich werde noch etwas testen und hoffen, 
dass es dabei bleibt ;-)

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.