A ver si me he enterado de algo, (de algo creo que si, pero de momento sigue sin funcionar). Primero, he cambiado por el 16F628, ya que tenía que cambiar el PORTB por el PORTA y a la larga quiería usar el 16F628 (más puertos, más salidas y más barato,...) con lo cual uso el PORTB,0 como interruptor para la interrupción.
He creado en el CP los diferentes registros que usar para guardar los datos antes de la interrupción.
CBLOCK 0x0C
Guarda_W
Guarda_Status
Guarda_Cont_A
Cont_A
ENDC
Y ahora viene el follón, he creado dos rutinas para guardar y reponer los datos antes y después de la interrupción, pero no sé donde ubicarlos en el código.
Antes de la interrupción, lo guardo todo con ...
movwf Guarda_W
swapf STATUS,W
movwf Guarda_Status
movf Cont_A,W
movwf Guarda_Cont_A
.... y antes que acabe la interrrupción lo recupero todo con ....
movf Guarda_Cont_A,W
movwf Cont_A
swapf Guarda_Status,W
movwf STATUS
swapf Guarda_W,F
swapf Guarda_W,W
BCF INTCON,INTF ; borro bandera de interrupción
RETFIE
Y por último el código completo por si alguien quiee ayudarme o echarse unas risas ...
;---------------Encabezado-------------
LIST P=16F628A
INCLUDE <P16F628A.INC>
CBLOCK 0x0C
Guarda_W
Guarda_Status
Guarda_Cont_A
Cont_A
ENDC
;-------Configuración de puertos-------
ORG 0x00
GOTO inicio
ORG 0x04
GOTO ISR
ORG 0X05
inicio
BSF STATUS,RP0 ; configurando puertos
clrf TRISA
MOVLW b'11111111'
MOVWF TRISB
BCF OPTION_REG,6 ; seleccionamos flanco descendente
BCF STATUS,RP0
;-------Habilitación de interrupciones-------
BSF INTCON,GIE ; habilitamos todas las interrupciones
BSF INTCON,INTE ; que sean interrupciones externas
CLRF PORTA ; limpio el puerto B
movlw d'1' ; Primer número por donde quieres que empiece el conteo.
movwf Cont_A ; Guarda el valor de W a F
; --------------Guardamos los registros antes de la interrupción ----------------------
movwf Guarda_W
swapf STATUS,W
movwf Guarda_Status
movf Cont_A,W
movwf Guarda_Cont_A
Pulsador
btfsc PORTB,0 ; Botón pulsado.
goto Pulsador ; si no está pulsado vuelve a Pulsador
movf Cont_A,W ; Si esta pulsado? pasa ContA a W
movwf PORTA ; muestra el resultado por PORTB.
call Retardo_500ms
clrf PORTA
goto Pulsador
;-------------Rutina de servicio de interrupciones-------------
ISR
incf Cont_A ;incrementa en 1 los segundos
movf Cont_A,W
call Retardo_500ms
; ---------------------- antes de acabar la interrupción ponemos todos los registros como antes.
movf Guarda_Cont_A,W
movwf Cont_A
swapf Guarda_Status,W
movwf STATUS
swapf Guarda_W,F
swapf Guarda_W,W
BCF INTCON,INTF ; borro bandera de interrupción
RETFIE
INCLUDE <RETARDOS.INC>
END
De momento lo del TMR0 lo tengo en cuenta (porque creo que para hacer un reloj parece más factible) pero no quiero liar más el código, primero entender esto sencillo y luego ya me liaré.
Muchas gracias KILLERJC.