Autor Tema: problema simple pero curioso  (Leído 4961 veces)

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

Desconectado En

  • PIC10
  • *
  • Mensajes: 26
problema simple pero curioso
« en: 19 de Septiembre de 2008, 13:35:21 »
que tal gente del foro

les comento el problema que estoy teniendo que la verdad  supongo que debe ser una pavada pero que yo no veo

mi objetivo es que el pic este esperando una entrada y que en el momento de que esta ocurra de una salida, pero la entrada no es continua, es dada por un pulsador por lo que la entrada dura solo unos milisegundos que tardo en pulsar el pulsador y la salida se activa y continua estable
para eso este codigo

List p=16f84
   #INCLUDE P16F84.INC
   __CONFIG  _WDT_OFF &  _PWRTE_ON &  _XT_OSC
STATUS equ 0x03
PORTB equ 0x06
PORTA equ 0x05

      org 0x00
       goto INICIO
      org 0x05

INICIO
      bsf STATUS,5    ;cambia al banco1
      movlw b'11111111'
      movwf PORTA      ;PORTA entradas
      movlw b'11111000'
      movwf PORTB      ;PORTB salidas
      bcf STATUS,5    ;cambia al banco0
ESPERA
      btfss PORTA,0   ;espera
      goto ESPERA
FACE1
      bsf PORTB,0     ;prende RB0
      end




mi problema es que RB0 se prende solo cuando la entrada esta siendo dada y no cuando se corta

no se la verdad me desconcertó cosa que en este tema no es muy dificil que me pase y viendo esto se me viene a la cabeza otra pregunta

si yo doy salidas, cuando termina el programa, es decir, cuando llega a end ¿las salidas se mantienen no?


bueno si me pueden dar una mano sera muy bienvenida yo seguire probando. gracias

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re: problema simple pero curioso
« Respuesta #1 en: 19 de Septiembre de 2008, 13:56:42 »
Hola amigo:

Me parece que cuando lees el estado del pulsador, lo que realizas es poner a 1 el RB0 y ya no lo vuelves a desactivar , en ningun momento del progroma. Te faltaria la rutina de apagado cunado el pulsador n este activo.
Lo haria asi:
NICIO
      bsf STATUS,5    ;cambia al banco1
      movlw b'11111111'
      movwf PORTA      ;PORTA entradas
      movlw b'11111000'
      movwf PORTB      ;PORTB salidas
      bcf STATUS,5    ;cambia al banco0
ESPERA
      btfss PORTA,0   ;espera
     
goto ESPERA


FACE1
      bsf PORTB,0     ;prende RB0
     



end
Todos los días se aprende algo nuevo.

Desconectado Fer_TACA

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4154
Re: problema simple pero curioso
« Respuesta #2 en: 19 de Septiembre de 2008, 14:07:06 »
Se me envio el mensaje antes de terminar de escribir, bueno aqui va la respuesta completa. :x :x :x :x :x :x

Hola amigo:

Me parece que cuando lees el estado del pulsador, lo que realizas es poner a 1 el RB0 y ya no lo vuelves a desactivar , en ningun momento del programa. Te faltaria la rutina de apagado cunado el pulsador no este activo.
Lo haria asi:
INICIO
      bsf STATUS,5    ;cambia al banco1
      movlw b'11111111'
      movwf PORTA      ;PORTA entradas
      movlw b'11111000'
      movwf PORTB      ;PORTB salidas
      bcf STATUS,5    ;cambia al banco0
ESPERA
      btfss PORTA,0   ;espera
      goto FACE2
FACE1
      bsf PORTB,0     ;prende RB0
      goto ESPERA
FACE2
      bcf PORTB,0     ;apaga RB0   
      goto ESPERA
      end

Esto es para explicarte un poco tu error. Todavia se podria depurar más el programa para evitar los gotos, pero de esta forma creo que lo entenderas mejor.
Ademas habria que añadir unos retardos para eliminar los rebotes que se producen al actuar los contactos del pulsador, asi como el añadir un tiempo de espera desde que se produce un cambio de la salida hasta la siguiente, dado que si el cristal es digamos e 4MHz el programa ira tan rapido que siempre veras el led iluminado.

Otra opcion seria realizarlo con interrupciones, pero si estas empezando eso mejor para mas adelante. :mrgreen: :mrgreen:

Fermin

« Última modificación: 19 de Septiembre de 2008, 14:10:07 por Fer_TACA »
Todos los días se aprende algo nuevo.

Desconectado En

  • PIC10
  • *
  • Mensajes: 26
Re: problema simple pero curioso
« Respuesta #3 en: 19 de Septiembre de 2008, 19:55:46 »
mmm bueno, gracias por el aporte Fer_TACA

creo que te entendi, pero vos lo que me decis es que modifique el programa para que cuando pulso este prendida la led y cuando suelto apagada y yo lo que quiero no es eso, sino que este apagada y cuando lo pulso la led quede prendida sin importar si después lo suelto, funcionaria como el  boton de inicio del programa (el programa queda a la espera hasta que se presiona este boton y una vez echo el programa sigue su curso y ya no importa lo que pase con esa entrada)

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: problema simple pero curioso
« Respuesta #4 en: 19 de Septiembre de 2008, 20:28:06 »
INICIO
      bsf STATUS,5    ;cambia al banco1
      movlw b'11111111'
      movwf TRISA      ;PORTA entradas>>>>>>>>>>>>Fijate en estas líneas que cambié, también debes cambiar de banco creo, pero eso te lo dejo a tí.
      movlw b'11111000'
      movwf TRISB      ;PORTB salidas    >>>>>>>>>>>
      bcf STATUS,5    ;cambia al banco0
ESPERA
      btfss PORTA,0   ;espera
      goto FACE2
FACE1
      bsf PORTB,0     ;prende RB0
      goto ESPERA
FACE2
      bcf PORTB,0     ;apaga RB0   
      goto ESPERA
      end

Saludos!!!
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado DOMINGO_V

  • PIC10
  • *
  • Mensajes: 14
Re: problema simple pero curioso
« Respuesta #5 en: 20 de Septiembre de 2008, 04:41:49 »
La verdad es que lo que te pasa no tiene mucho sentido si todo tu código es el que nos has enviado.
De todas formas yo intentaría poner antes del  end un bucle infinito de la forma :

fin goto fin 

para probar si el problema se reproduce o no

Porque el PIC cuando llega al END no se para sino que sigue ejecutando el resto de posiciones hasta el final y vuelve a comenzar si no lo paras antes por medio de un bucle infinito. Lo que sospecho es, que por el motivo que sea, tienes grabada en alguna posición posterior una instrucción ( que no debería estar) que apaga la salida.
No tiene mucho sentido porque yo siempre había creido que los programadores borraban toda la memoria , pero es la única explicación que le veo. Haz la prueba que te digo para confirmar si es cierto o no.

Otro tema.

La solución que te daba flacoclau  en el mensaje anterior es correcta y hace mas facil leer el código ya que le da el nombre correcto a los registros, pero no es la solución del problema porque ambos registros PORTA y TRISA tienen la misma posición aunque en bancos distintos por lo que el código funcionaría igual aunque es un poco mas dificil de entender y es mejor ponerlo como dice él.



Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: problema simple pero curioso
« Respuesta #6 en: 20 de Septiembre de 2008, 16:34:00 »
Hola domingo, perdona que te corrija, tris a y port a no son lo mismo, no ocupan la misma posición y cumplen funciones distintas, no es un problema de legibilidad.
Están en diferentes bancos, uno es el puerto y el otro controla cada bit que sea entrada o salida.
saludos!!!

y el banco seleccionado está bien, no hace falta cambiarlo!!!
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado DOMINGO_V

  • PIC10
  • *
  • Mensajes: 14
Re: problema simple pero curioso
« Respuesta #7 en: 20 de Septiembre de 2008, 18:37:00 »
Tienes razón en lo que dices, quizás no me he sabido explicar bien. Voy a intentanlo de nuevo.
Es cierto que tienen posiciones distintas:
TRISA ocupa la posición 85H y PORTA la posición 05H. y está claro que ambas tienen funciones diferentes tal como tu dices.
Sin embargo debido a la manera en que se forma el código máquina de los PICS ambas se codifican dentro de la instrucción como 05H y por eso estamos obligados a seleccionar antes de la instrucción el banco al que nos referimos, porque si no lo hacemos el PIC puede interpretar que estamos asignando el valor a la posición equivocada ya que para él ambas son 05H dentro del código de la instrucción y la única manera que tiene de diferenciar una de otra es mediante la selección del banco realizada previamente.
Lo que quise decir es que aunque es mas correcto escribirlo como dices tú  y es lo  que hacemos  siempre, el efecto práctico de modificarlo no resolvería el problema original que nos comunicaba.
Espero haber aclarado lo que quería decir.

Desconectado flacoclau

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1692
    • El Micro Reactor
Re: problema simple pero curioso
« Respuesta #8 en: 20 de Septiembre de 2008, 19:40:38 »
Eso es cierto!!
Las personas con buena ortografía me atraen textualmente.

El Micro Reactor

Córdoba capital - Argentina.

Desconectado En

  • PIC10
  • *
  • Mensajes: 26
Re: problema simple pero curioso
« Respuesta #9 en: 21 de Septiembre de 2008, 22:05:03 »
si, gracias por la ayuda = creo que no logro expresar bien que es lo que busco aunque = ay respuestas que me pueden ser utiles


yo lo que quiero no es que al presionar el botón(darle el pulso) se prenda y al soltarlo(dejar de darle el pulso) se apague, sino que aprieto, prenda, suelto y siga prendida



pero bueno, voy a tener en cuenta eso de que el programa cuando llega al END sigue y vuelve a empezar, la verdad que es un dato muy importante y que la verdad no savia, gracias :-)

Desconectado DOMINGO_V

  • PIC10
  • *
  • Mensajes: 14
Re: problema simple pero curioso
« Respuesta #10 en: 22 de Septiembre de 2008, 03:39:49 »
Hola.
La respuesta que te di se basa precisamente en que te había entendido.
Voy ha intentar explicartelo de nuevo. Tu código me parece correcto y no se verle ningún problema por esto te decía lo que probaras a ponerle el bucle infinito.

Lo que creo es que tienes algo parecido a esto :



TU CODIGO


END


CODIGO VIEJO DE ALGUNA PRUEBA ANTIGUA QUE APAGA EL LED



Por eso te digo que pongas esto:

TU CODIGO


fin goto fin
END


CODIGO VIEJO DE ALGUNA PRUEBA ANTIGUA QUE APAGA EL LED



De esta manera el codigo viejo no se ejecutará nunca y el led debería quedarse encendido.

De todas formas no tengo la seguridad de que este sea el problema, por eso te decía que lo probaras para ver si el problema seguia igual. Porque si sigue igual es que algo se nos está escapando en tu código y yo ya no podría ayudarte mas.





Desconectado En

  • PIC10
  • *
  • Mensajes: 26
Re: problema simple pero curioso
« Respuesta #11 en: 25 de Septiembre de 2008, 12:40:36 »
bueno lo prove dejando el codigo asi:


List p=16f84
   #INCLUDE P16F84.INC
   __CONFIG  _WDT_OFF &  _PWRTE_ON &  _XT_OSC
STATUS equ 0x03
PORTB equ 0x06
PORTA equ 0x05

CONT equ 0x0C
CONT2 equ 0x0D
CONT3 equ 0x0E

      org 0x00
      goto INICIO
      org 0x05

INICIO
      bsf STATUS,5    ;cambia al banco1
      movlw b'11111111'
      movwf PORTA      ;PORTA entradas
      movlw b'11111000'
      movwf PORTB      ;PORTB salidas
      bcf STATUS,5    ;cambia al banco0
      clrf PORTB
ESPERA
      bsf PORTB,1      ;abre barrera      
      btfss PORTA,0   ;espera boton de inicio
      goto ESPERA
FACE1
      bsf PORTB,0     ;le da energia a la via
FIN      
      goto FIN
      end


y me funciono aunque parcialmente, y porque digo eso, porque me dejo de hacer el error que me hacia que era que prendia el RB0 y al dejar de darle la entrada se apagaba, bueno, ahora queda prendido como debe ser y doy gracias por el consejo

pero ahora lo que me pasa es que cuando le doy una entrada por la pata RA1,2 o 3  (son las que prove, las otras nose) la salida se corta, es decir, el RB0 se pone en 0 cosa que tampoco le encuentro la lógica, no se si se reinicia o que pero me corta el pulso de RB0 y si le vuelvo a dar un pulso por el RA0 vuelve a prender (pareceria que se reinicia, pero no se porque  :shock:)

Desconectado DOMINGO_V

  • PIC10
  • *
  • Mensajes: 14
Re: problema simple pero curioso
« Respuesta #12 en: 25 de Septiembre de 2008, 13:11:17 »
Tienes unos problemas muy raros je,je.
Empiezo a pensar que el problema es de ruido. Le has puesto un buen condensador a la alimentación de tu circuito, independientemente del que ya tiene la fuente. Lo digo porque una vez a mi también me hacía cosas raras un PIC y al final descubrí que no había filtrado lo suficiente la alimentación y le metía ruido que hacía imprevisible el funcionamiento. Se solucionó poniendo un buen condensador electrolítico adicional. Si no es eso no se que puede ser .

Desconectado En

  • PIC10
  • *
  • Mensajes: 26
Re: problema simple pero curioso
« Respuesta #13 en: 25 de Septiembre de 2008, 13:26:15 »
si, tenes razon ami hace poco ese tema me volvio loco y puede que sea lo mismo pero pasa que ahora lo estoy alimentando con pilas :?

Desconectado En

  • PIC10
  • *
  • Mensajes: 26
Re: problema simple pero curioso
« Respuesta #14 en: 28 de Septiembre de 2008, 19:24:34 »
buen muchachos les comento mi problema con las ultimas pruvas que estuve haciendo porque la verdad que ya como que me estoy desesperando un poco con todo este tema...



el problema crucial esta en el el programa esta echo para mantener una salida estable al recibir una entrada y no lo hace, sino que corta la salida ni vien se le deje de dar la entrada

en realidad es simplemente eso pero no ay caso, no le puedo encontrar la buelta, al tener un programa tan corto y simple y una electronica = no me logro dar cuenta de donde fallo





List p=16f84
   #INCLUDE P16F84.INC
   __CONFIG  _WDT_OFF &  _PWRTE_ON &  _XT_OSC
STATUS equ 0x03
PORTB equ 0x06
PORTA equ 0x05

      org 0x00
      goto INICIO
      org 0x05

INICIO
      bsf STATUS,5    ;cambia al banco1
      movlw b'11111111'
      movwf PORTA      ;PORTA entradas
      movlw b'11111000'
      movwf PORTB      ;PORTB salidas
      bcf STATUS,5    ;cambia al banco0
      clrf PORTB
ESPERA
      bsf PORTB,1      ;(salida pin 7)      
      btfss PORTA,0   ;espera boton de inicio(pin 17)
      goto ESPERA
FACE1
      bsf PORTB,0     ;(salida pin 6)
FACE2
      btfss PORTA,1   ;espera Interruptor 2(pin 18)
      goto FACE2
      bcf PORTB,1    ;(apaga pin 7)
FIN      
      goto FIN
      end


 

anything