mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC - Problem


Autor: Franz Wilgert (Gast)
Datum:

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

Autor: Peter Dannegger (peda)
Datum:

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

Autor: Franz Wilgert (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Danke, Franz9.

Autor: Profi (Gast)
Datum:

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

Autor: Franz Wilgert (Gast)
Datum:

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

Autor: Franz Wilgert (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
verdammt, hab die Datei vergessen.

Autor: Andreas Jäger (Gast)
Datum:

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

Autor: Franz Wilgert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

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

Franz.

Autor: Uwe Nagel (Gast)
Datum:

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

Autor: Franz Wilgert (Gast)
Datum:

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

Autor: Franz Wilgert (Gast)
Datum:

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

Autor: Profi (Gast)
Datum:

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

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.