www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC beendet programm nicht


Autor: HDW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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??

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Manfred Glahe (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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

Autor: Manfred Glahe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Manfred Glahe (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Habe noch ein Programm mit Unterprogrammaufrufen gefunden.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: HDW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: HDW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Steffen T (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: HDW (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.