Autor Tema: 16F874 y PORTE  (Leído 3609 veces)

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

Desconectado catk

  • PIC10
  • *
  • Mensajes: 13
16F874 y PORTE
« en: 15 de Mayo de 2007, 17:04:50 »
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.

Código: [Seleccionar]
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.

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: 16F874 y PORTE
« Respuesta #1 en: 03 de Junio de 2007, 03:21:03 »
Código: ASM
  1. movlw   b'00001111'     ;seleccion tipo puertos A/D
  2.                 movwf   ADCON1
  3.                 movlw   b'11111111'
  4.                 movwf   TRISA           ;PORTA como entrada
  5.                 bcf     STATUS,RP0      ;Banco 0
  6.                 movlw   b'00000001'     ;seleccion Tad, canales para
  7.                 movwf   ADCON0          ;conversion y A/D=ON

Viendo tu configuración has seteado el

AN0 = Analogico
AN1 = Digital
AN2 = Vref-
AN3 = Vref+

El resto digitales.

Seria bueno que aclares en qué pines analógicos quieres sensar.

PD: además te recomiendo que setees el TRISE para cerciorarte de que se apague el PSP.
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)


 

anything