Forum: Mikrocontroller und Digitale Elektronik PIC - Problem


von Franz Wilgert (Gast)


Lesenswert?

Hallo,

ich habe ein Problem mit einem PIC 16F871. Ich möchte PortA, PortC,
PortD und PortE als digitalen Eingang verwenden, an PortB hängt ein LCD
Display. Das LCD macht soweit keine Probleme. Aber mit den Eingängen
stimmt irgendwas nicht, PortC,0 funktioniert garnicht, wobei alle
anderen Pins von PortC super funktionieren, PortD funktioniert auch
einwandfrei. Aber bei PortA und PortE gibt es wieder ein Problem, und
zwar verwechselt der PIC manchmal die Eingänge. Auf dem LCD möchte ich
anzeigen, welcher Pin gerade auf LOW ist, alle Eingänge sind
standardmaäßig über einen Pull up Widerstand auf +5V gelegt.
Wenn ich zum Beispiel an PortA,0 LOW anlege, zeigt mir das LCD an, dass
PortA,1 auf LOW sei, wenn ich dann auf PortA,1 LOW lege zeigt mir das
Teil an, dass PortA,1 auf LOW liegt (was ja diesmal auch richtig ist).
Aber das komische ist, wenn ich jetzt erneut an PortA,0 LOW anlege,
zeigt das LCD auf einmal richtig an.
Also ich verstehe das nicht, kann mir da jemand von euch weiterhelfen?

Danke schonmal, Franz.

von Peter D. (peda)


Lesenswert?

"kann mir da jemand von euch weiterhelfen?"

Nein !

Du hast ja Deinen Code nicht als Anhang beigestellt.

Und da ich nicht in Deinen Kopf sehen kann, vermute ich mal, andere
auch nicht.


Peter

von Franz Wilgert (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,

danke erstmal für die schnelle Antwort, hier kommt der Code. Ich hoffe
damit könnt ihr mir helfen.

Danke, Franz9.

von Profi (Gast)


Lesenswert?

Einfach verstaendlich ist Der Code ja nicht gerade, was soll denn wann
angezeigt werden?

von Franz Wilgert (Gast)


Lesenswert?

Naja mit Assembler hab ich nich so die Ahnung, desshalb ist der Code ein
bisschen schlecht strukturiert. Ich hab jetzt noch mal ne Textdatei
erstellt, wo der eigentlich wichtige Teil zu sehen ist.

Ich habe jedem Eingang eine Nummer gegeben und danach sollte der PIC
alle Eingänge von oben nach unten durchgehen und sobald ein eingang auf
low ist, dessen Nummer auf dem LCD ausgeben. Wenn ein Pin auf Low war
sollen die nachfolgenden (nach der Nummerierung) nicht mehr überprüft
werden. Das ganze soll eine einfache Füllstandsanzeige werden.

Es tut mir Leid, wenn ich mich etwas unklar ausgedrückt habe, das ganze
ist irgendwie so blöd zu erklären.

Franz.

von Franz Wilgert (Gast)


Angehängte Dateien:

Lesenswert?

verdammt, hab die Datei vergessen.

von Andreas Jäger (Gast)


Lesenswert?

Was mir sofort aufgefallen ist: Wenn Du mit "CALL" eine Subroutine
aufrufst, musst Du diese mit "RETURN" beenden, nicht mit "GOTO
MAIN"!

:

OUT24
  movlw  '0'
  call  OutLcdDaten
  movlw  '2'
  call  OutLcdDaten
  movlw  '4'
  call  OutLcdDaten

;;;;;  goto   MAIN <-- FEHLER!!!
        return

Andreas

von Franz Wilgert (Gast)


Lesenswert?

Hallo,

danke für den Tip, aber daran lag es leider nicht.

Franz.

von Uwe Nagel (Gast)


Lesenswert?

Hast Du wirklich externe Pullups dran?
Die internen hat nur PortB!
Der Code scheint mir nicht so ganz unvernünftig zu sein.
Du könntest in dieser BTFSS/Call Kette die CALL's auch durch GOTO's
ersetzen, dann geht es auch mit dem GOTO main am Unterprogramm Ende.
Allerdings funktioniert das Programm auch so, denn der PIC hat nur
einen recht kleinen Stack, wenn der überläuft, fängt er einfach von
vorne an.
Beim AVR kollidiert dann der Stack mit den Daten und es gibt ein nettes
Durcheinander....

von Franz Wilgert (Gast)


Lesenswert?

Hallo,

hab inzwischen schon die CALLs durch GOTOs ersetzt, aber wie gesagt,
daran lags nicht. Und ja ich habe externe Pullups dran (10K-Netzwerk).

Franz.

von Franz Wilgert (Gast)


Lesenswert?

Hallo,

ich hab jetzt mal genau das gleiche Programm auf einen PIC 16F877
gebrannt, und auf einmal geht alles wie es soll.
Sehr komisch, kann mir das vielleicht jemand erklären?

Franz.

von Profi (Gast)


Lesenswert?

kann schon am kleinen Stack liegen. Vergleiche mal die Stackgröße der
beiden.
Haben die beiden die Register an den selben Adressen?

Gibt es Kriechströme zwischen den Eingängen (Feuchtigkeit, Salz)??

Uwe Nagel:
Bist Du Dir sicher, dass er bei einem Stackoverflow von vorn anfängt?
Ich glaube eher, er nimmt die falsche Rücksprungadresse.

Ich würde auf jeden Fall mal gotos statt der calls nehmen (die bringen
ja überhaupt nichts), macht schonmal einen Level weniger. Vielleicht
ist es aber immer noch ein Level zuviel.

Außerdem könnte es an einer Page-Grenze liegen.

Ich weiß, am Anfang ist das schwer, aber bei besserer Strukturierung /
Vorüberlegung wäre das Programm nur ein Fünftel so groß.

Die cm würde ich ausrechnen und die Liter entweder auch (wenn man das
in eine Formel bringen kann) oder in eine LookUp-Tabelle legen, und
zwar nicht als Buchstaben, sondern als Binärzahlen.

Aber Speicher ist ja genug da.

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.