mikrocontroller.net

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


Autor: Marcus Zacher (zacha)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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):
//+++++++++++++++++++++++++++++++++++ Definitionswerte ++++++++++++++++++++++++++++++++++
#define SWITCH_SL    PORTAbits.RA0              //PORT für Schlusslicht(SL)-Schalter, Switch-Nummer = 0, PORTA0
#define SWITCH_BL    PORTAbits.RA1              //PORT für Bremslicht(BL)-Schalter, Switch-Nummer = 1, PORTA1
#define SWITCH_GBL    PORTAbits.RA2              //PORT für Gefahrenbremslicht(GBL)-Schalter, Switch-Nummer = 2, PORTA2
#define SWITCH_BK    PORTAbits.RA3              //PORT für Bremslichtkammer(BK)-Schalter, Switch-Nummer = 3, PORTA3
#define SWITCH_ANZAHL  4                    //die Anzahl der Eingangsswitches

//+++++++++++++++++++++++++++++++++++ Deklarationen ++++++++++++++++++++++++++++++++++

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


//++++++++++++++++++++++++++++++++++ Abfrage der Schalter ++++++++++++++++++++++++++++
void DEBOUNCER (void)
{  
  for (SWITCH_NR = 0; SWITCH_NR < SWITCH_ANZAHL; SWITCH_NR++)        //Funktion zählt alle Switchnummern durch, um diese neu zu belegen
  {
    switch  (SWITCH_NR)                          //SWITCH-Array wird mit den Werten vom Eingang belegt.
    {
      case 0:
        if ( SWITCH_SL )    //so einlesen funktioniert nicht
        {
          SWITCH[SWITCH_NR] = 1;
        }
        else
        {
          SWITCH[SWITCH_NR] = 0;
        }
        
        break;
      case 1:
        SWITCH[SWITCH_NR] = SWITCH_BL;  //und so auch nicht :(
        break;
      case 2:
        SWITCH[SWITCH_NR] = SWITCH_GBL;  
        break;    
      case 3:
        SWITCH[SWITCH_NR] = 1;    //wird die 1 in den Code geschrieben, funktioniert alles.
        break;  
    }    
  }
}


//++++++++++++++++++++++++++++++++++ MAIN-PROGRAMM ++++++++++++++++++++++++++++
void main(void)
{
  ADCON1 = 7;                          //PORTA-Pins defined as digital I/Os
  TRISA = 0b11111111;                      //Definiere PORTA als Input (1).
  TRISB = 0b11111111;
  TRISC = 0;
  
  TRISD = 0;                      //Definiere PORTD als Output (0).
                             
  while(1)
  {
    DEBOUNCER();
  }  
}    

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!

Autor: Stampede (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Marcus Zacher (zacha)
Datum:

Bewertung
0 lesenswert
nicht 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
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.

Autor: uncle sam (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ADCON1 = 7;

Probier mal Datenblatt Seite 247/248:

ADCON0=0;
ADCON1=15;

Autor: Marcus Zacher (zacha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, uncle sam!

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.