Autor Tema: Ayuda con secuencia de LEDs y PIC16F876  (Leído 9087 veces)

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

Desconectado jokerzgz

  • PIC10
  • *
  • Mensajes: 10
Ayuda con secuencia de LEDs y PIC16F876
« en: 07 de Junio de 2010, 07:47:33 »
Supongo que esto estará respondido por algún lado, pero no lo he encontrado (buscando por PIC16F876) o no he sabido encontrarlo.

El caso es que debo montar una secuencia de encendido de 16 LEDs uno tras otro con una serie de intervalos que varían según el LED a encender, para finalmente terminar con todos los LEDs encendidos.

El pin MCLR está conectado con una resistencia a V+ (+4.5 V), el pin VDD está conectado a V+ (+4.5 V) sin resistencia, y conectado a CLKIN y CLKOUT estoy utilizando un cristal de 4 MHz con dos condensadores de 22.

El programa lo obtuve de una secuencia de 8 luces a las que añadí las otras 8 que faltaban, por lo que no creo que sea el problema del propio programa. Los problemas son los siguientes:

- Al aplicar corriente al PIC para iniciar el programa automáticamente se encienden todos los LEDs y ya está, no hace nada más.
- Los pines VSS los tengo conectados entre ellos (o puedo dejarlos al aire), pero no puedo conectarlos a GND, puesto que entonces solamente se encienden la mitad de los LEDs y el PIC se calienta demasiado.
- Si conecto solamente un pin VSS a GND, dependiendo del pin conectado se encienden unos pocos LEDs con muy poca intensidad, pero en cualquier caso el pic se calienta muchísimo.
- Si no conecto los pines VSS a GND se encienden todos los LEDs a la vez y el PIC no se calienta.

El caso es que la secuencia no se ejecuta (pienso que aunque el intervalo de uno a otro fuera muy pequeño habría una diferencia de tiempo entre el encendido del primer LED y el último)

El programa en ASM es

Código: [Seleccionar]
LIST P=16F876
INCLUDE <P16F876.INC>
CONTA0 = 0X20
CONTA1 = 0X21
CONTA2 = 0X22
ORG 0
GOTO INICIO

INICIO
BSF STATUS,0
MOVLW 0X00
MOVWF TRISB
BCF STATUS,0
BSF STATUS,0
MOVLW 0X00
MOVWF TRISC
BCF STATUS,0

MOVLW B'00000001'
MOVWF PORTB
CALL RETARDO
MOVLW B'00000011'
MOVWF PORTB
CALL RETARDO
MOVLW B'00000111'
MOVWF PORTB
CALL RETARDO
MOVLW B'00001111'
MOVWF PORTB
CALL RETARDO
MOVLW B'00011111'
MOVWF PORTB
CALL RETARDO
MOVLW B'00111111'
MOVWF PORTB
CALL RETARDO
MOVLW B'01111111'
MOVWF PORTB
CALL RETARDO
MOVLW B'11111111'
MOVWF PORTB
CALL RETARDO
MOVLW B'00000001'
MOVWF PORTC
CALL RETARDO
MOVLW B'00000011'
MOVWF PORTC
CALL RETARDO
MOVLW B'00000111'
MOVWF PORTC
CALL RETARDO
MOVLW B'00001111'
MOVWF PORTC
CALL RETARDO
MOVLW B'00011111'
MOVWF PORTC
CALL RETARDO
MOVLW B'00111111'
MOVWF PORTC
CALL RETARDO
MOVLW B'01111111'
MOVWF PORTC
CALL RETARDO
MOVLW B'11111111'
MOVWF PORTC

RETARDO
MOVLW D'200'
MOVWF CONTA0
REP1 MOVLW D'200'
MOVWF CONTA1
REP2 MOVLW D'32'
MOVWF CONTA2
REP3 DECFSZ CONTA2,F
GOTO REP3
DECFSZ CONTA1,F
GOTO REP2
DECFSZ CONTA0,F
GOTO REP1
RETURN

END

Agradeceré cualquier tipo de ayuda, tanto para hacer arrancar la secuencia de LEDs como para después variar el intervalo según me interese, pues tampoco sé cuál es el actual, ya que el programa no funciona (aunque sabiendo el intervalo que hay definido en el programa supongo que sería posible variarlo llamando varias veces a la función RETARDO)
« Última modificación: 07 de Junio de 2010, 07:52:20 por jokerzgz »

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Ayuda con secuencia de LEDs y PIC16F876
« Respuesta #1 en: 07 de Junio de 2010, 09:38:27 »
De que el pic se caliente cuando conectas las masas, debe ser porque has conectado los leds directamente a cada uno de los pines del pic sin resistencia limitadora. Ten en cuenta que cada pin del pic puede dar una corriente máxima de 25mA, y si usas el puerto completo en total los 8 pines no pueden dar más de 200mA en total. Colocale entre cada pin del pic y cada led una resistencia de 330 o 470ohm. Las masas o sea VSS siempre deben ir conectadas, sino el pic no funciona.

Esperemos que el pic no se haya quemado.

Con respecto al retardo, efectivamente llamandolo varias veces aumentas el tiempo de encendido entre led y led, otra manera es variando los valores de las variables CONTA0,CONTA1 y CONTA2. Busca en el foro, hay muchos ejemplos.
« Última modificación: 07 de Junio de 2010, 09:41:40 por pablomanieri »

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Ayuda con secuencia de LEDs y PIC16F876
« Respuesta #2 en: 07 de Junio de 2010, 11:09:08 »
Imagino que si debe ser un problema de conexion física, y no de programa, lo que te hace levantar la temperatura del PIC. Por lo general es por un exceso de corriente.
Si por ahi tienes una imagen del circuito esquematico quizas podemos darte alguna ayuda adicional.

Con respecto a los retardos, es conveniente que uses la interrupcion por desbordamiento de algun TIMER, no es muy dificil de implementar, tampoco facil pero seguro hay algun ejemplito simple para seguir.
El uso del TIMER te permite continuar con el curso del programa sin que este se quede "clavado" en la rutina RETARDO, quizas ahora no te sea muy necesario, pero mas adelante lo necesitaras, por eso seria conveniente que lo implementes en un programa simple como este, asi ya lo tienes claro el tema.

Recuerda que en cuestiones de programaciones de funciones básicas, como puede ser salidas digitales, todos los micros de la linea 16F son similares, por no decir que igual, de un micro al otro varian solo la parte de los bits de configuracion y algunas otras cosas. Y por supuesto la parte fisica, para eso debes siempre tener a mano el datasheet del que estes usando.

Saludos
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado jokerzgz

  • PIC10
  • *
  • Mensajes: 10
Re: Ayuda con secuencia de LEDs y PIC16F876
« Respuesta #3 en: 07 de Junio de 2010, 11:21:35 »
Gracias por la pronta respuesta.

Cada uno de los LEDs está conectado al pin correspondiente y a GND con una resistencia de 220 (según me indicaron por otro lado), pero si me decís que con esa resistencia no es suficiente seguramente colocaré (ya que tengo de sobras) dos en cada LED.

En principio parece que el PIC no se ha quemado porque con el programador puedo leer los datos del programa del PIC y reescribirlo de nuevo en el controlador.

En cuanto tenga un momento intento subir un esquema de las conexiones.

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Ayuda con secuencia de LEDs y PIC16F876
« Respuesta #4 en: 07 de Junio de 2010, 11:59:09 »
Con una resistencia de 220ohm está bien, no hay problema con ese valor. Creo que está demás decirlo pero verifica que tienes los pines conectados correctamente, tanto los leds como VCC(VDD) y GND(VSS) y el cristal.
Los puertos que no usas, en caso de no tenerlos conectados a ningun lado, conviene configurarlos como salidas, para que no capten ruido.

Desconectado jhozate

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1697
Re: Ayuda con secuencia de LEDs y PIC16F876
« Respuesta #5 en: 07 de Junio de 2010, 13:14:29 »
hola, creo q el programa no esta en bucle infinito por lo cual esa rutina la ejecuta una sola vez y no la vuelves a ver mas. justo debajo de MOVWF PORTC deberias poner un GOTO que te lleve de nuevo a la primera secuencia.
saludos
Ser Colombiano es un Premio, Saludos desde CALI-COLOMBIA

Desconectado jokerzgz

  • PIC10
  • *
  • Mensajes: 10
Re: Ayuda con secuencia de LEDs y PIC16F876
« Respuesta #6 en: 07 de Junio de 2010, 14:23:58 »
La rutina tiene que hacerla una sola vez, por eso no hay un GOTO que devuelva al principio del programa. El caso es que los LEDs se encienden todos a la vez (o al menos esa es la impresión) y no en secuencia, como deberían.

He comprobado el cableado de forma que el cristal vaya conectado a los pines CLKIN y CLKOUT, los VSS van a GND y el VDD conectado a VCC (+4.5V). Los LEDs van cada uno al pin correspondiente según sea del puerto B o del puerto C.

Probaré a configurar los demás puertos como salida, a ver si por ahí puede venir alguno de los problemas.

Gracias de nuevo

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Ayuda con secuencia de LEDs y PIC16F876
« Respuesta #7 en: 07 de Junio de 2010, 19:54:29 »
También debes verificar los fuses que le has quemado al pic, tal vez tienes el watch dog timer activado. Como dice jhozate, no hay un ciclo infinito, deberias colocarlo, y asi la secuencia se repite y puedes ver mejor si esta secuencia esta correcta, luego cuando ya lo tienes depurado, le quitas el goto y listo, en realidad si quieres que la secuencia se repita una sola vez, igual colocas un ciclo infinito pero solo al final del programa.
se me escapo un detalle, cuando asignas los valores del trisB y TRISC, no estas seleccionando correctamente el banco y creo que no los asigna como salidas sino que quedan como entradas, chequea esto, para seleccionar correctamente el banco donde se encuentra el registro que quieres escribir, en este caso TRISB y TRISC, debes hacer
BSF STATUS,RP0

y luego cunado escribes en el puerto
BCF STATUS,RP0

Chequea eso.
Con respecto a los tiempos, para un clock de 4Mhz el retardo es de alrededor de 4 seg, asi que no deberías tener problema en visualizar la secuencia.
Pero el problema mas grave ahora es por que se calienta el pic.

« Última modificación: 07 de Junio de 2010, 20:11:30 por pablomanieri »

Desconectado jokerzgz

  • PIC10
  • *
  • Mensajes: 10
Re: Ayuda con secuencia de LEDs y PIC16F876
« Respuesta #8 en: 08 de Junio de 2010, 04:50:19 »
También debes verificar los fuses que le has quemado al pic, tal vez tienes el watch dog timer activado.

Es posible que al programar el PIC se quedase verificada la casilla del watch dog, probaré de nuevo a programarlo desmarcando la casilla correspondiente. Olvidé comentar que el programa que utilizo es el PicProg 2009. Supongo que desmarcando la casilla quedará desactivado.

Como dice jhozate, no hay un ciclo infinito, deberias colocarlo, y asi la secuencia se repite y puedes ver mejor si esta secuencia esta correcta, luego cuando ya lo tienes depurado, le quitas el goto y listo, en realidad si quieres que la secuencia se repita una sola vez, igual colocas un ciclo infinito pero solo al final del programa.

Haré lo que comentas de poner el bucle, aunque supongo que colocándolo al final del programa será suficiente.

se me escapo un detalle, cuando asignas los valores del trisB y TRISC, no estas seleccionando correctamente el banco y creo que no los asigna como salidas sino que quedan como entradas, chequea esto, para seleccionar correctamente el banco donde se encuentra el registro que quieres escribir, en este caso TRISB y TRISC, debes hacer
BSF STATUS,RP0

y luego cunado escribes en el puerto
BCF STATUS,RP0

Chequea eso.

No estoy muy seguro de dónde tengo que colocar esto que dices, ya que en dos ocasiones pongo la instrucción BSF STATUS,0 (en lugar de RP0), justo antes de especificar el puerto, y la instrucción BCF STATUS,0 (de nuevo en lugar de RP0) justo después de especificar el puerto.

¿Con una sola instrucción para los dos puertos valdría? ¿Podrías indicarme cómo poner la instrucción en el código? Gracias

Con respecto a los tiempos, para un clock de 4Mhz el retardo es de alrededor de 4 seg, asi que no deberías tener problema en visualizar la secuencia.

Los 4 segundos que indicas ¿son para el total de la secuencia o para cada uno de los LED? Lo digo porque para unos necesito 1.30 segundos, para otros 2 segundos y para otros 2.5 segundos. Obviamente si los 4 segundos que dices son para cada uno de los LED

Pero el problema mas grave ahora es por que se calienta el pic.

¿Podría ser por lo que comentas de que igual quedan los puertos como entradas y le llega demasiada corriente al PIC?

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Ayuda con secuencia de LEDs y PIC16F876
« Respuesta #9 en: 08 de Junio de 2010, 09:01:25 »
Citar
Es posible que al programar el PIC se quedase verificada la casilla del watch dog, probaré de nuevo a programarlo desmarcando la casilla correspondiente. Olvidé comentar que el programa que utilizo es el PicProg 2009. Supongo que desmarcando la casilla quedará desactivado.

Efectivamente desmarcando la casilla de verificación del WDT queda desactivado, también debes verificar que el oscilador se corresponde con un cristal de 4MHz, en este caso debes colocar XT

Citar
No estoy muy seguro de dónde tengo que colocar esto que dices, ya que en dos ocasiones pongo la instrucción BSF STATUS,0 (en lugar de RP0), justo antes de especificar el puerto, y la instrucción BCF STATUS,0 (de nuevo en lugar de RP0) justo después de especificar el puerto.
¿Con una sola instrucción para los dos puertos valdría? ¿Podrías indicarme cómo poner la instrucción en el código? Gracias

Justamente deberías reemplazar el 0 por RP0
BCF STATUS,0 por BCF STATUS,RP0
BSF STATUS,0 por BCF STATUS,RP0

El bit RP0 del registro STATUS está en la posisción <5> y no en la <0> que corresponde al bit de Carry.
Esto está claramente especificado en las hojas de datos.
 

Citar
Los 4 segundos que indicas ¿son para el total de la secuencia o para cada uno de los LED? Lo digo porque para unos necesito 1.30 segundos, para otros 2 segundos y para otros 2.5 segundos. Obviamente si los 4 segundos que dices son para cada uno de los LED

Estos 4 segundos corresponden a cada uno de los LEDS


Citar
¿Podría ser por lo que comentas de que igual quedan los puertos como entradas y le llega demasiada corriente al PIC?
El tema del calentamiento no se a que se debe, por más que los puertos estén configurados como entradas sin conectar, no debería calentarse.
Te comenté que verificaras las conexiones porque en caso de error habría algún pin mal conectado que estuviera consumiendo demasiada corriente, pero eso está descartado
« Última modificación: 08 de Junio de 2010, 09:05:51 por pablomanieri »

Desconectado jokerzgz

  • PIC10
  • *
  • Mensajes: 10
Re: Ayuda con secuencia de LEDs y PIC16F876
« Respuesta #10 en: 08 de Junio de 2010, 16:37:11 »
Gracias de nuevo por tu respuesta pablomanieri.

He corregido lo que me indicaste del BSF STATUS,RP0 y el BCF STATUS,RP0 pero el resultado continúa siendo el mismo. También he probado a colocar un bucle infinito para poder ver la secuencia en caso de que se haga, pero no, todos los LEDs se encienden exactamente a la vez y permanecen fijos mientras haya corriente.

Del mismo modo, en cuanto conecto los pines VSS a GND el PIC empieza a calentarse (antes de que se caliente demasiado desconecto la alimentación para evitar que se tueste). Si conecto el pin 19 (VSS) a GND se encienden algunos LEDs pero con poquísima intensidad, mientras que si el pin que conecto es el 8 (VSS) se encienden varios LEDs con mayor intensidad, mientras que aproximadamente la tercera parte permanecen apagados (o lo parecen).

Ya no sé qué hacer para que funcione, pues dispongo de un PIC16F874 (40 pines) con el que podría hacer pruebas si no fuera porque el programador (un VELLEMAN P8706) no me lo reconoce correctamente.

¿Alguna otra sugerencia?

Desconectado pablomanieri

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 639
Re: Ayuda con secuencia de LEDs y PIC16F876
« Respuesta #11 en: 08 de Junio de 2010, 16:57:51 »
Lo mas probable es que el pic haya pasado a mejor vida, los pines VCC y VSS van todos conectados, no los puedes dejar desconectados porque sino el pic no funciona, Lo de que se enciendan los leds sin conectar VSS de debe a fugas que se propagan por el interior del pic al no quedar polarizado correctamente. Vas a tener que probar con otro pic. El que el grabador lo reconozca y lo grabe no significa que no se hayan quemado algunas de las salida.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Ayuda con secuencia de LEDs y PIC16F876
« Respuesta #12 en: 08 de Junio de 2010, 19:16:07 »
quizas con un esquematico simple de com ohaces las conexiones podramos ayudarte mas, creo que el problema lo tienes en la parte fisica.
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.

Desconectado jokerzgz

  • PIC10
  • *
  • Mensajes: 10
Re: Ayuda con secuencia de LEDs y PIC16F876
« Respuesta #13 en: 10 de Junio de 2010, 17:03:01 »
Bueno, pues acabo de probar con otro PIC igual que el que tenía y el resultado es exactamente el mismo, aunque en esta ocasión no he llegado a dejar que el PIC se calentase, por si acaso.

En cuanto lo conecto, sin conectar las VSS a GND se encienden los 16 LEDs a la vez, sin secuencia. Si conecto las VSS a GND se apagan los LEDS y el PIC empieza a calentarse, pero no se ejecuta el programa ni nada.

Ya no sé qué hacer, porque este PIC es completamente nuevo.

A ver si encuentro un momento y trato de hacer un esquema de las conexiones, por si algo que yo creo que está bien no lo está... que después de repasarlo una y otra vez con la DS del PIC es algo que casi descarto.

Desconectado willynovi

  • Colaborador
  • PIC24F
  • *****
  • Mensajes: 546
Re: Ayuda con secuencia de LEDs y PIC16F876
« Respuesta #14 en: 10 de Junio de 2010, 17:47:54 »
lo que nos cuentas es algo raro, de seguro que es algo de conexion física.
Disculpa la insistencia  :mrgreen: pero con un esquematico de la conexion que estas usando podriamos ayudarte mas.

http://www.iesjuandelacierva.es/~fremiro/Articulos%20Resistor/PIc16F87X/curso_1.pdf
Ahi tienes un tutorial completisimo del 16F876, lo he mirado por arriba, en el primer capítulo tienes un programa simple que podrias utilizar para ver si anda todo bien, y luego ir avanzando de a poco.

http://www.iesjuandelacierva.es/~fremiro/Articulos%20Resistor/PIc16F87X/Curso_3.pdf
Bueno ahi encontre lo que buscaba, en el curso tres, la pagina 2 tienes un circuito simple con lo mínimo que necesitas conectarle al PIC para que funcione correctamente.
Intento enseñarte a pescar, si solo quieres pescados, espera que un pescador te regale los suyos.


 

anything