Buenas, estos dias estoy intentando hacer un proyecto sencillo para clase con un pic16f88, lo unico que hace es comparar los valores recogidos con una LDR y encender una luz o otra en funcion de la luminosidad que perciba en cada momento.
He simulado con proteus, y todo va perfecto, compilo.. quemo el pic.. y este no responde.. no hace nada al montarlo..
incluso añadi al principio del programa un par de instruciones para que encendiese las luces durante unos segundos para probar si el fallo era de la conversion A/D, pero nada.. no funciona..
Estoy empezando a desesperarme.. no se que estare haciendo mal..
si alguien podria echarme una mano, os lo agradeceria un monton.
aqui adjunto el programa.
Gracias.
list p=16f88
#include "p16f88.inc"
__config _config1,(3f10) ;palabra de configuracion
reg1 equ 0x20
reg2 equ 0x21
reg3 equ 0x22
reg4 equ 0x23
ldrmem1 equ 0x24
ldrmem2 equ 0x25
valormax equ 0x26
valormin equ 0x27
org 0
banksel ansel ;seleccionamos bank1
movlw b'11100000'
movwf ansel ;ra0 ra1 ra2 analog las demas digital
movlw b'00000000'
movwf trisb ; puerto b salida digital entero
movwf b'11100100'
movlw trisa ;selecion de entradas
banksel porta ;volver a bank0
clrf porta ;limpiamos bancos
clrf portb ;limpiamos bancos
;movwf adcon1
bsf porta,6
bsf porta,7
bsf portb,0xff
call retardo1s
call retardo1s
clrf porta
clrf portb
inicio
clrf porta
clrf portb
movlw b'11101010' ;valor para encender luz
movwf valormax
movlw b'10000010' ;valor para encender led
movwf valormin
movfw ldrmem1 ;resta el valor fijo del valor obtenido para compararlos, si dan 0 son iguales
subwf valormax
movwf ldrmem1
btfss ldrmem1,b'11000000' ;ni puta idea de como me a funcionado.... por fin!
call encenderluz
movfw ldrmem2
subwf valormin
movwf ldrmem2
btfsc ldrmem2,0xff ;comprueva si los bits de la resta an dado 0 y por tanto son iguales, si es asi, realiza la siguiente instrucion sin saltarsela.
call encenderled
goto ldr
encenderled
bsf porta,6
return
encenderluz
bsf porta,7
return
;****ldr*** en patilla 0 habilitada por defecto
ldr
movlw 1 ;enciende el conversor a/d
movwf adcon0
call retardo767 ;llama al retardo de 767 microsegundos
rep1
bsf adcon0,2 ;inicia la conversion
pregunta
btfsc adcon0,2 ;pregunta si termino de convertir
goto pregunta ;vuelve a preguntar si no ha terminado
movf adresh,w ;pasa el resultado a la emmoria bit mas isgnificativo)
movwf ldrmem1
movwf ldrmem2
bsf status,5
bcf status,5
goto inicio ;comienza de nuevo la conversion****
retardo767 ;retardo 767 microsegundos
movlw .255
movwf reg4
rep4
decfsz reg4,f
goto rep4
return
retd ;retardo de 100 milisegundos
movlw 2
movwf reg1
rep6
movlw 84h
movwf reg2
rep2
movlw 0ffh
movwf reg3
rep7
decfsz reg3,f
goto rep7
decfsz reg1,f
goto rep6
return
retardo1s ;retardo de 1seg
movlw .10
movwf reg1
rep13
movlw .132
movwf reg2
rep12
movlw .255
movwf reg3
rep11
decfsz reg3,f
goto rep11
decfsz reg2,f
goto rep12
decfsz reg1,f
goto rep13
return
end
He simulado con proteus, y todo va perfecto, compilo.. quemo el pic.. y este no responde.. no hace nada al montarlo..
incluso añadi al principio del programa un par de instruciones para que encendiese las luces durante unos segundos para probar si el fallo era de la conversion A/D, pero nada.. no funciona..
Estoy empezando a desesperarme.. no se que estare haciendo mal..
si alguien podria echarme una mano, os lo agradeceria un monton.
aqui adjunto el programa.
Gracias.
list p=16f88
#include "p16f88.inc"
__config _config1,(3f10) ;palabra de configuracion
reg1 equ 0x20
reg2 equ 0x21
reg3 equ 0x22
reg4 equ 0x23
ldrmem1 equ 0x24
ldrmem2 equ 0x25
valormax equ 0x26
valormin equ 0x27
org 0
banksel ansel ;seleccionamos bank1
movlw b'11100000'
movwf ansel ;ra0 ra1 ra2 analog las demas digital
movlw b'00000000'
movwf trisb ; puerto b salida digital entero
movwf b'11100100'
movlw trisa ;selecion de entradas
banksel porta ;volver a bank0
clrf porta ;limpiamos bancos
clrf portb ;limpiamos bancos
;movwf adcon1
bsf porta,6
bsf porta,7
bsf portb,0xff
call retardo1s
call retardo1s
clrf porta
clrf portb
inicio
clrf porta
clrf portb
movlw b'11101010' ;valor para encender luz
movwf valormax
movlw b'10000010' ;valor para encender led
movwf valormin
movfw ldrmem1 ;resta el valor fijo del valor obtenido para compararlos, si dan 0 son iguales
subwf valormax
movwf ldrmem1
btfss ldrmem1,b'11000000' ;ni puta idea de como me a funcionado.... por fin!
call encenderluz
movfw ldrmem2
subwf valormin
movwf ldrmem2
btfsc ldrmem2,0xff ;comprueva si los bits de la resta an dado 0 y por tanto son iguales, si es asi, realiza la siguiente instrucion sin saltarsela.
call encenderled
goto ldr
encenderled
bsf porta,6
return
encenderluz
bsf porta,7
return
;****ldr*** en patilla 0 habilitada por defecto
ldr
movlw 1 ;enciende el conversor a/d
movwf adcon0
call retardo767 ;llama al retardo de 767 microsegundos
rep1
bsf adcon0,2 ;inicia la conversion
pregunta
btfsc adcon0,2 ;pregunta si termino de convertir
goto pregunta ;vuelve a preguntar si no ha terminado
movf adresh,w ;pasa el resultado a la emmoria bit mas isgnificativo)
movwf ldrmem1
movwf ldrmem2
bsf status,5
bcf status,5
goto inicio ;comienza de nuevo la conversion****
retardo767 ;retardo 767 microsegundos
movlw .255
movwf reg4
rep4
decfsz reg4,f
goto rep4
return
retd ;retardo de 100 milisegundos
movlw 2
movwf reg1
rep6
movlw 84h
movwf reg2
rep2
movlw 0ffh
movwf reg3
rep7
decfsz reg3,f
goto rep7
decfsz reg1,f
goto rep6
return
retardo1s ;retardo de 1seg
movlw .10
movwf reg1
rep13
movlw .132
movwf reg2
rep12
movlw .255
movwf reg3
rep11
decfsz reg3,f
goto rep11
decfsz reg2,f
goto rep12
decfsz reg1,f
goto rep13
return
end