Hallo Ich bin PIC-Anfänger und wundere mich über meinen PIC16F84A. Dieser wiederholt ständig den Programmcode. Externe Resets liegen nicht vor. Der Watchdogtimer ist deaktiviert. Hier im Beispielprgramm soll ein Port nach einer Wartezeit eingeschaltet werden, kurz auf H bleiben und nach einer weiteren Wartezeit wieder ausgehen. Nur hört der PIC nicht nach einem Durchlauf des Programms auf, sondern wiederholt ständig die Anweisungen. Der Port wechselt also nicht nur einmal, sondern ständig. Hier der Programmcode: list p=16F84A include <p16f84a.inc> l1 equ 0x0C l2 equ 0x0D l3 equ 0x0E org 0x000 goto main wait movlw 0xFF movwf l1 movwf l2 movlw 0x07 movwf l3 wait_loop decfsz l1, f goto wait_loop decfsz l2, f goto wait_loop decfsz l3, f goto wait_loop return main bsf STATUS, RP0 clrf TRISB bcf STATUS, RP0 clrf PORTB call wait bsf PORTB,5 call wait bcf PORTB,5 end Die Wiederholung des Programms kann ich nur durch eine Marke vor "end" mit einer "goto"-Anweisung verhindern. Aber das kann doch nicht normal sein oder? Woran liegt es, dass der PIC alles wiederholt??
Hallo, es könnte an deiner Interpretation des decfsz-Befehls liegen. Laut Datenblatt muß er wie folgt lauten: decfsz f,d wenn d=0: ergebnis (f - 1) kommt ins w wenn d=1: ergebnis (f - 1) kommt in f wobei f ein beliebiges Register sein kann (in deinem Fall l1, l2, l3) Konntest du dein Programm überhaupt fehlerfrei assemblieren ? Naja, hoffentlich konnte ich helfen. Gruß Thorsten
Hallo Wolfram, arbeitest Du mit MPLAB? Im Anhang ist eine Programmkopf untergebracht welcher mit MPLAB fehlerfrei arbeitet. Versuchs mal mit main: org 10. MfG Manfred Glahe
Noch etwas, im MPLAB werden Unterprogramme mit CALL aufgerufen und stehen linksbündig ohne :. Sprungmarken dagegen werden mit : gekennzeichnet. Ich denke da liegt das Problem. MfG Manfred Glahe
Hi Wolfram, Du hast es genau erkannt: Am Ende des Programms muß immer stehen, was er als nächstes machen muß, z.B. ein Sprung zu sich selbst. Falls der Prozessor es unterstützt, kannst Du auch ein HALT oder SLEEP ausführen, um ihn anzuhalten. Ohne sowas macht er einfach weiter und irgendwann ist er einmal rum und kommt wieder vorne an. Das Dein Programm zuende ist, bedeutet ja nicht, daß danach kein Code-Speicher mehr existiert. Peter
Hallo Am Befehl decfsz l3, f liegt es wohl nicht. l3 steht hier für f und , f bedeutet wohl soviel wie , 1, nämlich das speichern im aktuellen File-Register. Bei Änderung auf decfsz l3, 1 tritt keine Änderung ein. Wenn ich den "main-Programmabschnitt" mit main: org xx beschreibe, bringt dies keine Änderung. Der PIC wiederholt immer noch. Gibt es da vielleich eine Einstellung im MPLAB, die dem PIC nach beenden des Programms zurücksetzt? Der PIC scheint von irgendwo dauern zurückgesetzt zu werden. Den PIC selbst betreibe ich zu Testzwecken im Experiementier-Board von digitale-elektronik.de. Laut Schaltplan dürfte dieses den PIC aber nicht zurücksetzen. Oder muss ich beim "end"-Befehl noch zu einer Ende-Position im Programmspeicher springen?
Hallo Hab' gerade die Antwort geschrieben, als Tread einging. Einen Halt-Befehl kennt der PIC 16F84A wohl nicht. Jedenfalls passiert nichts, wenn ich HALT vor END schreibe. Mit dem Sleep-Befehl jedoch stellt der PIC seien Arbeit wie gewüscht ein. Vielen Dank!
Wenn Dein Programm zu Ende ist, dann läuft der Pic den Rest des Speichers durch und kommt irgendwann mal wieder bei 0x0000 an. Das "end" zeigt lediglich dem Compiler an, das der Quellcode zu Ende ist! das Programm ist ber noch lange nicht zu Ende. Ver suche es mal mit folgenden Zeilen am Ende des Programmes: EndeProgramm clrwdt goto EndeProgramm Ich hoffe mal, das es lesbar ist (bin auch erst neu hier) MfG Steffen
Dem PIC hatte ich vorher schon mal so eine Endlosschleife am Ende verpasst. Ich dachte aber, dass man das Programm auch sinnvoller beenden kann. Dem ist aber wohl nicht so. Da kann man wohl nichts machen. mfg Wolfram Hildebrandt
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.