Forum: Mikrocontroller und Digitale Elektronik PIC beendet programm nicht


von HDW (Gast)


Lesenswert?

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??

von Thorsten (Gast)


Lesenswert?

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

von Manfred Glahe (Gast)


Angehängte Dateien:

Lesenswert?

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

von Manfred Glahe (Gast)


Lesenswert?

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

von Manfred Glahe (Gast)


Angehängte Dateien:

Lesenswert?

Habe noch ein Programm mit Unterprogrammaufrufen gefunden.

von Peter D. (peda)


Lesenswert?

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

von HDW (Gast)


Lesenswert?

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?

von HDW (Gast)


Lesenswert?

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!

von Steffen T (Gast)


Lesenswert?

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

von HDW (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.