Hola a todos.
Les cuento, estoy armando un sensor de temperatura pero necesito ademas tener 3 puertos de entrada y 3 mas de salida, los de salida no son problema porque tengo PORTD como salida y tengo los 3 pines libres, pero la entrada no he podido.
PORTA son entradas analogas para 4 sensores, y la opcion que veo es habilitar PORTE como entradas digitales pero no lo he logrado, no me ha sido posible.
Les adjunto el codigo y gracias por la ayudita que me puedan par.
processor 16F874
LIST P=16F874 ;Se indica el modo de procesador
INCLUDE <P16f874.inc> ;se incluye la definicion de los
;registros internos
__config 3D31
PDel0 EQU 0x21
PDel1 EQU 0x22
PDel2 EQU 0x23
BUFFER EQU 0x24
DATO_A EQU 0x25
DATO_B EQU 0x26
Digito EQU 0x27
INNER EQU 0x28
OUTER EQU 0x29
cnt_bit EQU 0x2A
ASCII_H EQU 0x2B
ASCII_M EQU 0x2C
ASCII_L EQU 0x2D
HEXADECIMAL EQU 0x2E
buffe EQU 0x7B
buffe1 EQU 0x7B
Canal EQU 0x2F
;----------------------------------------------------------------------------
org 0x00 ;vector de inicio
goto INICIO
org 0x05 ;despues del vector de interrupcion
;<<<<<<----------------- INICIO PROGRAMA PRINCIPAL ------------------->>>>>>>
;----------------------------------------------------------------------------
INICIO bcf STATUS,RP0 ;banco 0
bcf STATUS,RP1
clrf PORTA
bsf STATUS,RP0 ;banco 1
clrf TRISB ;portb como salida
clrf TRISC
clrf TRISD
bcf STATUS,RP0 ;banco 0
clrf PORTA
clrf PORTB
clrf PORTC
clrf PORTD
clrf PORTE
;''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
START CALL LCD_INI ;Inicia LCD (CFG puertos...)
START_1 MOVLW b'00000001' ;Borrar LCD y Home
CALL LCD_REG
MOVLW b'00000110' ;
CALL LCD_REG
MOVLW b'00001100' ;LCD On, cursor Off,Parpadeo Off
CALL LCD_REG
MOVLW 0x80 ;Direccion caracter
CALL LCD_REG
REPETIR ;MOVF Digito,w ;W=Digito
;CALL DATO_1 ;Coge el caracter
;IORLW 0x00 ;Compara
;BTFSC STATUS,2 ;Es el ultimo?
;GOTO acabar ;Si
;CALL LCD_DATOS ;Visualiza caracter
;INCF Digito,f ;Incrementa numero de Digito
;GOTO REPETIR ;Vuelve a escribir
;
acabar ;termino inicializacion de lcd y muestra primeros datos
;===========================================================================
; Inicio de conversion de valores analogicos
;===========================================================================
;---------------------Configuracion CONVERTIDOR A/D-------------------------
CFGADC bsf STATUS,RP0 ;Banco 1
bcf STATUS,RP1
movlw b'00001111' ;seleccion tipo puertos A/D
movwf ADCON1
movlw b'11111111'
movwf TRISA ;PORTA como entrada
bcf STATUS,RP0 ;Banco 0
movlw b'00000001' ;seleccion Tad, canales para
movwf ADCON0 ;conversion y A/D=ON
bcf PIR1,ADIF ;limpia flag de conversion completa
; FIN de configuracion de registros
;---------------------------------------------------------------------------
lecturas
movlw d'0' ;selecciona canal ADC
movwf Canal
call RUN_ADC
movf ADRESH,W ;Parametros de encendido de luces
movwf buffe
bcf STATUS,0
sublw d'110' ;200 para fotocelda
btfsc STATUS,0
bsf PORTD,0
movlw d'100'
call delay
bcf STATUS,0 ;Parametros de apagado de luces
movlw d'200' ;230 para fotocelda
subwf buffe,0
btfsc STATUS,0
bcf PORTD,0
movf buffe,0
movlw 0x80 ;pone cursor en 80------------------
call LCD_REG
movlw 'L'
call LCD_DATOS ;Visualiza caracter
movlw '1'
call LCD_DATOS ;Visualiza caracter
movlw '='
call LCD_DATOS ;Visualiza caracter
call inLCD ;visualiza dato---------------------
movlw ' ' ;º
call LCD_DATOS ;Visualiza caracter
movlw 0x20 ;" "
call LCD_DATOS ;Visualiza caracter
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'5'
call delay
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'1' ;selecciona canal ADC
movwf Canal
call RUN_ADC
movf buffe,0
movlw 0x88 ;pone cursor en 80------------------
call LCD_REG
movlw 'L'
call LCD_DATOS ;Visualiza caracter
movlw '2'
call LCD_DATOS ;Visualiza caracter
movlw '='
call LCD_DATOS ;Visualiza caracter
;
call inLCD ;visualiza dato---------------------
movf ADRESH,W ;Parametros de encendido de luces
movwf buffe
bcf STATUS,0
sublw d'10' ;200 para fotocelda
btfsc STATUS,0
bsf PORTD,1
movlw d'100'
call delay
bcf STATUS,0 ;Parametros de apagado de luces
movlw d'250' ;230 para fotocelda
subwf buffe,0
btfsc STATUS,0
bcf PORTD,1
movf buffe,0
; movlw ' ' ;º
; call LCD_DATOS ;Visualiza caracter
; movlw 0x20 ;" "
; call LCD_DATOS ;Visualiza caracter
; ;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; movlw d'5'
; call delay
; ;;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; movlw d'2' ;selecciona canal ADC
; movwf Canal
; call RUN_ADC
;
; movlw 0xC0 ;pone cursor en 80------------------
; call LCD_REG
; movlw 'L'
; call LCD_DATOS ;Visualiza caracter
; movlw '3'
; call LCD_DATOS ;Visualiza caracter
; movlw '='
; call LCD_DATOS ;Visualiza caracter
;
; call inLCD ;visualiza dato---------------------
; movlw ' ' ;º
; call LCD_DATOS ;Visualiza caracter
; movlw 0x20 ;" "
; call LCD_DATOS ;Visualiza caracter
; ;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
; movlw d'5'
; call delay
; ;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'4' ;selecciona canal ADC
movwf Canal
call RUN_ADC
movlw 0xC0 ;pone cursor en 80------------------
call LCD_REG
movlw 'T'
call LCD_DATOS ;Visualiza caracter
movlw 'E'
call LCD_DATOS ;Visualiza caracter
movlw 'I'
call LCD_DATOS ;Visualiza caracter
movlw 'K'
call LCD_DATOS ;Visualiza caracter
movlw 'O'
call LCD_DATOS ;Visualiza caracter
movlw ' '
call LCD_DATOS ;Visualiza caracter
movlw 'S'
call LCD_DATOS ;Visualiza caracter
movlw '.'
call LCD_DATOS ;Visualiza caracter
movlw 'A'
call LCD_DATOS ;Visualiza caracter
movlw 0xC8 ;pone cursor en 80------------------
call LCD_REG
;movlw 'T'
;call LCD_DATOS ;Visualiza caracter
;movlw '4'
;call LCD_DATOS ;Visualiza caracter
;movlw '='
;call LCD_DATOS ;Visualiza caracter
;call inLCD ;visualiza dato---------------------
;movlw 0xDF ;º
;call LCD_DATOS ;Visualiza caracter
;movlw 0x20 ;" "
;call LCD_DATOS ;Visualiza caracter
;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
movlw d'100'
call delay
;;'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
goto lecturas
;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////
;---------------------------------------------------------------------------
RUN_ADC bcf STATUS,RP0 ;Banco 0
bcf STATUS,RP1 ;Banco 0
movlw b'01000001' ;repone a cero para que iorlw pueda
movwf ADCON0
;bcf ADCON0,ADON ;apaga el convertidor
rlf Canal,F ;posiciona los bits
rlf Canal,F
rlf Canal,W
iorwf ADCON0,F
;bsf ADCON0,ADON ;enciende el convertidor
rrf Canal,F
rrf Canal,F ;retorna a la anterior
bcf PIR1,ADIF ;limpia flag de conversion completa
nop
nop
GO_ADC bsf ADCON0,GO_DONE ;Inicio conversion
wait_ADC btfsc ADCON0,GO_DONE ;espera a que finalice la conversion
goto wait_ADC ;bucle
READ_OK ;La conversion esta en ADRESH:ADRESL
return
;mostrar en lcd!************************************************************
inLCD movf ADRESH,W
call Hex_Ascii
bcf STATUS,RP0 ;banco 0
bcf STATUS,RP1
bcf STATUS,Z
movf ASCII_H,W ;sobreescribe el dato distancia
xorlw 0x30 ;Comprueba si es cero a la izquierda
btfsc STATUS,Z
goto cero_izquierda
movf ASCII_H,W
CALL LCD_DATOS ;Visualiza caracter
cero_izquierda movf ASCII_M,W
;iorlw 0x00 ;Comprueba si es cero a la izquierda
;btfss STATUS,Z
CALL LCD_DATOS ;Visualiza caracter
movf ASCII_L,W
CALL LCD_DATOS ;Visualiza caracter
call DELAY_5MS
call DELAY_5MS
return
;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////
;///////////////////////////////////////////////////////////////////////////
;#########################################################RUTINAS DE LCD####
LCD_E BSF PORTC,2 ;Activa señal E
NOP
NOP
NOP ;Espera 1uS
BCF PORTC,2 ;Desactiva señal E
RETURN
LCD_BUSY BSF PORTC,1 ;Pone el LCD en modo lectura
BSF STATUS,RP0 ;Selecciona el Banco 1
MOVLW 0xFF
MOVWF TRISB ;Puerta B act£a de entrada
BCF STATUS,RP0 ;Selecciona el Banco 0
BSF PORTC,2 ;Activa el LCD (Señal E)
NOP
L_BUSY BTFSC PORTB,7 ;Chequea el bit BUSY
GOTO L_BUSY ;Est a "1" (Ocupado)
BCF PORTC,2 ;Desactiva el LCD (Se¤al E)
BSF STATUS,RP0 ;Selecciona el Banco 1
CLRF TRISB ;Puerta B actua como salida
BCF STATUS,RP0 ;Selecciona el Banco 0
BCF PORTC,1 ;Pone el LCD en modo escritura
RETURN
LCD_REG BCF PORTC,0 ;Desactiva RS (Modo instruccion)
MOVWF PORTB ;Saca el codigo de instruccion
CALL LCD_BUSY ;Espera a que se libere el LCD
GOTO LCD_E ;Genera pulso en señal E
LCD_DATOS BCF PORTC,0 ;Desactiva RS (Modo instrucci¢n)
MOVWF PORTB ;Valor ASCII a sacar por PORTB
CALL LCD_BUSY ;Espera a que se libere el LCD
BSF PORTC,0 ;Activa RS (Modo dato)
GOTO LCD_E ;Genera pulso en señal E
LCD_INI MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
MOVLW b'00111000'
CALL LCD_REG ;Codigo de instruccion
CALL DELAY_5MS ;Temporiza 5 mS.
RETURN
;****************************************************************************
;DELAY_5MS genera una temporizacion de 5mS necesario para la secuencia de
;inicio del LCD
DELAY_5MS movlw .6 ; 1 set number of repetitions (B)
movwf PDel0 ; 1 |
PLoop1 movlw .207 ; 1 set number of repetitions (A)
movwf PDel1 ; 1 |
PLoop2 nop ; 1 clear watchdog
decfsz PDel1, 1 ; 1 + (1) is the time over? (A)
goto PLoop2 ; 2 no, loop
decfsz PDel0, 1 ; 1 + (1) is the time over? (B)
goto PLoop1 ; 2 no, loop
PDelL1 goto PDelL2 ; 2 cycles delay
PDelL2 nop ; 1 cycle delay
return ; 2+2 Done
;###########################################################################
del_1ms movlw d'199' ;delay 1mS
movwf INNER
in_lp nop
nop
decfsz INNER,F
goto in_lp
return
delay movwf OUTER ;vueltas de 1mS
out_lp call del_1ms
decfsz OUTER,F
goto out_lp
return
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
Hex_Ascii ;cargar en W el dato hex.
;
;MOVLW .254
MOVWF HEXADECIMAL
clrf ASCII_H ;Para BCD D'0'
clrf ASCII_M ;Para BCD D'0'
clrf ASCII_L ;Para BCD D'0'
;
Centenas
;
movlw D'100' ;D'100' --> W
subwf HEXADECIMAL,W ;HEXADECIMAL - D'100' --> W
btfss STATUS,C ;¿ HEXADECIMAL es menor que D'100' ?
goto Decenas ;Si
movwf HEXADECIMAL ;Salva el resto
incf ASCII_H,F ;Incrementa el contador de centenas BCD
goto Centenas ;Vuelve por otros D'100'
;
Decenas
;
movlw D'10' ;D'10' --> W
subwf HEXADECIMAL,W ;HEXADECIMAL - D'10' --> W
btfss STATUS,C ;¿ HEXADECIMAL es menor que D'10' ?
goto Unidades ;Si
movwf HEXADECIMAL ;Salva el resto
incf ASCII_M,F ;Incrementa el contador de decenas BCD
goto Decenas ;Vuelve por otros D'10'
;
Unidades
;
movf HEXADECIMAL,W ;El resto pertenece
movwf ASCII_L ;a las unidades BCD
clrf HEXADECIMAL ;Pone a cero el registro HEXADECIMAL
;
Bcd_A_Ascii
;
movlw H'30' ;H'30' --> W
iorwf ASCII_L,F ;Convierte de BCD a ASCII
iorwf ASCII_M,F ;Convierte de BCD a ASCII
;
movf ASCII_H,F ;ASCII_H --> F
btfsc STATUS,Z ;? ASCII_H es D'00' ?
goto Espacio ;Si
movlw H'30' ;H'30' --> W
iorwf ASCII_H,F ;Convierte de BCD a ASCII
return ;Retorna
;
Espacio
;
movlw '0' ;A' ' --> W
movwf ASCII_H ;A' ' --> ASCII_H
;movwf ASCII_M ;A' ' --> ASCII_H
;movwf ASCII_L ;A' ' --> ASCII_H
return ;Retorna
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
;()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()()
; Description: Waits 100 cycles
;-------------------------------------------------------------
Delayp1 movlw .23 ; 1 set number of repetitions
movwf PDel0 ; 1 |
PLoop02 nop ; 1 clear watchdog
decfsz PDel0, 1 ; 1 + (1) is the time over?
goto PLoop02 ; 2 no, loop
PDelL12 goto PDelL22 ; 2 cycles delay
PDelL22 nop ; 1 cycle delay
return ; 2+2 Done
END
;************************************************* www.x-robotics.com *******
Creo que el problema esta al declarar ADCON pero ya intentado varias combinaciones y no ha sido posible.