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
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!
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.
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
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.
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!
Eine eigene Frage?
Dieser Thread ist über 13 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.