Autor Tema: cuando vuelvo de una interrupcion me reseta los registros. ayuda  (Leído 2299 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado artgos

  • PIC10
  • *
  • Mensajes: 20


Hola a todos:

Estoy trabajando con un 16f870, bien, hos explico:

Controlo un teclado matricial, vale cuando detecto la pulsacion guardo el dato en una variable, el objetivo es despues ir comprobando si ese digito esta en una tabla (ya sabeis mediante dos bucles, el que te situa y el que cuenta las veces), bien pues segun sale de la interrupcion de leer el teclado, me resetea los contadores, por lo que es como si siempre pulsara por 1º vez.

El unico valor que respeta es el de la variable donde guarde la pulsacion.

Si para ayudarme necesitais el codigo decirlo y lo comento para que lo entendais (soy un poco guarro)

Un saludo y muchas gracias

Desconectado fenix_jn

  • PIC18
  • ****
  • Mensajes: 418
RE: cuando vuelvo de una interrupcion me reseta los registros. ayuda
« Respuesta #1 en: 06 de Abril de 2005, 12:00:00 »
Pues si, el codigo es necesario para ver lo q sucede, por ahora asegurate que no estes reutilizando los registros de cuenta dentro de la rutina de interrupcion,  bien sea por uso del IND0 o por un registro renombrado 2 veces usando la misma posicion de memoria.

Recuerda que ni el registro W ni el registro de estado se guardan durant la interrupcion, solo el valor del PCL

Desconectado artgos

  • PIC10
  • *
  • Mensajes: 20
RE: cuando vuelvo de una interrupcion me reseta los registros. ayuda
« Respuesta #2 en: 20 de Abril de 2005, 06:52:00 »
Hola a todos:

Perdon por haber tardado tanto en coilgar el codigo (y eso que la duda es mia), pero
por trabajo tube que salir

Haber os esplico como va esto

pretengo coger una dato por un teclado matricial (facil)

despues visualizarlo en dos displays (realmente esto es para ver que en funciona en el proteus,facil)

lo dificil:

A la hora del direccionamiento indirecto (para luego comparar los datos metidos en diferentes registros consecutivos con una tabla en la que tengo la contraseña y validar o no) incremento el fsr, bien lo hace, pero cuando vuelve de la rutina me reinicializa, por lo tanto es como si no lo hubiera incrementado, por lo tanto me machaca el dato con el siguiente.

Bueno muchas gracias por la ayuda y perdon por el tocho.

Por cierto de este codigo se puede tomar cualquier parte del codigo (realmente solo ayuda a quien tenga problemas con los teclados matriciales y la cpnfiguracion del tmr 0 para los retardos, pero bueno yo lo cedo)

Un saludo

PDT adjunto el esqeuma en proteus y el .hex

Desconectado artgos

  • PIC10
  • *
  • Mensajes: 20
RE: cuando vuelvo de una interrupcion me reseta los registros. ayuda
« Respuesta #3 en: 20 de Abril de 2005, 06:54:00 »

No me deja adjuntar todo eso

hos copio el asm:



;   Declaracion de micro
;-------------------------------------------------------------
   list P=16f870
   include "P16f870.inc"

;   Declaracion de vectores, inicio e interrupcion   
;-------------------------------------------------------------

   org 0x00
   goto inicio
   org 0x04
   goto interrupcion
   org 0x05

;   Configuracion del pic
;---------------------------------------------------------------

inicio
      
   bsf STATUS,RP0
   clrf TRISC
   movlw b"00000110"
   movwf ADCON1
   clrf TRISA
   movlw b"11111111"
   movwf TRISB
   movlw b"10010111"
   movwf OPTION_REG
   

;   Configuracion de vector de interrupcion para interrupcion RB4-7 y RB0   
;------------------------------------------------------------------------------

   
   movlw b"00011000"
   movwf INTCON
   bcf STATUS,RP0
   movlw 0x39
   movwf FSR
   clrf PORTA
   clrf PORTB
   clrf PORTC

;   rutina principal
;-------------------------------------------------------------------

   contador   equ 0x20
   contador2   equ 0x21
   alarma       equ 0x22
   alarma2      equ 0x23
   dani      equ 0x24
   tabla      equ 0x25
   tabla2      equ 0x26
   flag      equ 0x38
   variable1   equ 0x39
   variable2   equ 0x3a
   variable3   equ 0x3b
   bsf INTCON,GIE
taqui   clrf tabla2
   movlw d"4"
   movwf tabla
   clrf flag
      
aqui   btfsc flag,0
   goto comprobar
   movlw d"3"
   movwf contador
   clrf contador2
alli   movfw contador2
   call cuenta
   movwf PORTA
talla   incf contador2
   decfsz contador
   goto alli
   goto aqui




;   tabla de salidas
;-------------------------------------------------------------------

cuenta:
   addwf PCL,F
   retlw   b"00000001"
   retlw    b"00000010"
   retlw    b"00000100"
   return

;      inicio de codigo de interrupcion
;-------------------------------------------------------------------

interrupcion
   bcf INTCON,GIE
   
   
   
;   Rutina de visualizacion de tecla   
;-------------------------------------------------------------------


fila1   btfss PORTB,4
   goto fila2
   call delay
   btfss PORTB,4
   retfie
   btfss PORTA,0
   goto columna2
   movlw d"1"
   movwf PORTC
   movwf dani
   call indirecto
   call delay2
   call delay2
   call delay2
   clrf PORTC
   bsf flag,0
   bcf INTCON,RBIF
   retfie
columna2
   btfss PORTA,1
   goto columna3
   movlw d"2"
   movwf PORTC
   movwf dani
   call indirecto
   call delay2
   call delay2
   call delay2
   clrf PORTC
   bcf INTCON,RBIF
   retfie
columna3
   
   movlw d"3"
   movwf PORTC
   movwf dani
   call indirecto
   call delay2
   call delay2
   call delay2
   clrf PORTC
   bcf INTCON,RBIF
   retfie
fila2   
   btfss PORTB,5
   goto fila3
   call delay
   btfss PORTB,5
   retfie
   btfss PORTA,0
   goto columna2b
   movlw d"4"
   movwf PORTC
   movwf dani
   call indirecto
   call delay2
   call delay2
   call delay2
   clrf PORTC
   bcf INTCON,RBIF
   retfie
columna2b
   btfss PORTA,1
   goto columna3b
   movlw d"5"
   movwf PORTC
   movwf dani
   call indirecto
   call delay2
   call delay2
   call delay2
   clrf PORTC
   bcf INTCON,RBIF
   retfie
columna3b
   
   movlw d"6"
   movwf PORTC
   movwf dani
   call indirecto
   call delay2
   call delay2
   call delay2
   clrf PORTC
   bcf INTCON,RBIF
   retfie
fila3   

   btfss PORTB,6
   goto fila4
   call delay
   btfss PORTB,6
   retfie
   btfss PORTA,0
   goto columna2c
   movlw d"7"
   movwf PORTC
   movwf dani
   call indirecto
   call delay2
   call delay2
   call delay2
   clrf PORTC
   bcf INTCON,RBIF
   retfie
columna2c
   btfss PORTA,1
   goto columna3c
   movlw d"8"
   movwf PORTC
   movwf dani
   call indirecto
   call delay2
   call delay2
   call delay2
   clrf PORTC
   bcf INTCON,RBIF
   retfie
columna3c
   
   movlw d"9"
   movwf PORTC
   movwf dani
   call indirecto
   call delay2
   call delay2
   call delay2
   clrf PORTC
   bcf INTCON,RBIF
   retfie

fila4
   clrf PORTC
   call delay2
   call delay2
   call delay2
   clrf PORTC
   bcf INTCON,RBIF
   retfie

;   rutina de almacenaje del dato por direccionamiento indirecto
;----------------------------------------------------------

indirecto

   movwf INDF
   incf FSR
   return


;      rutina de retardo
;-------------------------------------------------------------------
delay:
   
   movlw d"100"
   movwf contador
   bcf INTCON,T0IF
   movlw d"100"
   movwf TMR0   
delay1
   btfss INTCON,T0IF
   goto delay1
   decfsz contador
   return
   goto delay

delay2:
   
   bcf INTCON,T0IF
   movlw d"1"
   movwf TMR0
   movlw 0xff
   movwf alarma
retar   movlw 0xff
   movwf alarma2
retardo
   btfss INTCON,T0IF
   goto retardo
   decfsz alarma2
   goto retardo
   decfsz alarma
   goto retar

   end

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
RE: cuando vuelvo de una interrupcion me reseta los registros. ayuda
« Respuesta #4 en: 20 de Abril de 2005, 19:56:00 »
Hola, una duda, no se si copiaste y pegaste el codigo tal cual... pero

; Configuracion de vector de interrupcion para interrupcion RB4-7 y RB0
;------------------------------------------------------------------------------


movlw b"00011000"
movwf INTCON
bcf STATUS,RP0
movlw 0x39
movwf FSR
clrf PORTA
clrf PORTB
clrf PORTC

; rutina principal
;-------------------------------------------------------------------

contador equ 0x20
contador2 equ 0x21
alarma equ 0x22
alarma2 equ 0x23
dani equ 0x24
tabla equ 0x25
tabla2 equ 0x26

le faltan las etiquetas... y si el codigo esta completo, luego de la interrupcion, no tiene return... es decir continua con el codigo y asigna nuevamente las variables....


creo que esa es la falla...

Norberto

Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado fenix_jn

  • PIC18
  • ****
  • Mensajes: 418
RE: cuando vuelvo de una interrupcion me reseta los registros. ayuda
« Respuesta #5 en: 20 de Abril de 2005, 23:34:00 »
he notado q haces uso de las siguientes instrucciones dentro de la rutina de interrupciones:

bcf intcon, gie

No es necesario, cuando la rutina de interrupcion es atendida, el bit GIE es deshabilitado automaticamente por el PIC.

interrupcion
....
...
...
bcf intcon, rbif

Si notas q tu codigo se keda atascado en la rutina de interrupcion lo primero q debes hacer es deshabilitar el flag q causa la interrupcion (RBIF) lo ideal seria q fuera como sigue:

interrupcion
bcf intcon, rbif
...
...
retfie

aunq tu codigo ysa el retfie al salir de la rutina lo mejor es q lo pongas inmediatamente

Desconectado artgos

  • PIC10
  • *
  • Mensajes: 20
RE: cuando vuelvo de una interrupcion me reseta los registros. ayuda
« Respuesta #6 en: 21 de Abril de 2005, 07:50:00 »

Hola a todos:

Muchas gracias por la ayuda, haber enconter el error (o por lo menos ya hace algo mas).

El error estaba en la parte del codigo de "delay2".

Bien, lo pongo y eso empieza a correr, pero lo malo que cuando a la parte del direccionamiento indirecto, incremento el FSR, y es como si entrara en un bucle
y no deja de aumentar sin hacer caso al codigo
me estoy volviendo mico

Muchas gracias




 

anything