Forum: Mikrocontroller und Digitale Elektronik PIC16F887 GOTO RETURN Problem


von Max (Gast)


Lesenswert?

Hallo,
ich habe eine Frage, ich habe gerade mit meinem PIC16F887 ein kleines 
Assembler Programm laufen lassen.
Dabei bin ich auf ein komisches verhalten gestoßen, dass ich mir nicht 
erklären kann.
Warum funktioniert das Programm nur, wenn ich vor dem Return noch ein 
zusätzliches NOP mache ?
Darf man nicht zu einem RETURN mit GOTO springen ?


...

BTFSS  SM_WARTEC_TEMP, 2
GOTO  $ + 8
NOP
NOP
NOP
NOP
NOP
NOP
NOP

BTFSS  SM_WARTEC_TEMP, 3
GOTO  $ + 16
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP
NOP

;NOP ; Ohne dieses NOP funktioniert das Programm nicht.

RETURN



Wenn ich das mit einem Simulator laufen lasse springt der PC bei dem 
GOTO $ + 16 irgendwo ganz weit runter (Weit über 200 Adressen weiter).

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Welches von den vielen NOP's ...
und 2te Frage, gibts da keine Labels mehr bei den PICs ?

von Max H. (hartl192)


Lesenswert?

Wieso arbeitest du eigentlich nicht mit Lables, das macht das Programm 
mMn übersichtlicher. Tritt der Fehler nur im Simulator auf oder auch im 
real Life?

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

Und könnte das weit über 200 auch weit über 2000 bedeuten ?
PCLATCH ?
http://www.sprut.de/electronic/pic/assemble/befehle.html#goto

von Max H. (hartl192)


Lesenswert?

Versuch es mal mit
1
goto D'16'
Der Interpretiert die 16 als HEX-Zahl.
http://www.sprut.de/electronic/pic/assemble/assembler.html#Regeln

Ich würde aber trotzdem Lables verwenden, dann funktioniert der Code 
auch noch wenn du mal ein nop wegnimmst und man sieht gleich wo 
hingesprungen wird ohne nops zu zählen.

: Bearbeitet durch User
von Max (Gast)


Lesenswert?

Ah danke, natürlich gibts Labels, aber ich will nicht für jede 
kleinigkeit ein Label machen.

von John (Gast)


Lesenswert?

Der Programmzähler zeigt immer auf den nächsten Befehl.
1
    BTFSS  SM_WARTEC_TEMP, 3
2
    GOTO  $ + 16      <- während dieser Befehl aufgeführt wird..
3
 0  NOP               <- ..steht der Programmzähler hier
4
 1  NOP
5
 2  NOP
6
 3  NOP
7
 4  NOP
8
 5  NOP
9
 6  NOP
10
 7  NOP
11
 8  NOP
12
 9  NOP
13
10  NOP
14
11  NOP
15
12  NOP
16
13  NOP
17
14  NOP
18
15  ;NOP ; Ohne dieses NOP funktioniert das Programm nicht.
19
16  RETURN
20
 x  -> Ziel=PC+x

Gruß
John

von Max H. (hartl192)


Lesenswert?

John schrieb:
> Der Programmzähler zeigt immer auf den nächsten Befehl...
Das $ bezieht sich auf die Zeile in es steht, goto $ ist eine 
Endlosschleife.
Das Problem ist, dass der Assembler 16 als 16 hex = 22 dez 
interpretiert.

von S. Landolt (Gast)


Lesenswert?

Dann muss dies hier wohl falsch sein (Was ist "$"?):
http://www.sprut.de/electronic/pic/assemble/assembler.html#W

von S. Landolt (Gast)


Lesenswert?

Sorry, Max H., das bezog sich auf Johns
> Der Programmzähler zeigt immer auf den nächsten Befehl.

von Max H. (hartl192)


Lesenswert?

S. Landolt schrieb:
> Dann muss dies hier wohl falsch sein (Was ist "$"?):
> http://www.sprut.de/electronic/pic/assemble/assembler.html#W
$ ist die Adresse an der der Befehl steht.
1
  org 0x20
2
  goto $+1
zum Beispiel setzt
1
goto 0x21
an die Adresse 0x20

Max schrieb:
> Ah danke, natürlich gibts Labels, aber ich will nicht für jede
> kleinigkeit ein Label machen.
Wieso nicht?

Du kannst dir ja auch mal das disassembly Listing ansehen und schauen 
welche absolute Adresse das Sprungziel ist.

: Bearbeitet durch User
von John (Gast)


Lesenswert?

Max H. schrieb:
> John schrieb:
>> Der Programmzähler zeigt immer auf den nächsten Befehl...
> Das $ bezieht sich auf die Zeile in es steht, goto $ ist eine
> Endlosschleife.

Ja, hab ich verwechselt. $ bezieht sich auf die Zeile in der es steht.
Der Programmzähler (PCL) zeigt immer auf den nächsten Befehl.

von Michael L. (michaelx)


Lesenswert?

Max schrieb:
> Ah danke, natürlich gibts Labels, aber ich will nicht für jede
> kleinigkeit ein Label machen.

Glaubst du, dass du mit Befehle zählen schneller bist, als ein Label 
hinztippen?

Frei nach dem Motto: "Wer sein Auto liebt der schiebt.", oder was?

Davon abgesehen ist es ein irrer, unnützer Aufwand, denn bei jeder 
kleinen Änderung im Code musst du alle derartigen Sprünge prüfen, ob 
sich was verschoben hat. Viel Arbeit und erhebliche Fehlerquellen. Das 
kann kein einigermaßen vernünftiger Mensch wollen, wenn es deutlich 
einfacher geht.

Und ich weiß, wovon ich rede, denn es gab eine Zeit, da hab ich 
Assemblerprogramme auf dem Papier entwickelt und in Maschinencode 
übersetzt, weil es nix anderes gab. - Ist zum Glück viele, viele Jahre 
her.

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

1. Was ist wenn dein wilder Sprung > 200 garnicht von den Code-Zeilen 
kommt die du dir anschaust ?
2. Nimm Labels, die gibts umsonst und machen den Code viel viel 
lesbarer.
3. Hast du manchmal den Sourcecode oder das Hexfile um es mal in einen 
Simulator zu quetschen und mal anzuschauen ?

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.