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
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.
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.