Si además quieres enviarnos un Artículo para el Blog y redes sociales, pulsa el siguiente botón:
Buenas tardes de Nuevo a Tod@s
Pues he aquí mi segundo Post y este si es de consulta, así que si alguien tiene un ratillo y ganas a ver si me puede ayudar.
Hasta hace menos de una semana he estado programando PIC a pelo con el ASM y el MPLAB, después de haber invertido horas y horas en hacer programillas tan complejos como pudiera ser sacar por un puerto B de un 16F84A lo que entra por un A me he dado cuenta que salvo que seas muy bueno con ASM y sepas lo que te haces no merece la pena seguir trabajando en ASM, así que me decidí a probar algún ensamblador, al final opte por usar un ensamblador de BASIC debido a cuestiones practicas ya que en mi trabajo uso una serie de tarjetas de Motion Control que se programan en un Pseudo Basic. lo cual facilita bastante las cosas a un pseudo autodidacta como yo (al mas estilo Juan Palomo yo me lo guiso yo me lo como) y como la mayoría de los que frecuentaran este foro.
El material de que disponía era un 16F84A y un 16F877A, una placa que prepare para el 16F84 que consiste en un cristal de 20 MHZ (lo máximo que permite el micro) con pulsadores conectados al puerto A y led al puerto B, algo muy sencillo pero útil para comenzar a probar el compilador de Basic. Tras hacer los primero pinitos y aprender lo básico para hacer andar el compilador y comenzar a programar algo Basic (con PicBasic Pro que no lo había dicho todavía) encontré lo primero que no me convencía, con PicBasic Pro tienes que escribir el código en un editor de texto, salvarlo con extensión .Pas y luego bajo línea de MsDos escribir algo como:
C: PBP -16f84 prueba1.pas
Esto te genera entre otros el archivo .Hex que te lo llevas al IcProg y lo quemas en el PIC para probar. Me puse a Buscar y por supuesto había algo mas sencillo que era usar como editor de texto el programa MicroCode Studio que una vez enlazado con el ProBasic Pro (PBP de ahora en adelante) facilitaba mucho las cosas pues desde el propio programas puedes escribir el código, este te "corrige", te ordena variables y Loops, te permite elegir micro y dando solo al botón de Compilar te ahorra ir al MsDos.
Bueno pues primer "inconveniente" solventado, pero claro poco después surgió un nuevo "inconveniente", resulta que el hecho de poder compilar un programa en Basic que efectivamente no tiene errores de estructura no quiere decir que este vaya hacer lo que tu querías que hicieras, y tras hartarme de sacar le PIC de la placa y meterlo en el TE20 y de vuelta a la placa y que no hiciera exactamente lo que debiera me puse a buscar una salida mejor, al final fui a dar con Proteus, bastante conocido (supongo), que consiste en un Software estilo Orcad (salvando las distancias) que incluye una herramienta llamada ISIS que permite dibujar un esquema incluyendo pulsadores y led animados e incluir en el esquema Micros a los que se les puede cargar el HEX y simular su comportamiento.
Tras las pruebas de rigor y sus consiguientes meteduras de pata conseguí finalmente dibujar un "simulador" que incluye el 16F84 con led y pulsadores en sus puertos, comencé a simular todos los programas que había hecho y estaban probado en el PIC físico y todos fueron emulados a la perfección, a partir de ahí seguí usando este método, programar en MicroCode Studio y simular en el Proteus, cuando todo era simulado en Proteus OK lo tostaba al PIC y como era de esperar el comportamiento era el mismo.
PERO, tiene que haber un pero porque si no vosotros (que a estas alturas estáis comenzando a preguntaros si voy a contar toda mi vida, obra y milagros en verso) no estaríais leyendo esto, Resulta que he hecho un programa chorra sin mas finalidad que me capture determinados valores que pongo a la entrada del Puerto A los almacene cada uno de ellos en una variable que tiene asignada y cuando yo de pulsos a una patilla del puerto B me los vaya sacando por dicho puerto (cada pulso sacara un valor hasta no tener mas valores almacenados), Pues resulta que lo programo, lo compilo, todo correcto, cargo en el Proteus el Hex, lo simulo y todo correcto y cuando lo tuesto en el PIC NO FUNCIONA.
El PIC debe de estar bien, porque he probado de nuevo a cargar los primero programas y parece que funciona correctamente, y el código debería de estar bien porque si el simulador corre el HEX de forma correcta, si hubiera usado el archivo pas para el simular se podría entender algún funcionamiento distinto pero es que es el propio Hex (que no tiene nada que ver de que ensamblador venga), en fin el código que uso es el siguiente :
TRISA=1
TRISB=%10000000
DEFINE OSC 20
TEM VAR BYTE
ENTRADA VAR BYTE
PISOB VAR BYTE
PISO1 VAR BYTE
PISO3 VAR BYTE
PISO7 VAR BYTE
PISO15 VAR BYTE
PISO31 VAR BYTE
ENTRADA=0
PISOB=0
PISO1=0
PISO3=0
PISO7=0
PISO15=0
PISO31=0
PORTB=0
LAZO:
ENTRADA=PORTA
IF ENTRADA <> 0 THEN
IF ENTRADA=1 THEN
PISOB=ENTRADA
ENDIF
IF ENTRADA=2 THEN
PISO1=ENTRADA
ENDIF
IF ENTRADA=4 THEN
PISO3=ENTRADA
ENDIF
IF ENTRADA=8 THEN
PISO7=ENTRADA
ENDIF
IF ENTRADA=16 THEN
PISO15=ENTRADA
ENDIF
IF ENTRADA=32 THEN
PISO31=ENTRADA
ENDIF
ENDIF
IF PORTB.7=1 THEN
IF PISOB<>0 THEN
PORTB=PISOB
PISOB=0
pause 500
LAZO1:
IF PORTB.7=1 THEN
GOTO LAZO1
ENDIF
LAZO2:
if PORTB.7=0 THEN
GOTO LAZO2
ENDIF
ENDIF
IF PISO1<>0 THEN
PORTB=PISO1
PISO1=0
pause 500
LAZO3:
IF PORTB.7=1 THEN
GOTO LAZO3
ENDIF
LAZO4:
IF PORTB.7=0 THEN
GOTO LAZO4
ENDIF
ENDIF
IF PISO3<>0 THEN
PORTB=PISO3
PISO3=0
pause 500
LAZO5:
IF PORTB.7=1 THEN
GOTO LAZO5
ENDIF
LAZO6:
IF PORTB.7=0 THEN
GOTO LAZO6
ENDIF
ENDIF
IF PISO7<>0 THEN
PORTB=PISO7
PISO7=0
pause 500
LAZO7:
IF PORTB.7=1 THEN
GOTO LAZO7
ENDIF
LAZO8:
if PORTB.7=0 THEN
GOTO LAZO8
ENDIF
ENDIF
IF PISO15<>0 THEN
PORTB=PISO15
PISO15=0
pause 500
LAZO9:
IF PORTB.7=1 THEN
GOTO LAZO9
ENDIF
LAZO10:
if PORTB.7=0 THEN
GOTO LAZO10
ENDIF
ENDIF
IF PISO31<>0 THEN
PORTB=PISO31
PISO31=0
pause 500
LAZO11:
IF PORTB.7=1 THEN
GOTO LAZO11
ENDIF
LAZO12:
if PORTB.7=0 THEN
GOTO LAZO12
ENDIF
ENDIF
PORTB=0
ENDIF
GOTO LAZO
Se que es un poco demasiado extenso y que se podría haber simplificado pero es el resultado de muchas modificaciones para conseguir que fuera lo mas PASO A PASO posible.
¿El comportamiento del PIC? pues en OCASIONES si activo la patilla 0 del puerto A y luego llamo al valor almacenado con la patilla 7 del Puerto B lo saca bien, ahora si hago lo mismo para la patilla 1 ya no funciona (casi nunca) además para el resto de patillas funciona a veces pero lo que es peor es que cuando el PIC hace "algo" no se parece ni por asomo a lo que debería, por ejemplo cuando "funciona" si activo la patilla cero de A y luego la 7 de B saca por B el valor almacenado correctamente pero si activo la patilla 0 de A y luego activo la Patilla 2 al darle una vez al 7 de B debería activar la patilla 0 de B y al siguiente pulso que ponga en la patilla 7 de B debería de activar la patilla 2 de B, pues bueno en los casos en los que el PIC hace algo (uno de cada 10) solo activa al primer flanco de la patilla 7 de B la patilla 2 de B, es decir es como si solo almacenara el ultimo valor (en los casos remotos e improbables en los que funciona)
Los Pauses los puse como medida antirebote por si venían de ahí los problemas pero nada de nada
Nada más, que no es Poco, ya el hecho de que alguien haya llegado a leer hasta aquí es motivo para agradecérselo pues he soltado un tostón increíble, a los que me puedan aportar algo y a los que lo hayan leído entero solo puedo más que agradecerlo
GRACIAS
Me imagino que los pulsos en cada patita lo haces con pulsadores (Normalmente abierto), de ser así coloca un capacitor en paralelo al pulsador de 0.1 microfaradio, esto limita el efecto de rebote (transitivo). De no funcionar intenta con uno de la mitad del valor (0.047 estaría vien) y así sucecivamente. Si tienes duda de como leer el valor (el código) de un capacitor de estos valores te puedo enviar una tablita.
Entre mas rapido sea un PIC (velocidad de instrucciones: 1 instruccion cada 4 pulsos de reloj), es más propenso al ruido y efectos de rebote (transitivos). Revisa tu circuito, por ejemplo en la alimentación del PIC VDD si no lo tiene, puedes colocar un capacitor de 0.1 microfaradio en paralelo a tierra (físicamente pegado a la patita de VDD: Pata 14 para el 84 y 11 y 31 para el 877).
Espero te sirva 😀
Gracias por la respuesta, efectivamente el pulso lo doy por alta al cerrar un interruptor normalmente abierto, ademas todas las patillas para evitar problemas de ruido las tengo llevadas a tierra atraves de resistencias,no tengo puesto los condensadores en cuanto esté delante de la placa se los coloco, pero sin animo de desmerecer tu respuesta (siempre agradezco un buen consejo) realmente crees que puede ser ese el problema, le he colocado precisamente los Pause para (aunque sea de forma cutre) evitar los problemas con este efeto, de hecho las pausas son de 0,5 seg lo cual es tiempo mas que suficiente para que se estabilice la señal (creo).
Aparte de colocarle los condensadores voy a cambiarle el cristal por otro de 4 MHz para por un lado reducir probabilidad de ruidos y por otra para poder meterle a la misma placa 16F84 que solo permite frecuencias de hasta 8 MHz a diferencia de los 16F84A (el que estoy usando) que permite llegas hasta los 20 Mhz. Con esto se me plantea otra cuestion, estube mirando en su momento a la hora de montar el oscilador y finalmente monte un Cristal de 20MHz con sus respectivos condensadores, pero tambien vi que aparte de cristales venden lo que llaman osciladores, ¿estos osciladores ya vienen preparados para ser soldados y listo o hay que ponerle tambien los condensadores? es decir ¿estos osciladores que son? ¿un RC integrado o algo así? ¿hay alguna diferencia de precision? porque por lo que he visto normalmente estos osciladores llevan frecuencias de EJ: 43,33333 MHz y frecuencias asi.
Pd. El tipo de condensador he de suponer que da igual que sea electrolitico (manteniendo la polaridad), ceramico o de cualquier otro tipo ¿verdad?
Respecto al cristal, es mas que suficiente para mantener en funcionamiento a cualquier PIC, de hecho estan diseñados para funcionar perfectamente con el arreglo del cristal y los dos capacitores.
Los cristales son muy confiables, de hecho son los que se utilizan para generar portadoras en todos los sistemas de telecomunicaciones, equipo medico, relojes, etc.
El condensador o capacitor puede ser ceramico o de papel, lo comun es el ceramico o sea los que regularmente tienen forma de ruedita, para este caso la nomenclatura es de 104 (0.1uF). Revisa la tabla para interpretar otros valores.
Los osciladores pueden ser focos de problemas, funcionan con tensiones muy pequeñas y tienen impedancias muy altas. Esto hace que las capacidades parásitas de los circuitos impresos o el ruteo de las pistas que van al cristal sean bastante críticos. Algunas veces los osciladores no arrancan, hay que probar condensadores de distintos valores e incluso poner una resistencia de 10M en paralelo con el cristal. Medir con un osciloscopio en las patas del cristal deforma totalmente la medida, por la capacidad de la sonda, y normalmente hace que el oscilador se pare.
Tengo un amigo que tuvo que desistir de usar un A/D porque no fué capaz de que el oscilador arrancara, es un profesional del diseño, tiene su propia SL dedicada a eso.
Normalmente no hay problemas, pero cuando los hay solucionarlos es muy dificil.
Los osciladores son como circuitos integrados, llevan internamente el cristal y circuito oscilador y amplificador. Se alimentan a 5V (ó 3,3V) y dan una salida cuadrada compatible con TTL. Son caros, porque suelen ser de mucha precisión. Si pone 4.00000Mhz significa que tienen una precisión de 10Hz, garantizan que se cumple lo que llevan impreso. El único condensador que necesitan es el de desacoplo, como cualquier otro integrado.