Ich habe versucht einen Interrup per Timer 1 auszulösen der alle 500ms ausgelöst wird. Leider gelingt mir das nicht.
Welches Verhalten erwartest Du überhaupt vom Programm? Der Timer-Interrupt löscht RB2 und bewirkt damit keine Veränderung (RB2 wird an keiner anderen Stelle gesetzt).
Abgesehen davon ist mir folgendes aufgefallen:
w_copy Equ 0x2E ; w_copy liegt in Bank0, muß aber unbanked sein (0x70 - 0x7F).
; denn
;W Retten
movwf w_copy ; Sicherung kann fehlschlagen, da RAM-Bank zu diesem Zeitpunkt
; unbekannt ist
intvec
bcf INTCON, GIE ; unnötig, beim Einsprung in die ISR werden weitere Interrupts
; automatisch deaktivert
; Interrupt Flag löschen
bsf INTCON, GIE ; GIE darf niemals in der ISR gesetzt werden, das
; geschieht automatisch durch retfie
; PCLATH Retten
movf pc_copy,1 ; darf nicht nach dem Retten von STATUS stehen, denn
; movf verändert das Z-Flag im Status-Register
; abgesehen davon ist hier die ausgewählte Bank
; unbekannt (STATUS vorher wiederhergestellt!)
btfsc PIR1,TMR1IF ; Das Interrupt-Flag wird in der ISR zurückgesetzt und ein
bsf PORTB,5 ; gesetztes Flag bewirkt den Sprung in die ISR
; Abfrage in main kann daher nicht funktionieren
Außerdem ist an mehreren Stellen die "1" falsch (deshalb immer "W" oder "F" verwenden):
swapf STATUS,1 ; Status nach W kopieren
movf PCLATH,1
movf pc_copy,1
Alle Befehle schreiben in das File-Register selbst, nicht in W.
Viele Grüße
Bernd