TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: artgos en 06 de Abril de 2005, 04:29:00
-
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
-
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
-
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
-
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
-
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
-
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
-
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