TODOPIC
FORO TÉCNICO => Foro Técnico => Mensaje iniciado por: jokerzgz 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
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)
-
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.
-
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
-
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.
-
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.
-
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
-
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
-
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.
-
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?
-
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
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.
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
¿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
-
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?
-
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.
-
quizas con un esquematico simple de com ohaces las conexiones podramos ayudarte mas, creo que el problema lo tienes en la parte fisica.
-
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.
-
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.
-
No dejes nunca sin conectar GND, ya que el pic no va a funcionar y puede que se dañe. Con que voltaje los estás alimentando, estás seguro que son 4,5V o 5V?. No estarás conectando la alimentación al revés? Pon el esquemático de conexiones.
-
Gracias de nuevo por las respuestas, pero después de mirar los esquemas de las hojas que me propones no he conseguido hacer funcionar nada (ni siquiera el programa de ejemplo, lo cual ya me resulta desesperante). :?
Voy a tratar de colgar el esquema de las conexiones que tengo hechas para el programa de la secuencia de LEDs...
(http://www.todopic.com.ar/foros/index.php?action=dlattach;topic=30937.0;attach=12342)
-
Esta seguro que la fuente de alimentacion esta bien, con su regulador de 5Voltio corriente continua?, porque aqui nos comenta siempre de 4,5 voltio. querido amigo yo nunca me meteria hacer proyectos sin leer tutoriales de electronica, creo que tu problema es de alimentacion, en el esquemas tampoco se veen Condensadores electrolitico etc. etc, asi que para que no este rompiendote la cabeza mejor pon todos los esquemas completos. y un consejo, ante de poner un circuito a trabajar hay que medir siempre la corriente y estar seguros 100% de su filtrados.
-
La corriente de alimentación, que yo sepa, nunca será superior a 4.5V porque lo que alimenta el circuito es una pila de 4.5V. En todo caso puede ser inferior (de momento se ha medido con un voltímetro y da los 4.5V), pero creo que nunca superior...
En cuanto a las conexiones, estos son todos los componentes del circuito:
- PIC 16F876
- LEDs (16)
- Resistencia 10K
- Resistencias 220 Ohm (16)
- Condensadores 22uF (2)
- Cristal 4 MHz
- Cableado
Y el conexionado está tal y como lo he puesto en el esquema
-
:shock: pues no me fije en eso 22uF, asi que ahi tiene un error, debe poner 22Pf, y tambien condensadores de desacoplo en el positivo y negativo(de 10Uf a 100Uf/ 16 voltio) y 100nf de plus a minus, asi que si eso son los detalle que nos da, esta mal aunque sea una bateria de 4,5 y mediste la corriente de bateria? porque en la bateria puede poner lo que quiera, pero sino mide con un multimetro, nunca sabra si el voltage esta bien o como es este caso que te varie la corriente al consumir muchos, pensar que para tantos LED necesitara minimo 1Amperio.
-
Efectivamente los condensadores son de 22pF, error mío en la transcripcción.
Con respecto a la pila, he medido la tensión con un voltímetro y efectivamente da los 4.5V, así que esa parte creo que no es. Por otra parte he probado a desconectar la mitad de los LEDs del circuito, dejando únicamente los 8 del puerto B, pero sigo teniendo el mismo resultado...
-
pero tu no contesta todos las preguntas que te he hecho,
tambien condensadores de desacoplo en el positivo y negativo(de 10Uf a 100Uf/ 16 voltio) y 100nf de plus a minus y si los tiene entonce me creo que es problema del Cristal, lo que podia hacer es hacer un programa que te haga intermitencia solo con un pin para asi saber si el cristal funciona o es error del circuito.
otras cosas no me queda mas que deducir.
-
Una cosa que no me había percatado, es que en el datasheet, en la sección:
15.0 ELECTRICAL CHARACTERISTICS
Absolute Maximum Ratings †
Dice:
Maximum current into VDD pin ...................................................250 mA
Es decir que por el pin VDD no puede circular más de 250mA, y con los 16 Leds encendidos, tal vez se haya pasado esa corriente o se esté muy cerca de sobrepasarla.
Y lo más importante:
† NOTICE: Stresses above those listed under “Absolute Maximum Ratings” may cause permanent damage to the
device. This is a stress rating only and functional operation of the device at those or any other conditions above those
indicated in the operation listings of this specification is not implied. Exposure to maximum rating conditions for
extended periods may affect device reliability.
-
Pero si 16 LEDs son demasiados... ¿Cómo es posible hacer secuencias con ese número de luces o más? He visto varios vídeos de montajes en los que 16 LEDs se encienden a la vez y van controlados por el mismo PIC.
De todos modos, como comento, con el nuevo PIC, que apenas ha estado encendido unos segundos, he probado a conectar solamente 8 LEDs y el resultado era el mismo. E incluso después de leer el mensaje anterior he quitado otros 4, de forma que incluso teniendo solamente 4 LEDs, los 4 se encienden a la vez.