Forum: Mikrocontroller und Digitale Elektronik PIC ASM Befehl Sprung bei PIC16F877


von Jens (Gast)


Lesenswert?

Hi,

ich habe hier einen Codeschnipsel:

BCF 0xa,0x4     adresse 062f
BSF 0xa,0x3             0630
goto 0x458              0631

0xa ist PCLATH bei dem Ding. Die Bits 3 und 4 sind die werthöchsten des 
PC.

Demnach landet der Sprung bei 0x458 + 0x1000 + 0x800, richtig?

Im Manual lese ich folgendes:

The
CALL and GOTO instructions provide only 11 bits of
address to allow branching within any 2K program
memory page. When doing a CALL or GOTO instruction,
the upper 2 bits of the address are provided by
PCLATH<4:3>. When doing a CALL or GOTO instruction,
the user must ensure that the page select bits are
programmed so that the desired program memory
page is addressed. If a return from a CALL instruction
(or interrupt) is executed, the entire 13-bit PC is popped
off the stack.

unter 2.4 Memory Paging.

Wenn ich richtig verstehe muss ich die beiden Bits vor einem Call oder 
Goto setzen. Bei einem Rücksprung aus einem Call kommt er aber 
automatisch an die richtige Stelle zurück.

Demnach müsste beim goto nichts auf den Stack gepackt werden, ich frage 
nur zu sicherheit auch wenn es eigentlich logisch ist.

Was ist, wenn ich die Bits in PCLATH setze und den goto oder call nicht 
ausführe? Immerhin habe ich den PC ja eigentlich trotzdem 
"verbogen"...oder sind das "schattenbits" die wirklich nur bei call oder 
goto übernommen werden?

JJ

von Anja (Gast)


Lesenswert?

Jens schrieb:
> Demnach müsste beim goto nichts auf den Stack gepackt werden,

nö, nur der call-Befehl kopiert die Rücksprungadresse auf den Stack.

Jens schrieb:
> Immerhin habe ich den PC ja eigentlich trotzdem
> "verbogen".
nö, nur das PCLATH-Register. das hat mit dem PC (PCH, PCL) nix zu tun, 
außer daß beim CALL oder GOTO die beiden Bits ins PCH-Register kopiert 
werden.
(siehe Figure 2-5 im Datenblatt).

Die Überraschung kommt dann beim nächsten call oder goto-Befehl.

Übrigens: nach einem RETURN-Befehl steht PCLATH in der Regel immer noch 
auf dem Wert der vor dem CALL-Befehl hineingeschrieben wurde. Also nach 
dem call immer schön die Register wieder auf die richtige Page stellen.

Gruß Anja

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.