www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik PIC Interrupt in Bank1 endet im nirgendwo


Autor: Tobi D. (fanti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi,
ich habe ein Problem mit dem Interrupt in Verbindung mit einer 
"table-read" und finde dafür einfach keine Lösung die wirklich 
funktioniert, außer den Interrupt gernell während des Vorgangs 
abzuschalten, was aber nicht wirklich der Sinn des Interrupts ist, ich 
hoffe jemand kann mir da behilflich sein:

PIC16f - Assembler

ich habe eine große Tabelle mit Werten, da ich während der Tabelle aber 
nicht den 8bit Programmcounter überschreiten darf, habe ich die Tabelle 
auf den ProgrammSpeicherbereich von page1 gelegt. Löst nun der Interrupt 
während des Bereichs 0x800 aus, so springt der zuerst zwar zur 0x004 
Adresse aber nicht mehr weiter in den Interrupt (Adresse 0x040) sondern 
zur Adresse 0x840 auf page1 und arbeitet dort weiter.

irgendwas ist also an den Sprungadressen faul, aber wo? ich hab schon 
bei Sprut-Adressierung gesucht aber wurde nicht viel schlauer was mein 
Problem angeht

org  0x0004
  goto  interrupt ; springt zu Adresse 0x40
;-------------------------------

...
     bsf    PCLATH, 3     ;umschalten auf page1 der speicherbank
    call  z1
....

;------------------------
org 0x800
z1
  movfw  kuck
  addwf  PCL,1
  nop
  retlw  b'00011111'
  retlw  b'00011111'
          ...

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobi D. schrieb:
> org  0x0004
>   goto  interrupt ; springt zu Adresse 0x40

da fehlt noch ein pagesel Befehl.
 org  0x0004
  pagesel interrupt
  goto  interrupt ; springt zu Adresse 0x40

Allerdings mußt Du vorher das PCLATH bzw. Statusregister (je nach 
verwendetem PIC) sichern sonst findet das Programm nach dem Interrupt 
nicht wieder zurück.

Alternativ habe ich auch schon Interrupt-Routinen als Makro definiert 
und auf beide Pages (an den gleichen Offset gelegt). Da spart man sich 
das rücksichern des PCLATH.

Gruß Anja

Autor: Tobi D. (fanti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
danke für den Tipp, das mit dem pagesel wäre eigentlich die Lösung 
gewesen, nach der ich gesucht habe,
leider spuckt der Simulator mir jetzt nach einigen durchläufen "stack 
overflow" aus, ich werde es mir morgen nochmal im Einzelschrittmodus 
genauer anschauen und berichten

mit vorher retten meintest du doch das hier oder? (und am ende im 
interrupt natürlich wieder zurück)
    org  0x0004
    MOVFw    PCLATH
    MOVWF   PCLATH_TEMP
    CLRF    PCLATH
    movwf   w_temp
    swapf   STATUS,w
    movwf   status_temp
    pagesel interrupt
    goto  interrupt


den 2. Vorschlag habe ich noch nicht probiert, ist aber doch eher etwas 
als letzte Möglichkeit zu probieren, den interrupt in jede Speicherpage 
zu schreiben :-/

Autor: Anja (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Tobi D. schrieb:
> mit vorher retten meintest du doch das hier oder? (und am ende im
> interrupt natürlich wieder zurück)

Die Reihenfolge stimmt noch nicht ganz. Erst das W-Register sichern, 
dann das Statusregister und erst dann das PCLATH-Register.

Gruß Anja

Autor: Tobi D. (fanti)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jipi, danke Anja :)

jetzt funktioniert es genau so wie es soll, im Debugger und in der 
Schaltung selbst

die Reihenfolge ist also entscheident,
ist mir im ersten Überblick nicht aufgefallen, aber mit deinem Hinweis 
leuchtet es ein.
wenn ich das w Register nicht sofort sichere, verändere ich es mit dem 
sichern den pclath und das veränderte w Register ist für den späteren 
Programmverlauf natürlich fatal.

nochmals danke für deine Mühe, ciao

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.