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