Forum: Mikrocontroller und Digitale Elektronik MOVLP Befehl (PIC16F1937)


von Erhard S. (Gast)


Lesenswert?

Hallo zusammen,

eine Frage bezüglich zur Anwendung des MOVLP Befehls:

Der Abschnitt in meinem Programm sieht so aus:

(Page 0)

movlp   .1   ;Page 1
call    test
...
...



org  H'0800'    ;Page 1

test  ...
      ...
return

1. Frage: Ist die Anwendung des Befehls so richtig um auf eine andere 
Page zu kommen? (In diesem Fall Page1)

2. Frage: Ist der Aufruf eines Unterprogramms in einer anderen Page auch 
von der ISR aus möglich?


Mein Programm stürzt nämlich immer bei der Rückkehr von Page1 zur Page0 
ab.

mfg Erhard

von B. S. (bestucki)


Lesenswert?

Hast du das Datenblatt gelesen?
http://ww1.microchip.com/downloads/en/DeviceDoc/41364E.pdf

Seite 374:
> MOVLP: The seven-bit literal ‘k’ is loaded into the PCLATH register.

Auf diversen Seiten im Kapitel "Memory Organization":
> PCLATH: Write Buffer for the upper 7 bits of the Program Counter

Seite 53 erklärt den Rest.

Nachtrag:
http://ww1.microchip.com/downloads/en/DeviceDoc/41375A.pdf

Wie du PAGESEL verwendest, verrät dir die Hilfe.

von Erhard S. (Gast)


Lesenswert?

Ja, das Datenblatt habe ich sehr wohl gelesen, aber jetzt gehts.

Ich habe am Ende des Unterprogramms in der Page 1 den Wert der 
Rücksprungadresse zur Page 0 mit movlp wieder zurückgeschrieben.
Sollte laut Datenblatt der Return-Befehl selbst machen?!


(Page 0)

0203   movlp   0x08   ;Page 1
0204   call    test
0205   ...
0206   ...


org  H'0800'          ;Page 1

0800  test  ...
            ...
0810  movlp   0x02       ;zurück zur Rücksprungadresse in Page 0
0811  return             ;dann gehts bei Programmadresse 0205 weiter

PS: Wenn einer meint, diese Vorgehensweise sei Murks, dann soll er 
meinen.
ES GEHT NICHT ANDERS!!!!
Das Programm läuft nun seit einigen Stunden stabil!

von Michael L. (michaelx)


Lesenswert?

Erhard S. schrieb:
> Ja, das Datenblatt habe ich sehr wohl gelesen, aber jetzt gehts.
>
> Ich habe am Ende des Unterprogramms in der Page 1 den Wert der
> Rücksprungadresse zur Page 0 mit movlp wieder zurückgeschrieben.
> Sollte laut Datenblatt der Return-Befehl selbst machen?!
>
>
> (Page 0)
>
> 0203   movlp   0x08   ;Page 1
> 0204   call    test
> 0205   ...
> 0206   ...
>
>
> org  H'0800'          ;Page 1
>
> 0800  test  ...
>             ...
> 0810  movlp   0x02       ;zurück zur Rücksprungadresse in Page 0
> 0811  return             ;dann gehts bei Programmadresse 0205 weiter
>
> PS: Wenn einer meint, diese Vorgehensweise sei Murks, dann soll er
> meinen.
> ES GEHT NICHT ANDERS!!!!
> Das Programm läuft nun seit einigen Stunden stabil!

Hallo Erhard,

ich hab den Chip nicht hier, kann also nichts ausprobieren.
Dass es nur mit MOVLP vor dem RETURN gehen soll, kann ich mir aber nicht 
so recht vorstellen, weil die Rücksprungadresse explizit vom Stack 
geholt wird.
Weil du uns aber nicht den Code vor dem RETURN gezeigt hast, kann ich 
nur spekulieren, dass das RETURN ohne das zusätzlich eingefügte MOVLP 
"irgendwie" übersprungen und nicht ausgeführt wurde.
Probiere doch es statt dessen mal mit einen NOP aus.

Grüße.

von Erhard S. (Gast)


Lesenswert?

Hallo,

das mit dem NOP werde ich noch mal versuchen (nach den Feiertagen ;) ).

Der Return-Befehl wird definitiv nicht übersprungen!

Das war ja das ganze Problem; das Unterprogramm wurde in Page 1 
ordungsgemäß aufgerufen und ausgeführt, nur beim Rücksprung gab es 
Probleme, der PIC stürzte ab.

> Sollte laut Datenblatt der Return-Befehl selbst machen?!

Das genau habe ich ja nicht verstanden, warum es da nicht geht!

mfg

von Michael L. (michaelx)


Lesenswert?

Erhard S. schrieb:
> Hallo,
>
> das mit dem NOP werde ich noch mal versuchen (nach den Feiertagen ;) ).

Ja bitte, würde mich echt interessieren, wo das Problem liegt. Vlt. 
magst du ja doch noch den nicht funktionierenden Code posten. Keine 
falsche Scham. ;-)

> Der Return-Befehl wird definitiv nicht übersprungen!
>
> Das war ja das ganze Problem; das Unterprogramm wurde in Page 1
> ordungsgemäß aufgerufen und ausgeführt, nur beim Rücksprung gab es
> Probleme, der PIC stürzte ab.

Ja, und das kann eben am falschen Rücksprungziel, genau so wie auch am 
nicht ausgeführten Return liegen.

>> Sollte laut Datenblatt der Return-Befehl selbst machen?!
>
> Das genau habe ich ja nicht verstanden, warum es da nicht geht!

Sicher gibt es immer wieder irgendwelche kleinen Macken, welche dann 
inklusive Wege zur Umgehung in den Erratas beschrieben werden.

Wenn aber das Return wirklich nicht so funktionieren sollte wie es muss, 
und davor immer ein MOVLP zur Bank, aus der der Aufruf kaum, nötig wäre, 
dann wäre der PIC eigentlich so gut wie unbrauchbar. Und das kann ich 
mir ehrlich gesagt nicht vorstellen.
Klar stehst du jetzt davor, und verstehst nicht das Warum und Wieso, 
siehst das es scheinbar nur so (mit MOVLP) geht. Aber die wirkliche 
Ursache wird was anderes sein, was du nicht vermutest. Mit ein paar 
Tagen Abstand sieht das nach meiner Erfahrung meist ganz anders aus.

Grüße.

von stepp64 (Gast)


Lesenswert?

Du musst nach dem Call den PCLATH wieder auf die Page0 zurücksetzen. Der 
Return schreibt zwar den PC 14bittig zurück aus dem Stack, aber beim 
nachsten Call oder goto versucht er wieder in Page 1 zu springen, sofern 
dann der PCLATH noch auf Page 1 steht. Also vor dem Call PCLATH auf die 
Page setzen wo das Programm weiter geht und nach der Rückkehr im 
aufrufenden Proggrammteil die Page wieder zurücksetzen. Nicht im 
Unterprogramm! Dann könntest du das Unterprogramm ja nicht aus 
verschiedenen Pages aus aufrufen, da du im UP nicht weist, aus welcher 
Page du gekommen bist. Schau dir das im Datenblatt noch mal genau an. 
Ist nicht ganz einfach zu verstehen. Aber der PC ist nicht gleich der 
PCLATH, das sind verschiedene Register!

von Erhard S. (Gast)


Lesenswert?

Danke stepp64, habe ich ausprobiert und läuft astrein!!!!!!!!!!!!!!!!!

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.