Forum: Mikrocontroller und Digitale Elektronik INTERRUPT sets bank to original state


von Messuung (Gast)


Lesenswert?

Hallo

wie mache ich setzen ich die  original bank?????????????



SWAPF STATUS_TEMP, W ;Swap STATUS_TEMP register into W
;(sets bank to original state)
MOVWF STATUS ;Move W into STATUS register
SWAPF W_TEMP, F ;Swap W_TEMP
SWAPF W_TEMP, W ;Swap W_TEMP into W

von Dominik S. (dasd)


Lesenswert?

Guter Witz...
Um was geht es?

von Messuung (Gast)


Lesenswert?

um Interruptroutine





SAVING STATUS AND W REGISTERS IN RAM
MOVWF W_TEMP ;Copy W to TEMP register
SWAPF STATUS, W ;Swap status to be saved into W
CLRF STATUS ;bank 0, regardless of current bank, Clears IRP,RP1,RP0
MOVWF STATUS_TEMP ;Save status to bank zero STATUS_TEMP register
:
:(ISR) ;Insert user code here
:
SWAPF STATUS_TEMP, W ;Swap STATUS_TEMP register into W
> hier habe ich problem wie mach ich es;(sets bank to original state)
MOVWF STATUS ;Move W into STATUS register
SWAPF W_TEMP, F ;Swap W_TEMP
SWAPF W_TEMP, W ;Swap W_TEMP into W

von Ottmar K. (wil1)


Lesenswert?

Hallo  Messung,
das hatten wir doch schon mal im Thread
[Beitrag "Re: Interrupts SAVING STATUS AND W REGISTERS IN RAM"]

in dem Moment in dem movwf STATUS wie nachstehend abgearbeitet ist, ist 
Dein Programm wieder bereit zum Abarbeiten der Register in der Bank, aus 
welcher heraus die ISR eingetreten ist.

Nochmals: Lies im Datenblatt des PIC16F84 nach wie der Interrupt und das 
Banking behandelt wird! Schade natürlich falls Du englisch nicht 
verstehst, dann gibt es aber genügend deutschsprachige Seiten - Link von 
sprut habe ich Dir ja schon mal im oben verlinkten Thread gegeben!

ISR_Ende
  swapf   tmp_STATUS,w
  movwf   STATUS      ; Zugleich zurück zur usrpünglichen Bank
  swapf  tmp_W,f      ; WREG wieder herstellen
  swapf  tmp_W,w      ;
  RETFIE              ; zurück zum Aufrufspunkt der ISR

mach's gut
Ottmar

von Messuung (Gast)


Lesenswert?

ne ich habe so wie in Datenblatt ist so

von Peter D. (peda)


Lesenswert?

Am einfachsten nimmt man ne Architektur, die keine Bänke kennt.
Dann gehts ganz normal nach dem RETI dort weiter, wo der Interrupt kam.
Für Banking gibts heutzutage keinen Grund mehr. Je nach Programmgröße 
nimmt man 16, 32 oder 64bit linearen Adreßraum.


Peter

von Messuung (Gast)


Lesenswert?

Danke
ich habe so das problem gelöst  damit ich  es abgeben kann
so ist mir latte wenn net geklapt hat der läuft jetzt nicht mehr weg
DEZZAHLEN:
    movwf  sicher
    movlw  d'10'
    subwf  sicher,f
    btfsc  STATUS,0
    return
    movlw  d'10'
    addwf  sicher,w

    addwf  PCL, F
    retlw  '0'  ; Ziffer 0
    retlw  '1'  ; Ziffer 1
    retlw  '2'  ; Ziffer 2
    retlw  '3'  ; Ziffer 3
    retlw  '4'  ; Ziffer 4
    retlw  '5'  ; Ziffer 5
    retlw  '6'  ; Ziffer 6
    retlw  '7'  ; Ziffer 7
    retlw  '8'  ; Ziffer 8
    retlw  '9'  ; Ziffer 9

von Pompete (Gast)


Lesenswert?

Dominik S. schrieb:
> Guter Witz...
> Um was geht es?

Es geht offensichtlich um den Pic16f84 und die Interruptbehandlung mit 
Bankumschaltung, alle haben das gerafft, nur Du nicht ;-)

Es ist schon erstaunlich, das es immer wieder User gibt, welche sich die 
(vergebene?) Mühe machen und auf so reudige Threads antworten....

@wil1
Ich bewundere Dich für Deine Geduld, jetzt wurden die Hausaufgaben doch 
noch rechtzeitig fertig!
Der Dank wird Dir bestimmt auf ewigkeiten hinterher schleichen, auch 
wenn unser Gast "Messuung" nicht den Anstand hatte es zwischen seinen 
kaum vertändlichen Kauderwelsch zu erwähnen.

von Peter D. (peda)


Lesenswert?

Messuung schrieb:
> ich habe so das problem gelöst  damit ich  es abgeben kann

Sicher?
Der Code kann klappen, muß aber nicht.
Bei RETLW muß man immer auch das Überschreiten der Pagegrenze 
berücksichtigen.
Z.B.:
1
 get_lcd_pattern:
2
   movwf TEMP
3
   movlw high DataTable
4
   movwf PCLATH
5
   movls low DataTable
6
   addwf TEMP,W
7
   btfsc STATUS,C
8
   incf PCLATH,F
9
   movwf PCL  
10
 DataTable:
11
   DT H'00', H'80', H'C0', H'94', H'D4'


Peter

von Messuung (Gast)


Lesenswert?

>Sicher?

ja es war so:

er hat bei INTERRUPT status geendert und so hatte ich
in
DEZIMAL:
  movwf   eins        ;hier die Zahl zu bearbeiten rein laden
  clrf  zähn

UMWANDELN:
   movlw  d'10'
  subwf  eins,f      ;subtrahiere zahlenwert - 10
  incf  zähn,f      ;zehner +1
  btfsc  STATUS,0    ;Carryabfrage
  goto  UMWANDELN
  decf  zähn,f      ;Zahl nach überlaauf 0X bis 9X
  movlw  d'10'
  addwf  eins,w      ;addiere die Einer in Zahlenwert
  movwf   eins       ;rest 0 bis 9
RETURN

nicht immer ergebnis 9>
so nemmen wir an er hat jetzt 247
so muss er das abzählen und landet in anderem program

    addwf  PCL, F
    retlw  '0'  ; Ziffer 0
    retlw  '1'  ; Ziffer 1
    retlw  '2'  ; Ziffer 2
    retlw  '3'  ; Ziffer 3
    retlw  '4'  ; Ziffer 4
    retlw  '5'  ; Ziffer 5
    retlw  '6'  ; Ziffer 6
    retlw  '7'  ; Ziffer 7
    retlw  '8'  ; Ziffer 8
    retlw  '9'  ; Ziffer 9


dabke noch mal

von Ottmar K. (wil1)


Lesenswert?

Pompete schrieb:
> @wil1
> Der Dank wird Dir bestimmt auf ewigkeiten hinterher schleichen, auch
> wenn unser Gast "Messuung" nicht den Anstand hatte es zwischen seinen
> kaum vertändlichen Kauderwelsch zu erwähnen.

Na ja, ist von mir auch ein wenig egoistisch, denn so beschäftige ich 
mich wieder mal mit diesen Themen und es bleibt dann besser in der 
Erinnerung haften... :-)

mfg Ottmar

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.