Forum: Mikrocontroller und Digitale Elektronik PORTA als analoger Input (PIC16F887)


von Roland E. (roland_91)


Angehängte Dateien:

Lesenswert?

Hallo, ich brauche mal wieder eure Hilfe ^^

Ich habe ein Thermometer gebaut mit einer Ausgabe an fünf 
7-Segment-Anzeigen.
Die Hardware habe ich getestet und sie funktioniert einwandfrei.

Allerdings kann mein PIC16F887 die analogen Eingänge, die ich an PORTA 
angeschlossen und programmiert habe nicht lesen bzw. verarbeiten.
Da muss irgendwas in der Konfiguration fehlgeschlagen sein.
Ich habe die Spannungen mit einem Oszilloskop nachgemessen und kann 
sicherstellen, dass +5V an den Pins von PORTA anliegen.
Ich habe das Datenblatt und andere Internetseiten durchgelesen aber 
nichts der vorgeschlagenen Lösungen klappt.

Anbei mein C-Programm, dass ich mit MPLAB und dem Compiler CC5X 
geschrieben habe.
PORTE = 3 LEDs
PORTD = 7-Segment-Anzeigen ansteuern
PORTC = Zeichen der 7-Segment-Anzeige

Bei der switch-case Abfrage erhalte ich den default-Befehl.

Vielen Dank schonmal für eure Hilfe.

von Chris B. (dekatz)


Lesenswert?

OK, PortA ist auf Analog geschaltet.
Wenn du mit "a = PORTA" diesen einliest, dann steht in "a" 0x00 drinnen.
-->> Datenblatt,, PortA:
<...Pins configured as analog inputs will read ‘0’....>
Oder was erwartest du??

von Roland E. (roland_91)


Lesenswert?

Chris B. schrieb:
> OK, PortA ist auf Analog geschaltet.
> Wenn du mit "a = PORTA" diesen einliest, dann steht in "a" 0x00 drinnen.
> -->> Datenblatt,, PortA:
> <...Pins configured as analog inputs will read ‘0’....>
> Oder was erwartest du??

Oh mein Fehler, ich habe vergessen zu erwähnen, dass ich am PORTA vier 
Schalter eingebaut habe.
Und mit dem switch-case-Befehl würde ich dann gerne verschiedene 
Programme aufrufen.
An den Pins von PortA messe ich auch ca 5V Spannung. Der PIC reagiert 
darauf aber nicht.

von Roland E. (roland_91)


Lesenswert?

Ich habe jetzt auch einmal den "a = PORTA"-Befehl komplett weggelassen 
und einmal direkt "switch(PORTA)" ausprobiert.
Beidemale bleibt das Resultat gleich - nämlich dass der PIC den 
default-Zweig ausführt.

von Chris B. (dekatz)


Lesenswert?

Dann solltest du aber PORTA - oder zumindest die Pins mit den 
angeschlossenen Schaltern - auf DIGITAL und nicht auf ANALOG stellen.
Denn wie schon oben zitiert, werden bei einem "Port read" die als ANALOG 
definierten Eingänge als "0" gelesen - egal welche Spannung da anliegt.

Ein "switch(PORTA)" liest auch nur den Port ein, also ändert das nichts!

von Roland E. (roland_91)


Angehängte Dateien:

Lesenswert?

Ich habe jetzt die Ansel-Anweisung gelöscht, leider ohne Erfolg.

Ich verstehe das nicht, ich messe direkt mit 1:10-Tastkopf an den Pins 
des PORTA und erhalte überall 5V, wo ein High-Pegel anliegt, dennoch 
reagiert der PIC nicht wie gewollt :(

Ich habe den neuen C-code angehängt.

von Chris B. (dekatz)


Lesenswert?

Und wiederum KEIN Wunder ;-)
In ANSEL steht nach einem Reset 0xFF drinnen.
Um den Port auf DIGITAL zu schalten musst du in ANSEL 0x00 schreiben!
Datenblatt lesen - Kapitel 3 !!

Ausserdem dürfte "PORTA = a" etwas verdreht sein...

von Roland E. (roland_91)


Angehängte Dateien:

Lesenswert?

Chris B. schrieb:
> Und wiederum KEIN Wunder ;-)
> In ANSEL steht nach einem Reset 0xFF drinnen.
> Um den Port auf DIGITAL zu schalten musst du in ANSEL 0x00 schreiben!
> Datenblatt lesen - Kapitel 3 !!
>
> Ausserdem dürfte "PORTA = a" etwas verdreht sein...

Danke erstmal für deine Mühe ;D

Also ich habe jetzt in Ansel 0x00 geschrieben und den PORTA=a Befehl 
rausgelöscht. Das Datenblatt habe ich durchgelesen
Nachwievor liest der PIC leider nicht die Eingänge ein.

Das Datenblatt habe ich mehrmals durchgelesen, aber laut dem Satz dachte 
ich man kann die Eingänge auch analog nutzen: "The user should ensure 
the bits in the
TRISA register are maintained set when ->using them as
analog inputs<- ."

Ich hoffe ich habe deine Ratschläge jetzt nicht missverstanden. Ich habe 
das Gefühl ich steh teilweise auf dem Schlauch. Falls doch wäre es nett, 
wenn du direkt im C-Code die falschen Befehle/Direktiven korrigierst :D



PS: Die ANSELH und TRISB Befehle spielen erstmal noch keine Rolle. Aber 
später soll PORTB auch als Eingang dienen. Darum schreib ich sie 
schonmal hin um dann in Zukunft nicht das gleiche Problem nochmal zu 
haben^^

von Chris B. (dekatz)


Lesenswert?

Die Initialisierung ist korrekt.

Aber: du hast 4 Schalter an deinem PortA hängen. Was ist mit den 
restlichen 4 Pins? Sind die auf GND, auf +5V oder hängen die in der 
Luft.

Also: PortA einlesen, die Bits an den die 4 Schalter hängen Maskieren 
(UND-Verknüpfen). Denn wenn auch nur einer der nicht benutzten Pin eine 
"1" liefert, werden deine "case"-Bedingungen (0...7) nie erfüllt.

von Roland E. (roland_91)


Angehängte Dateien:

Lesenswert?

Chris B. schrieb:
> Die Initialisierung ist korrekt.
>
> Aber: du hast 4 Schalter an deinem PortA hängen. Was ist mit den
> restlichen 4 Pins? Sind die auf GND, auf +5V oder hängen die in der
> Luft.
>
> Also: PortA einlesen, die Bits an den die 4 Schalter hängen Maskieren
> (UND-Verknüpfen). Denn wenn auch nur einer der nicht benutzten Pin eine
> "1" liefert, werden deine "case"-Bedingungen (0...7) nie erfüllt.

An RA6/RA7 ist mein Quartz und an RA4 ein Pull-Up. Ich nehme Ra0 - Ra3 
her.
Aber trotz maskieren und löschen der vier höherwertigen Bits erhalte ich 
wieder den "default"-Befehl.
Es ist wie verhext ;(

von hagi (Gast)


Lesenswert?

Dir ist aber schon klar das deine 4 Tasten an RA0..RA3 die Werte 0..15 
erzeugen können?

von Chris B. (dekatz)


Lesenswert?

.....a = PORTA & 0x0F;.....
Und welchen Zustand hat RA3??
Ist der "0"?? Denn nur dann trifft case 0: ... case 7: zu!

von Chris B. (dekatz)


Lesenswert?

Ahhh da war einer schneller....

von Roland E. (roland_91)


Lesenswert?

Chris B. schrieb:
> .....a = PORTA & 0x0F;.....
> Und welchen Zustand hat RA3??
> Ist der "0"?? Denn nur dann trifft case 0: ... case 7: zu!

Ja, der ist 0V.
Ich werd Wohl oder Übel noch einige Pull-Ups einlöten müssen auch wenn 
dadurch meine Platine verunstaltet wird -.-.
Nachdem ich die Pins mit ANSEL=0x00 auf digital geschalten habe, führt 
das Störsignal beim Messen trotz 1:10-Tastkopf nun zu einem Umschalten.
Darum wollte ich auch ursprünglich analoge Eingänge weil da der 
Spannungsbereich, in dem der PIC noch ein Hgh-Signal erkennt, größer ist 
soweit ich weiß.
Nächstes Mal muss ich das Datenblatt vorher genau durchlesen, aber 
darauf wäre ich im Traum nicht gekommen, dass manche PORTs einfach nicht 
als analoge Eingänge nutzbar sind.

Hoffentlich klappt es dann besser.

von Sebastian H. (sebihepp)


Lesenswert?

>Nächstes Mal muss ich das Datenblatt vorher genau durchlesen, aber
>darauf wäre ich im Traum nicht gekommen, dass manche PORTs einfach nicht
>als analoge Eingänge nutzbar sind.

Die sind als Analoge Eingänge nutzbar. Dazu musst den den internen ADC 
aber konfigurieren und regelmäßig samplen lassen.

Die Sache ist die: Wenn du Taster an Ports anschließt, dann sind das 
digitale Signale. Ergo brauchst du die Eingänge im digitalen Modus.

Und gib uns mal einen Schaltplan. Wenn die Schalter den Pegel nicht 
halten können, läuft was schief. Und zwar nicht im PIC.

von Roland E. (roland_91)


Angehängte Dateien:

Lesenswert?

Ich kann euch leider bloß eine Schaltskizze in JPG.-Format geben. Ich 
habe sie zwar mit Eagle entworfen aber auf diesem PC habe ich Eagle 
leider nicht.
Da ich etliche Bauteile aus der "Restekiste genommen habe, waren sie 
nicht in der Bibliothek und ich habe danach noch diese Sachen 
aufzeichnen müssen^^

von Sebastian H. (sebihepp)


Lesenswert?

Ich sehe gar keine Schalter.

von Sebastian H. (technik_freak)


Lesenswert?

S1 ist wahrscheinlich gemeint.

Andere Frage: Warum nimmst Du ein 8051 als Bauteil (und hast den Namen 
geändert) und keinen aus der Microchip-Bibliothek?

von Chris B. (dekatz)


Lesenswert?

Ich nehme an die 4 Schalter sollen wohl die "SWS004" sein - die hängen 
ja an V+, und wenn da ein Schalter OFFEN ist, hängt der entsprechende 
Pin in der Luft - genau das soll er aber nicht ;-)

von Sebastian H. (sebihepp)


Lesenswert?

Genau, da müssen Pullups rein

von hagi (Gast)


Lesenswert?

Da die Schalter VCC schalten sind Pull-Down die bessere Wahl. Bei 
Pull-Up liegt am Port immer eine "1" an.

Wenn schon Pull-Up dann müssen die Schalter GND schalten.

von Roland E. (roland_91)


Lesenswert?

Sebastian H. schrieb:
> S1 ist wahrscheinlich gemeint.
>
> Andere Frage: Warum nimmst Du ein 8051 als Bauteil (und hast den Namen
> geändert) und keinen aus der Microchip-Bibliothek?

Den Plan habe ich vor paar Monaten, als ich noch nicht wusste, dass man 
die Bauteilbibiliothek erweitern kann, mal skizzenhaft entworfen und 
jetzt wieder Zeit gefunden weiterzuarbeiten.

Die Pull-Downs und das Konfigurieren von PORTA als digitaler Input waren 
letztendlich die Lösung.
Danke für eure Hilfe :D

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.