www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC 16F84A Sprünge


Autor: Tobias Möhring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie muß ich die Aprungmarken setzen und den GOTO-Befehl richtig
anwenden, damit das funktioniert?

Ich habe nun schon einige Progs ausprobiert, aber immer wenn ich eine
Warteschleife machen will, läuft das Prog nicht mehr.....

Mit einfachen Kontrollausgaben hab ich inzwischen festgestellt, das es
bis zu der Zeile, wo ich einen Sprung ausfühten lasse richtig
funktioniert, den goto-Befehl aber nicht kor´rekt erledigt, bzw. ab der
Stelle gar nichts mehr tut. Also auch die nachfolgenden Zeilen (wenn
kein Sprung gemacht werden soll) werden nicht ausgeführt......

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

Sprungmarken müssen immer an 1. Stelle beginnen, z. B.:
   nop
   goto wait
   nop

wait nop
     nop
     return


Die nop sind nur Beispiels für den richtigen Code. Normaler
Programmcode darf nicht an Stelle eins beginnen.

Gruß Markus

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleiner Tippfehler von Marcus:

         nop
         goto wait  ; Springt zum Label wait
Weiter   nop
         :

wait     nop
         nop
         goto Weiter ; Springt zum Label Weiter

Das Return würde ohne vorheriges Call einen Stacküberlauf verursachen.

Steffen

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die PICs haben einen segmentierten Adreßraum.
Daher muß beim 16F84 das PCLATH Register richtig geladen sein, damit
ein GOTO (oder CALL) funktioniert.

Das PCLATH sollte grundsätzlich immer mit geladen werden, damit Code
auch über Segmentgrenzen verschiebbar ist.

Du suchst Dich sonst tot, wenn durch das Einfügen eines Befehls
plötzlich an ganz anderer Stelle ein GOTO in den Wald zeigt.


Peter

Autor: Tobias Möhring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Davon stand in meiner ANleitung nichts.........

Wie mache ich das mit dem PCLATH denn richtig????????

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das mit dem PCLATH ist bei manchen Prozessoren richtig, trifft aber beim
16F84A nicht zu. Der hat nur 1kWord Programmspeicher, die sind linear
adressiert. Jedenfalls für CALLs und GOTOs.

Ich glaube so rum wird das nichts. Poste doch einfach mal deinen Code
(wenn´s viel ist als Anhang) + verwendeten Prozessor. Da können wir mal
drüberschauen.

Autor: Tobias Möhring (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.mikrocontroller.net/forum/read-8-125877.html#new

Da steht der Quellcode. Leider hab ich in der Version die Variablen,
die ich mir oben definiert habe nicht weiter benutzt, weil ich
ausschließen wollte, das darin der Fehler lag..........

Danke für eure Mühe!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe selber den 16F84A nicht verwendet, die Informationen habe ich
nur dem Datenblatt entnommen:

GOTO Unconditional Branch
Syntax: [ label ] GOTO k
Operands: 0 £ k £ 2047
Operation: k ® PC<10:0>
PCLATH<4:3> ® PC<12:11>
Status Affected: None
Description: GOTO is an unconditional branch.
The eleven-bit immediate value is
loaded into PC bits <10:0>. The
upper bits of PC are loaded from
PCLATH<4:3>. GOTO is a twocycle
instruction


Da ist das Datenblatt wohl durch Copy&Paste aus einem größeren PIC
entstanden und man hat vergessen es anzupassen.


Peter

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter

Das ist der Standarttext für alle PICs mit 14-Bit breitem Befehlssatz.
Beim GOTO werden im Befehl 11 Bit übergeben. Damit sind jeweils Bänke
von 2k linear adressierbar und der 16F84 hat nur 1k. Bei PICs mit mehr
als 2k Programmspeicher muss man dann die Bits in PCLATH entsprechend
setzen.

Ist aber ein beliebter Fehler. Daher war dein Hinweis schon OK.

Steffen

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.