2012-04-04 10 views
2

Ich konnte Ausgänge an meinem PIC arbeiten lassen und kann eine Reihe von LEDs ein- und ausschalten, während ich verschiedene Ausgangs-Latchs hoch/niedrig setze. Allerdings habe ich viel Schwierigkeiten beim Lesen im Zustand eines Stiftes.Lesestatus der Eingangspins auf einem PIC18

Siehe den nachstehenden Code. Ich habe meine Konfiguration eingerichtet und definiere die TRISC als Eingabe und TRISB als Ausgabe. In einer Endlosschleife überprüfe ich, ob RC6 hoch oder niedrig ist, und setze den gesamten B-Speicher abhängig von dem Ergebnis hoch oder niedrig.

#include <htc.h> 

__CONFIG(1, FOSC_IRC & FCMEN_OFF & IESO_OFF); 
__CONFIG(2, PWRTEN_OFF & BOREN_OFF & WDTEN_OFF); 
__CONFIG(3, MCLRE_OFF); 
__CONFIG(4, STVREN_ON & LVP_OFF & DEBUG_OFF); 
__CONFIG(5, 0xFFFF); 
__CONFIG(6, 0xFFFF); 
__CONFIG(7, 0xFFFF); 

void main(void) 
{ 
    TRISC = 0xFF; // input 
    TRISB = 0x00; // output 

    while (1) 
    { 
    if (PORTCbits.RC6 == 0) 
     LATB = 0b00000000; 
    else 
     LATB = 0b11111111; 
    } 

    return; 
} 

Der Code wird in Ordnung ohne Warnungen oder Fehler kompiliert. Wenn meine Codelogik einfach die Zwischenspeicher hoch und niedrig setzt, dann funktioniert das gut, aber ich konnte den Zustand eines Pins nicht erfolgreich lesen.

Irgendwelche Ideen?

Ich verwende einen PIC18F14K50 und MPLAB v8.43 und den HiTech ANSI C Compiler.

Meine Verbindungen sind + 5V zum VDD (Pin 1), VSS (Pin 20) zur Masse. Ich habe + 5V bis C6 (Pin 8) und einen 100K Widerstand und LED von B7 (Pin 10) an Masse. Um RC6 umzuschalten, verbinde ich den Draht mit C6.

 ┌────────┐ 
+5v -│ 01 20 │- gnd 
    -│ 02 19 │- 
    -│ 03 18 │- 
    -│ 04 17 │- 
    -│ 05 16 │- 
    -│ 06 15 │- 
    -│ 07 14 │- 
+5v -│ 08 13 │- 
    -│ 09 12 │- 
led -│ 10 11 │- 
    └────────┘ 

Antwort

5

Die ADC-Pins der PICs sind beim Einschalten leider als analoge Eingänge konfiguriert. Sie müssen die ADC-Funktionalität an diesem Pin deaktivieren, um sie als digitalen Eingang zu verwenden.

Das Löschen von Bit 0 von ANSELH setzt RC6 auf Digitaleingang. Dann wird dein Code funktionieren.

Port-Analogsteuerung

PIC18F/LF1XK50 Datasheet

+0

Danke, in meinem echten Code benutze ich alle Pins, nicht nur RC6. Um alle Pins als digital und nicht analog zu setzen, würde ich 'ANSEL = 0; ANSELH = 0; 'am Anfang meiner' main() 'Methode? – Ozzah

+0

Oder muss ich etwas mit ADCON1 machen? – Ozzah

+2

Ja, wenn ANSEL und ANSELH gleich 0 gesetzt werden, werden alle analogen Funktionen gelöscht. –

1

Einstellung ...

TRISC = 1; // input 

... darf nur Stift RC0 des PORTC als Eingangsstift gesetzt, alle anderen Pins als Ausgabe definiert sind. So PORTCbits.RC6 == 0 sollte den richtigen Eingangszustand von RC6 Pin nicht zurückgeben.

TRISC = 255 sollten alle Pins von PORTC als Eingabe gesetzt werden.

+0

Vielen Dank für die Entdeckung - ich hätte es gesehen. Ich habe meinen Code aktualisiert, aber die Ergebnisse sind gleich. Nichts passiert, wenn ich + 5V an RC6 anlege. Ich habe meine Frage aktualisiert und sie offen gelassen. – Ozzah

0

Es ist erwähnenswert, dass einige andere PIC18 Varianten eingerichtet sind unterschiedlich:

Dies wird im Datenblatt in Abschnitt 9.4 dokumentiert

Auf PIC18F4520 und PIC18F4680 Sie müssen Pins als digitale es durch eine ADCON1 registrieren anstelle von ANSELH konfigurieren.

Durch Setzen eines Bits auf 1 wird ein Pin digital erstellt.

Außerdem müssen Sie die Pins einstecken, indem Sie im entsprechenden TRIS-Register ein Bit auf 1 setzen.