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
Hallo, danke erstmal für die schnelle Antwort, hier kommt der Code. Ich hoffe damit könnt ihr mir helfen. Danke, Franz9.
Einfach verstaendlich ist Der Code ja nicht gerade, was soll denn wann angezeigt werden?
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.