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.
"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
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.
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
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....
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.
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.
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.