hola , gracias de nuevo ,si la parte de la interrupcion del teclado la copie de donde dices me he revisado bien el foro jaja, ya la cosa va mejorando , hice caso a todo lo que me dijiste , lo unico decir que lo de:
movlw .208 ;precargamos el contador1 (48 ciclos=220ms)
movwf Contador1 ;iniciamos a 208
esta tambien definico al inicio , y el proposito de que este tambien aqui es que cuando el contador1 llege a 0 se vuelva a iniciar en 208
he cambiado la disposicion de todos mis puertos , en la imagen se ve bien y ahora en mplab la simulacion va perfecta , lo de proteus ...ya nose si hacerle caso o no..porque la primera vez que lo monte funcionaba "mas o menos" el teclado y el display pero de repente dejo de hacerlo..voy a dejar de fiarme del proteus..
Bien ahora solo me queda lo que cite anteriormente en el otro mensaje , una entrada analogica de seguridad que pare el funcionamiento, mi idea por lo que he visto es que pondre como referencia 5v y esos equivaldran a 500v de mi laser , es decir si la entrada analogica llega a 5v que produzca un paron..lo veis dificil de hacer?? si teneis alguan idea..pues lo dicho un saludoo
codigo co nals nuevas modificanciones:
;****Encabezado****
LIST P=16F887
INCLUDE P16F887.INC
;El reset se hace mediante el pin MCLR hay que activarlo en la configuracion MCLR_ON
;__CONFIG _INTOSC & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOR_OFF & _IESO_ON & _FCMEN_ON & _LVP_ON
__CONFIG _CONFIG1, _INTOSCIO & _WDT_OFF & _PWRTE_OFF & _MCLRE_ON & _CP_OFF & _CPD_OFF & _BOREN_ON & _IESO_OFF & _FCMEN_OFF & _LVP_OFF & _DEBUG_OFF
__CONFIG _CONFIG2, _BOR40V & _WRT_OFF
;**** Definicion de variables ****
Usuario equ 0x30 ;preseleccion de potencia
Contador equ 0x31 ;Contador para detectar 256 periodos de onda
Contador1 equ 0x32 ;contador para contar 48 desbordes de contador (220ms)
Contador2 equ 0x33 ;contador para el reposo( seleccion de potencia)
NTecla equ 0x34 ;numero de tecla presionada
LED_rojo equ 4 ;define el bit de un registro (parado)
LED_verde equ 3 ;bit de un registro (funcionamiento)
W_Temp equ 0x20 ;Registro para guardar temporalmente W.-
STATUS_Temp equ 0x21 ;Registro para guardar temporalmente STATUS
PORTC_Temp equ 0x22 ;registro temporal de puerto c(MIENTRAS SE PRODUCE LA INT POR TECLAD
;**** Inicio del Micro ****
org 0x00
goto INICIO
;**** Vector de Interrupcion ****
org 0x04 ; Atiendo Interrupcion.-
goto Inicio_ISR
;**** Programa Principal ****
;**** Configuracion de puertos ***
org 0x05 ; Origen del código de programa.-
INICIO ;sabemos que PR2 se inicia a 256
banksel ANSEL ;banco 3
clrf ANSEL ;todos digitales i/o
clrf ANSELH
bcf STATUS,6
bsf STATUS,5 ;elegimos banco 1
movlw b'00000000' ;puerto A salidas
movwf TRISA
movlw b'11110000' ;puerto B teclado
movwf TRISB
movlw b'11100000' ;puerto C 1=pulsadores 0=salida
movwf TRISC
movlw b'00000000' ;puerto D como salidas display
movwf TRISD
movlw b'00000000' ;resistencias pull up puerto B activadas
movwf OPTION_REG ;es decir entradas reposo=1
movlw b'10001000' ;habilitamos GIE INTE RBIE
movwf INTCON
movlw b'11110000' ;habilitamos interrupciones puerto B
movwf IOCB
bcf STATUS,5 ;elegimos banco 0
bcf STATUS,6
clrf PORTA
clrf PORTB
movlw b'00010000' ;prendemos led rojo
movwf PORTC
movlw b'00111111' ;ponemos dislpay a 0
movwf PORTD
clrf Contador ;iniciamos a 0 contador
clrf NTecla ;borramos nº de tecla
movlw .208 ;precargamos el contador1 (48 ciclos=220ms)
movwf Contador1 ;iniciamos a 208
EMPIEZA btfss PORTC,7 ;se pulso INICIO? salta si 1 pulsador reposo=0
;al pulsarlo entrada=1 ------>salta
goto EMPIEZA ;NO, esperamos
bcf PORTC,LED_rojo ;SI, rojo=off
bsf PORTC,LED_verde ;verde=on
;**** Bucle ****
DOS_ONDAS
bsf PORTC,1 ;señal del mos0 en alta (5v)
bcf PORTC,2 ;señal del mos1 en baja (0v)
;****retardo de 6us y chequeo del pulsador de PARO***
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
bcf PORTC,1 ;señal del mos0 en baja (0v)
bcf PORTC,2 ;señal del mos1 en baja (0v)
;****retardo de 6us y chequeo del pulsador de PARO***
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
bcf PORTC,1 ;señal del mos0 en baja (0v)
bsf PORTC,2 ;señal del mos1 en alta (5v)
;****retardo de 6us y chequeo del pulsador de PARO***
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
bcf PORTC,1 ;señal del mos0 en baja (0v)
bcf PORTC,2 ;señal del mos1 en baja (0v)
;****retardo de 6us y chequeo del pulsador de PARO***
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
btfsc PORTC,6 ;chequeamos si se pulso RB0
goto PARAR ; si esta a 1 hay que parar
incfsz Contador,1 ;incrementamos contador salto si 0
goto DOS_ONDAS ;bucle
incfsz Contador1,1 ;incrementamos contador1 hasta 48 salto si 0
goto DOS_ONDAS ;reiniciamos si es menor de 48
;se han cumplido los 220ms (contador1=48)
movlw .208 ;precargamos el contador1 (48 ciclos)
movwf Contador1 ;iniciamos a 208
bsf PORTC,0 ;Si,(5v)señal laser
bcf PORTC,1 ;señal del mos0 en baja (0v)
bcf PORTC,2 ;señal del mos1 en baja (0v)
SELECPOT movf Usuario,0 ; USUARIO---->W se han producido X desbordes?
subwf Contador2,0 ; contador-X ------>contador
btfss STATUS,Z ;Z=0? salto si 1 Z=1 si contador=Usuario
goto Actualizo_TMR2 ;No,Actualizo TMR2 y reinicio bucle
clrf Contador2 ;Si,limpiamos contador2
bcf PORTC,0 ;limpiamos la señal laser
goto DOS_ONDAS ;termina el paron y continuamos
Actualizo_TMR2
movlw b'01111111' ;habilitamos el TMR2 y escalamos
movwf T2CON ;predivisor 1:16 postdivisor 1:16 en el TMR2
movlw 0x00 ;movemos a w cero
movwf TMR2 ;cargamos el temporizador tmr2=0
bcf PIR1,1 ;borramos la bandera TMR2IF
REPOSO btfss PIR1,1 ;saltamos si 1 = overflow
goto REPOSO ;no=bucle
incf Contador2,1 ;incrementamos el contador2
goto SELECPOT ;volvemos a comparar contador2
;**** Subrrutina PARAR ****
PARAR
movlw b'00010000' ;salidas =0 LED_rojo=on
movwf PORTC
REINICIO btfss PORTC,5 ;sepulso REINICIO?? salta si 1 , entradas reposo=1
;luego pulsador en reposo =0 al presionarle=1
goto REINICIO ;NO, bucle
movlw b'00001000' ;salidas =0 LED_verde=on
movwf PORTC
goto DOS_ONDAS ;volvemos a DOS_ONDAS
;**** Subrrutina nº tecla seleccionada ****
;Configuraremos RB0 a RB3 como salida y
;las colocaremos a nivel bajo. RB4 y RB7 configuradas como entradas,
;y en estado normal (sin presión de teclas) estarán a nivel alto.
;RBPU=0 de OPTION_REG
;conectamos tambien las entradas a RB4:RB6 para detectar que se toca la tecla
Tecla_Presionada
clrf NTecla ; Borra Numero de Tecla y
incf NTecla,1 ; prepara NTecla para primer codigo.
movlw b'00001110' ; Saca 0 a la primera fila
movwf PORTB ; de la Puerta B
nop ; Para estabilizacion de señal.
Test_Columnas
btfss PORTB,4 ; Primera columna = 0
goto Suelta_tecla ; Sale si se ha pulsado tecla.
incf NTecla,1 ; Si no tecla pulsada, incrementa nº tecla.
btfss PORTB,5 ; Segunda columna = 0
goto Suelta_tecla ; Sale si se ha pulsado tecla.
incf NTecla,1 ; Si no tecla pulsada, incrementa nº tecla.
btfss PORTB,6 ; Tercera columna = 0
goto Suelta_tecla ; Sale si se ha pulsado tecla.
incf NTecla,1 ; Si no tecla pulsada, incrementa nº tecla.
; En este caso se Usa teclado 3x4.-
; btfss PORTB,7 ; Cuarta columna = 0
; goto Suelta_tecla ; Sale si se ha pulsado tecla.
; incf NTecla,1 ; Si no tecla pulsada,incrementa nº Tecla.
Ultima_tecla
btfss PORTB,3 ; Ya se revisaron todas las filas?
goto Null_tecla ; Si, Falsa alarma, no se ha presionado ninguna.-
bsf STATUS,C ; No, seguimos con la siguiente.Pone a 1 Bit C
rlf PORTB,1 ; asi la Fila 1 pasa a 1 con la rotaci¢n a izqda.
goto Test_Columnas
Null_tecla
clrf NTecla ; Coloca variable Tecla a 0 (Ninguna)
bcf INTCON,RBIF ; Borramos bandera de Interrupcion.-
clrf PORTB ; Dejamos Puerto para recibir otra tecla.-
return ; y regresa.
Suelta_tecla
; Ahora se espera a que la tecla sea soltada para evitar rebotes
; y reactivaciones de tecla
Espera1
btfss PORTB,4 ; Si no se suelta la tecla FILA 1
goto Espera1 ; vuelve a esperar.
Espera2
btfss PORTB,5 ; Si no se suelta la tecla FILA 2
goto Espera2 ; vuelve a esperar.
Espera3
btfss PORTB,6 ; Si no se suelta la tecla FILA 3
goto Espera3 ; vuelve a esperar.
Espera4
btfss PORTB,7 ; Si no se suelta la tecla FILA 4
goto Espera4 ; vuelve a esperar.
bcf INTCON,RBIF ; Borramos bandera de Interrupcion.-
clrf PORTB ; Dejamos Puerto para recibir otra tecla.-
return ; vuelve al programa principal que hizo la llamada.
;**** Tabla preseleccion de potencia ****
TABLAPOTENCIA
addwf PCL,f
retlw .0 ;(0)
retlw .0 ;650w (1)
retlw .2 ;500w (2)
retlw .4 ;400w (3)
retlw .8 ;300w (4)
retlw .15 ;200w (5)
retlw .37 ;100w (6)
retlw .255 ;7 tecla no reconocida(256)carga un valor alto
;,poca potencia , por seguridad
retlw .255 ;8 tecla no reconocida
retlw .255 ;9 tecla no reconocida
retlw .255 ;10 tecla no reconocida
retlw .255 ;11 tecla no reconocida
retlw .255 ;12 tecla no reconocida
;**** Tabla display catodo comun ****
BCD7SEG:
addwf PCL,1
retlw b'00111111' ; 0
retlw b'00000110' ; 1
retlw b'01011011' ; 2
retlw b'01001111' ; 3
retlw b'01100110' ; 4
retlw b'01101101' ; 5
retlw b'01111101' ; 6
retlw b'01111001' ; E ,7 Error
retlw b'01111001' ; E ,8 Error
retlw b'01111001' ; E ,9 Error
retlw b'01111001' ; E ,10 Error
retlw b'01111001' ; E ,11 Error
retlw b'01111001' ; E ,12 Error
;**** Rutina de servicio de Interrupcion ****
;**** Interrupcion por RB4:RB7 y RB0/INT ****
;---> Aqui haremos copia de respaldo - Guardado de registro W y STATUS.-
Inicio_ISR
movwf W_Temp ; Copiamos W a un registro Temporario.-
swapf STATUS, W ;Invertimos los nibles del registro STATUS.-
movwf STATUS_Temp ; Guardamos STATUS en un registro temporal.-
movf PORTC,0 ;puertoB---->W
movwf PORTC_Temp ;guardamos puertob
movlw b'00001000'
movwf PORTC ;mientras se produce la interrupcion mos = 0
ISR
bcf INTCON,GIE ;deshabilitamos las interrupciones
btfss INTCON,RBIF ;RBIF=1?(RB4;RB7)
goto Fin_ISR
;**** Introducimos potencia deseada por teclado Matricial ****
TECLADO call Tecla_Presionada; Se detecta que tecla fue presionada
movfw NTecla ;cargamos en W el nº de tecla presionada
call TABLAPOTENCIA ;pedimos a la tabla que nos devuelva valor
movwf Usuario ;cargamos la potencia desada en nuesto registro
movfw NTecla ;volvemos a cargar el valor de NTecla en W
call BCD7SEG ;decodificador 7 seg
movwf PORTD ; Mostarmos en diplay tecla Presionada.-
bcf INTCON,RBIF ;limpiamos flag y salimos
; Restauramos los valores de W y STATUS.-
Fin_ISR
movf PORTC_Temp,0
movwf PORTC
swapf STATUS_Temp,W ; Invertimos lo nibles de STATUS_Temp.-
movwf STATUS
swapf W_Temp, f ; Invertimos los nibles y lo guardamos en el mismo registro.-
swapf W_Temp,W ; Invertimos los nibles nuevamente y lo guardamos en W.-
bsf INTCON,GIE ;habilitamos las interrupciones
retfie ; Salimos de interrupción.
end