PIC16F877A Puerto D no se comporta como salida

#1
Buenas, tengo un problema con la programacion de mi PIC. Estoy queriendo encender LEDs con la salida del puerto D pero no funcionan. El programa lo corri por MPLAB y anda bien, con el stimulus funciona todo ok pero a la hora de llevarlo a la placa no funciona. El circuito de la placa esta bien porque use otros puertos como salida (el puerto A) y funciona perfecto. No se si habra alguna configuracion especial para usar el puerto D como salida digital (similar a lo que pasaba con el puerto A de entrada y el registro ADCON1). No subo el programa porque es muy largo y me parece que no es necesario. Obviamente ya configure el registro TRISD como salida y todo lo normal. Es raro que funcione en el programa pero no en la placa. Desde ya agradecido por la ayuda y si quieren que suba el programa y el circuito no tengo problema. Saludos
 
#5
Este es el código.
PHP:
list        p=16f877a       ; list directive to define processor
    #include    <p16f877a.inc>  ; processor specific variable definitions
    errorlevel -302             ; Suprimimos el mensaje "not in bank 0"

    __CONFIG _CP_OFF & _WDT_OFF & _BODEN_OFF & _PWRTE_ON & _HS_OSC & _WRT_OFF & _LVP_OFF & _CPD_OFF

    cblock    0x20
        reg_h
        reg_m
        reg_l
        mcount
        ncount
        ocount
    endc

RESET_VECTOR    CODE    0x0000 ; processor reset vector
    nop                        ; nop for icd
    pagesel start
    goto    start              ; go to beginning of program

MAIN_PROG       CODE

start    org      0x010            ; POWER_ON Reset (Comienzo del programa)
         clrf   mcount          
         clrf   ncount
         clrf   ocount
         clrf   reg_h
         clrf   reg_m
         clrf   reg_l
         clrf   PORTA
         clrf   PORTB
         clrf   PORTC
         clrf    PORTD
         clrf   PORTE
         movlw  0x07
         movwf  CMCON     ; DESHABILITA COMPARADORES ANALOGICOS     

; DECLARAMOS ENTRADAS Y SALIDAS DE TODOS LOS PUERTOS

         bsf    STATUS,RP0    ; PASO A BANCO 1
         bcf    STATUS,RP1    ; 
         movlw  0x07
            movwf  ADCON1    ; ENTRADAS DIGITALES           
         movlw b'11111111'
         movwf TRISA        ; PORTA TODAS ENTRADAS
         movlw b'00000000'
         movwf TRISB         ; PORTB TODAS SALIDAS
         movlw b'00000111'
         movwf TRISC        ; PORTC MITAD ENTRADAS MITAD SALIDAS, I2C SDA SCL
         movlw b'00000011'
         movwf TRISD        ; PORTD MAYORMENTE SALIDAS
         movlw b'11111111'
         movwf TRISE        ; PORTE TODAS ENTRADAS

         bcf    STATUS,RP0    ; PASO A BANCO 0
         bsf    PORTD,4     ; ENCIENDO LED STAND BY
 
Última edición por un moderador:
#6
La inicialización básica de configuración de puertos es así:
En éste caso, la del puerto D.
PHP:
    list    p=16f877a
    include    p16f877a.inc

    __config _HS_OSC & _WDTE_OFF & _PWRTE_ON & _LVP_OFF
    errorlevel    -302

    org    0x00

inicio
    bsf        STATUS,RP0        ; Banco 1
    movlw    b'00000011'        ; Configurar RD <7:2> como salidas.
    movwf    TRISD
    bcf        STATUS,RP0        ; Banco 0
    clrf    PORTD            ; Limpiar Puerto D

programa
    bsf        PORTD,4            ; Bit 4 de Puerto D en 1
    
    goto    $                ; Bucle infinito

    end
Lo único que hará este programa, será poner en 1 el bit 4 del puerto D y los otros que se configuraron como salidas, permanecerán en 0.

Si requieres que todo un puerto funcione como entradas, no es necesario que lo configures, ya que por defecto todos los puertos al iniciar funcionan como entradas.
Tampoco es necesario que configures el registro CMCON en este PIC, si no vas a usar los comparadores análogos.
En este PIC la configuración para desactivar el conversor AD, se hace en el registro ADCON1.
Un valor de 0x06 o 0x07, hará que los puertos con ADC funcionen como digitales. Bits PCFG <3:0>
 
#7
El error está justamente en poner TRISE a b'11111111', porque el puerto E solo tiene 3 bits de entrada/salida y, lo más importante, estás poniendo el valor del bit 4 (TRISE<4>) a 1, y en ese momento estás poniendo el puerto D en modo esclavo (PSPMODE = 1).

Consulta la documentación para poner el valor correcto de TRISE o, como dice D@rkbytes, si no vas a usar el puerto E, no lo inicialices, porque el valor por defecto de PSPMODE es 0.
 
Arriba