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


von Tobias Möhring (Gast)


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

von Markus (Gast)


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

von Steffen (Gast)


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

von Peter D. (peda)


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

von Tobias Möhring (Gast)


Lesenswert?

Davon stand in meiner ANleitung nichts.........

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

von Steffen (Gast)


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.

von Tobias Möhring (Gast)


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!

von Peter D. (peda)


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

von Steffen (Gast)


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

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.