Autor Tema: Problema para obtener 5V en PORTD de pic16f877  (Leído 4237 veces)

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

Desconectado inxanu

  • PIC10
  • *
  • Mensajes: 21
Problema para obtener 5V en PORTD de pic16f877
« en: 26 de Junio de 2012, 11:39:54 »
Hola a todos,

Estoy trabajando en un proyecto en el que voy a utilizar el puerto D (0,1) como salida para activar dos relés. El problema es que no consigo sacar los 5 voltios necesarios una vez que detecta la señal de activación.

La configuración del puerto es la siguiente:
Código: [Seleccionar]
BANKSEL TRISD ; Selecciona el bank1
MOVLW b'00000000' ; Configura PORTD como salida
MOVWF TRISD ; Carga el codigo DDR en F88

En el archivo adjunto incluyo la carga que soporta a la salida del puerto, la linea de alimentación es de 5V, que es la que viene de arriba de la imagen.

Un saludo y muchas gracias!

Desconectado solapower

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 209
Re: Problema para obtener 5V en PORTD de pic16f877
« Respuesta #1 en: 26 de Junio de 2012, 12:07:36 »
Podría ser porque no has configurado el PORTE para que el PORTD no se comporte como Parallel Slave Port. Fijate en el datasheet de ese pic (página 48) donde explica esta propiedad del PORTD.
Saludos

Desconectado inxanu

  • PIC10
  • *
  • Mensajes: 21
Re: Problema para obtener 5V en PORTD de pic16f877
« Respuesta #2 en: 26 de Junio de 2012, 12:30:44 »
Podría ser porque no has configurado el PORTE para que el PORTD no se comporte como Parallel Slave Port. Fijate en el datasheet de ese pic (página 48) donde explica esta propiedad del PORTD.
Saludos

He configurado el PORTE con b'00000000', donde el bit4 indica que si es 0 los puertos de D servirán para propósito general, detalle que no habia tenido en cuenta (Muchas gracias ;) ) Pero sigo teniendo el mismo problema. No logro tener 5 voltios a la salida, utilizando lo siguiente

Código: [Seleccionar]

abrir
BSF PORTD,0 ; mandamos un 1 por RD0 para abrir
GOTO espera5s ; Esperamos 5 segundos (tiempo a regular) para dejar terminar la apertura
BCF PORTD,0 ; Apagamos la señal del puerto D0
BSF estado,2 ; Actualizamos la bandera del bit de estado a abierto
RETURN

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema para obtener 5V en PORTD de pic16f877
« Respuesta #3 en: 26 de Junio de 2012, 12:33:16 »
mostranos el codigo. volviste al banco 0 ?
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado inxanu

  • PIC10
  • *
  • Mensajes: 21
Re: Problema para obtener 5V en PORTD de pic16f877
« Respuesta #4 en: 26 de Junio de 2012, 12:47:16 »
mostranos el codigo. volviste al banco 0 ?

Aquí adjunto la definición de variables (espero que estén bien hechas) y la configuracion de los puertos

Código: [Seleccionar]
PROCESSOR 16F877 ; define tipo de procesador
__CONFIG 0x3731 ; 4Mhz frecuencia de reloj, standard fuse
#include <p16F877.inc> ; Etiquetas de registro estandard

; Registra etiquetas EQU

STATUS EQU 0x03
PORTA EQU 0x05 ; Registro de datos del puerto A
PORTB EQU 0x06 ; Registro de datos del puerto B
PORTC EQU 0x07 ; Registro de datos del puerto C
PORTD EQU 0x08 ; Registro de datos del puerto D
TRISA EQU 0x85 ; Direccion del registro puerto A
TRISB EQU 0x86 ; Direccion del registro puerto B
TRISC EQU 0x87 ; Direccion del registro puerto C
TRISD EQU 0x88 ; Direccion del registro puerto D
ADCON0 EQU 0x1F
ADCON1 EQU 0x9F ;
ADRESH EQU 0x1E

TMR0 EQU 0x01 ; Registro de tiempo hardware
INTCON EQU 0x0B ; Registro de control de interrupcion
OPTREG EQU 0x81 ; Registro de opciones

st_pers EQU 0x20 ; Var para control del estado de la persiana
st_LigH EQU 0x21 ; Var para control del estado de la luz
comp1 EQU 0x22 ; Var resultado comparador 1
comp2 EQU 0x23 ; Var resultado comparador 2
Lampara EQU 0x24 ; Luminosidad de la lampara 0=baja..127=maxima
result EQU 0x25 ; Var para almacenar resultado comparacion.
estado EQU 0x26 ; Var para estados d las var XXXX X pers sint sext
count1 EQU 0x27 ; Var para el contador de delay
count2 EQU 0x28 ; Var para el contador de delay
W_Temp EQU 0x29 ; Guardamos registro W durante interrupcion
St_Temp EQU 0x30 ; Guardamos registro STATUS durante interrupcion
ls_adc EQU 0x31 ; Guardamos el valor despues de la conversion AD
DEMORA EQU 0x32 ; Valor de demora para enceder el TRIAC
PDel0 EQU 0x33 ; Variable para el calculo de 5segundos de retardo
PDel1 EQU 0x34 ; Variable para el calculo de 5segundos de retardo
PDel2 EQU 0x35 ; Variable para el calculo de 5segundos de retardo
Contador EQU 0x36 ; Variable para el retardo de 20us
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

ORG 000 ; Comienzo de la memoria del programa
NOP ; Para el modo ICD
GOTO init ; Salta al programa principal
ORG 04
GOTO INT


;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;

; Inicializacion del puertos ..................................................

init
BCF STATUS,7 ; Configuro el bit FSR a 0 xa trabajar bank0/1
BCF STATUS,5 ; Seleccion el bank0 de memoria RP0
BCF STATUS,6 ; poniendo 00 en RP0:RP1
BCF estado,2 ; Inicia el estado de la persiana a cerrado
BCF estado,3 ; Ha contado los 5 segundos de accion de persiana?
CLRF PORTA ; Limpia los puertos del A al D
CLRF PORTB
CLRF PORTC
CLRF PORTD
BSF STATUS,5 ; Selecciono el bank 1 poniendo 01 RP0:RP1
MOVLW 0X80 ;
MOVWF ADCON1 ; Todos los pines del puerto A son analogicos
MOVLW 0XCF ;
MOVWF TRISA ; Todos los pines del puerto A son entradas

NOP ; BANKSEL no puede ser etiquetada
BANKSEL TRISB ; Selecciona el bank1
MOVLW b'11111101' ; Configura el RB1 como salida(b'11111101') 253
MOVWF TRISB ; Carga el codigo DDR en F86

NOP ; BANKSEL no puede ser etiquetada
BANKSEL TRISC ; Selecciona el bank1
MOVLW b'01111111' ; Configura RC6 y RC7 como salida(b'01111111') 127
MOVWF TRISC ; Carga el codigo DDR en F87

NOP ; BANKSEL no puede ser etiquetada
BANKSEL TRISD ; Selecciona el bank1
MOVLW b'00000000' ; ConfiguraPORTD como salida
MOVWF TRISD ; Carga el codigo DDR en F88

NOP ; BANKSEL no puede ser etiquetada
BANKSEL TRISE ; Selecciona el bank1
MOVLW b'00000000' ; Configura bit4 a 0 xa utilizar portd como puertos gnral
MOVWF TRISE ;

 
MOVLW B'11000111' ;EL PRESCALER ES ASIGNADO AL TMR0
MOVWF OPTION_REG
MOVLW B'10010000' ;INTERRUPCION POR PIN RB0
MOVWF INTCON
GOTO Ppal

El funcionamiento es que a través de la RB4 viene una señal de un comparador con LDR, para detectar si hay luz o no en la habitación. En función de esa variable actúa de la siguiente manera. La llamada desde el principal la realiza con "persia" y me dirijo al siguiente código

Código: [Seleccionar]
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Tratamiento de los datos, acción de persiana..................................
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;



persia
BTFSC estado,2 ;testeo del bit persiana
GOTO luz ; Si 1 voy a comprobar el bit de estado de la luz
GOTO oscuro ; Si 0 voy a comprobar el bit de estado de la luz
luz
BTFSS PORTB, 4 ; testeo si hay luz exterior
GOTO abrir ; Si cerrado, entonces abrimos la persiana
RETURN ; Si ya esta abierto, no hacemos nada
oscuro
BTFSS PORTB, 4 ; testeo si hay luz exterior
RETURN ; si ya cerrado, no hacemos nada
GOTO cerrar ; Si abierto, lo cerramos
abrir
BSF PORTD,0 ; mandamos un 1 por RD0 para abrir
GOTO espera5s ; Esperamos 5 segundos (tiempo a regular) para dejar terminar la apertura
BCF PORTD,0 ; Apagamos la señal del puerto D0
BSF estado,2 ; Actualizamos la bandera del bit de estado a abierto
RETURN
cerrar
BSF PORTD,1 ; mandamos un 1 por RD1 para cerrar
GOTO espera5s ; Esperamos 5 segundos (tiempo a regular) para dejar terminar la apertura
BCF PORTD,1 ; Apagamos la señal del puerto D1
BCF estado,2 ; Actualizamos la bandera del bit de estado a cerrado
RETURN
;-------------------------------------------------------------
espera5s
movlw     .165  ; 1 set numero de repeticion  (C)
        movwf     PDel0    ; 1 |
PLoop0
movlw     .41      ; 1 set numero de repeticion  (B)
        movwf     PDel1    ; 1 |
PLoop1
movlw     .147      ; 1 set numero de repeticion  (A)
        movwf     PDel2      ; 1 |
PLoop2
clrwdt              ; 1 clear watchdog
        clrwdt              ; 1 ciclo delay
        decfsz    PDel2, 1  ; 1 + (1) es el tiempo 0  ? (A)
        goto      PLoop2    ; 2 no, loop
        decfsz    PDel1,  1 ; 1 + (1) es el tiempo 0  ? (B)
        goto      PLoop1    ; 2 no, loop
        decfsz    PDel0,  1 ; 1 + (1) es el tiempo 0  ? (C)
        goto      PLoop0    ; 2 no, loop
        return              ; 2+2 Fin.
;-------------------------------------------------------------
« Última modificación: 26 de Junio de 2012, 12:53:36 por inxanu »

Desconectado MerLiNz

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2463
Re: Problema para obtener 5V en PORTD de pic16f877
« Respuesta #5 en: 26 de Junio de 2012, 12:51:00 »
y que voltaje obtienes?? Con el circuito del rele desconectado del pin si tienes 5V?

Desconectado inxanu

  • PIC10
  • *
  • Mensajes: 21
Re: Problema para obtener 5V en PORTD de pic16f877
« Respuesta #6 en: 26 de Junio de 2012, 12:55:04 »
y que voltaje obtienes?? Con el circuito del rele desconectado del pin si tienes 5V?

En la simulación no me deja tenerlo al aire. Y el montaje ya lo tengo en placa soldado y no puedo medirlo sin el relé.

Probé a usar la RB2 en la simulación y el resultado fue el mismo, que es lo mas extraño de todo.

« Última modificación: 26 de Junio de 2012, 12:57:25 por inxanu »

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema para obtener 5V en PORTD de pic16f877
« Respuesta #7 en: 26 de Junio de 2012, 12:58:42 »
Puede ser lo que te mencioné:

antes de

GOTO   Ppal

pon

BANKSEL 0

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado inxanu

  • PIC10
  • *
  • Mensajes: 21
Re: Problema para obtener 5V en PORTD de pic16f877
« Respuesta #8 en: 26 de Junio de 2012, 13:01:37 »
Puede ser lo que te mencioné:

antes de

GOTO   Ppal

pon

BANKSEL 0

Saludos.

Pues si que es tikismiquis el pic este. Ha sido ponerlo y clavar los 5V!!!     :shock: :shock: :shock: Me estaba volviendo loco!

 Muchisimas gracias!!!!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema para obtener 5V en PORTD de pic16f877
« Respuesta #9 en: 26 de Junio de 2012, 13:10:03 »
Si no retornas al banco 0, siendo que lo habias dejado en el banco 1 durante la inicializacion, en lugar de trabajar luego sobre las variables RAM entre 0x00 y 0x7F trabajas sobre las 0x80 y 0xFF. Entonces en lugar de afectar al PORTD, afectas al TRISD, logrando que lo unico que cambie es la config IO en lugar de su estado. De manera análoga sucede con el resto de la RAM que utilizas si continúas en un banco erróneo.

Puedes verlo bien en la sección Memory Organization, bajo el cuadro REGISTER FILE MAP del datasheet del 16F877.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado inxanu

  • PIC10
  • *
  • Mensajes: 21
Re: Problema para obtener 5V en PORTD de pic16f877
« Respuesta #10 en: 26 de Junio de 2012, 13:11:03 »
Una vez mas, muchas gracias! ;-)

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Problema para obtener 5V en PORTD de pic16f877
« Respuesta #11 en: 26 de Junio de 2012, 13:16:27 »
Y ya que estoy te hago notar dos detalles:

W_Temp   EQU   0x29   ; Guardamos registro W durante interrupcion
St_Temp   EQU   0x30   ; Guardamos registro STATUS durante interrupcion\

deberian estar dentro del intervalo de posiciones 0x70 a 0x7F. Esto es porque sólo dichas posiciones son accesibles(están compartidas) desde los 4 bancos de RAM de este uC, lo que evita potenciales errores de que al momento de ingresar al vector de interrupcion, el uC se encuentre en un banco distinto del 0, lo que produciria que se guarde los valores de W y STATUS en posiciones de memoria incorrectas, impidiendo luego antes de salir del vector de interrupción, poder restaurarlas correctamente.

Y por último, en hexadecimal, luego del 0x29 viene el 0x2A, 0x2B, 0x02C, 0x2D, 0x2E y 0x2F antes del 0x30.

Y ya con esto no te molesto más :D

Me alegro que haya sido de ayuda.

Saludos.

"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado inxanu

  • PIC10
  • *
  • Mensajes: 21
Re: Problema para obtener 5V en PORTD de pic16f877
« Respuesta #12 en: 26 de Junio de 2012, 15:00:53 »
Creeme que no es molestar, me viene de perlas esos matices...  :D :D