TODOPIC
Microcontroladores PIC => - Niple - => Mensaje iniciado por: fievel en 06 de Enero de 2016, 20:31:30
-
Hola a tod@s. Soy nuevo en el foro y escribo porque quiero hacer una pequeña aplicación con un pic y quiero diseñar el programa con el sofware de niple ya que de ensambler no tengo idea, pero con niple tengo varias dudas entonces si alguien me puede hechar una mano le expondria lo que necesito y seguro lo soluciona ya que es muy simple.
Muchas gracias.
-
Pues para que te echemos una mano debes de ser un poco mas expplicito en lo que necesitas o dudas.
Soy partidario de explicarte las dudas y que el programa lo vayas realizando tu para asi aprender mejor.
Evidentemente te iriamos corrijiendo los fallos o dudas. :)
-
Hola fer_TACA, gracias por tu pronta respuesta.
El diagrama que quiero realizar está basado en un pic 12F629 (como ves es muy chiquitín) pero creo que sirve para lo que quiero y mientras no me llegan otros serviría para crear el proyecto en una placa de pruebas., Tengo configurado el oscilador interno y en la configuración de puertos tengo como salidas la Gp5 y Gp4 y como entradas la Gp0, Gp1 y Gp2, llevando una de las entradas a nivel alto quiero que una salida se ponga en intermitente durante el tiempo que yo le programe mediante los temporizadores hasta que pase la entrada a nivel bajo y así con la otra entrada y salida, la entrada que me queda quiero que ponga a nivel bajo las dos salidas independientemente de cual estuviera a nivel alto, he estado mirando varios tutoriales pero o son muy complejos para hacer lo que quiero o son tan simples que solo encienden un led por tiempo definido, entonces mi problema es que herramienta usar para que las salidas pasen de estado alto a bajo en función de las entradas.
Se que es muy básico pero te agradecería que me echaras una mano con unas breves explicaciones , no pretendo que me lo hagas tu ni que pierdas mucho tiempo con estas sencilleces.
gracias
-
Vayamos por lo simple y práctico para aprender, aunque esto luego no sea lo mas eficiente del programa. Te voy a indicar los pasos, lo realizas pasando al diagrama de bloques, adjuntas lo creado y se te corrije.
Pasos::
1º Una vez que creas el proyecto y le das el nombre con el que quieres tener guardado el programa, eliges el tipo de micro a utilizar.
2º Debes ir a la seccion de configuración del micro elegido, seleccionando lo que has indicado: ocilador interno,....
3º luego ya puedes empezar a añadir bloques, configurando primero, los pines que son entrada, los que son salida, etc.
4º Debes proceder a insertar el bloque de comprobar el estado de una de las entradas.
5º Si es el nivel que quierses activas la salida correspondiente y si no pasas al punto 9º
6º Realizas el retardo que precises
7º Vuelves a pasar la salida activada a desactivarla
8º Regresas al punto 4, repitiendo los puntos 4,5 y 6 hasta que veas que la entrada ha dejado de estar al nivel deseado
9º y en ese punto pasas a realizar lo mismo con la otra entrada y salida.
En principio creo que debes empezar por ahi para ver la logica. Me diras, pero y la otra entrada que apaga las 2 salidas. Bien por eso te decia que lo indicado hasta aqui no era la forma mas eficiente del programa dado que lo mejor es realizarlo con interrupciones pero eso es un "pelin" mas complicado y es mejor empezar por lo básico e ir aprendiendo poco a poco si eso es lo que deseas.
Una vez que veas que funciona lo indicado hasta ahora veremos la forma de apagar las luces usando la tercera entrada, sin el uso de interrupciones, asi como el funcionamiento de los timers ya que los delay o retardos dejan el micro como congelado sin poder realizar treas en paralelo mientras discurre el tiempo procesado.
De esta manera sale el programa un poco mas argo pero ya lo reduciremos y saldrá mas eficiente.
Pero todo esto es mejor irlo procesando poco a poco si lo que quieres es ir empezando poco a poco.
Para finalizar y no menos improtante queda una cosa de los micros que has elegido, tienes que comprobar que para que trabaje como oscilador interno, en las ultimas posiciones de memoria traen de fabrica pregrabado un valor en su memoria para el ajuste de la frecuencia de trabajo(calibración), pues bien, antes de grabar el ejecutabe generado por NIple debes de leer ese dato y te lo apuntas y a la hora de grabar el micro, una vez cargado tu hex en la memoria del grabador, tienes que editar esas posiciones ultimas y colocar el valor que has apuntado. Si no lo haces asi se pierde la calibracon del oscilador interno.
Bieno espero lo realizado para corregir.
-
Hola. Una duda, y ya es al principio, en el punto cuatro que indicas comprobar el estado de las entradas no se justamente cual de los bloques tengo que insertar para configurarlo, no se si es en asignar un valor o en puertos , se que para activar las salidas tengo que asignar un valor a un bit y poner dicha salida en uno o cero para que se ponga en estado alto o bajo pero no se que inserción tengo que realizar para que lea las entrada.
Se que es de mínimos pero en el manual me hago un lío con eso.
Gracias.
-
Para preguntar puedes utilizar la opción de "condición" bien desde el explorador o con el icono, según la imagen.
Luego seleccionas la entrada que quieras y listo.
-
Después de configurar los puertos inserto el globo de comparar bit para Gp0 y lo pongo en estado alto(1) luego indico que la salida deGp5 se ponga en estado alto que estea así durante 500msg, que pase a estado bajo que estea 500mse y cierro e bucle, con eso "creo" que estaria en intermitente un tiempo indefinido( hasta que mas adelante la Gp2 la configuremos para que la apage, pero al querer realizar eso mismo con la Gp1 supongo que tengo que crear otro diagrama partiendo del estado de los puertos pero creo que no es posible porque me da error, te adjunto archivo( haber como lo ves)
Nota: la idea es que cuando Gp0 esta en estado alto Gp5 estea realizando una intermitencia hasta que Gp2 se ponga en 1( mas adelante) y la pase a estado bajo.
-
Animo que vas bien.
Un par de cosas, según la ultima figura estas cerrando otra vez el bucle poniendo GP5 a 1. Con eso vas a estar siempre ahí cuando se cumpla que GP0 es igual a 1 y no saldrás del bucle nunca. Lo que debes de realizar es:
- en vez de regresar a GP5=1 regresa al bloque de pregunta si GP0=1. Con eso ya sales del bucle, aunque no estarás de forma indefinida como pretendes. De momento te vale para que vayas aprendiendo el desarrollo del programa.
- Con eso tienes completa la rama del si, Ahora tienes que terminar la rama del no, que debes de realizarla de la misma forma para completar las 2 temporizaciones y en ella puedes como has empezado comprobando el estado de GP1.
- Después de completar lo anterior y que veas que te funciona pasaremos a las intermitencias de forma indefinida.
Ahora vayamos con el error. Este no es u error como tal, según la figura 1. Se trata de un aviso ya que quieres colocar otro bloque justo en el bloque de configuración de puertos. Ya tienes puesto 1 (el de comprobación de GP0=1), por eso te dice que no puedes colocar otro bloque mas.
Para finalizar un par de aclaraciones y/o preguntas mas:
- ¿Que versión de Niple estas utilizando? Si es la 6.2, en vez de poner la s figuras adjunta el fichero npl del proyecto. De esa forma puedo abrirlo y corregirlo además de volverá enviártelo para que veas las diferencias entre lo que haces y lo que se te propone.
- Cómo simulas lo realizado ¿con una placa física con un simulador como Proteus?
-
La versión que utilizo es la V5.2, ya tiene tiempo, he visto que utilizas la 6.2 y he descargado la versión demo para trabajar con ella y mandarte las imágenes de ella pero no me da permisos para trabajar con el 12F629, entonces si crees que es mejor esa puedo pedir la licencia o si quieres cambiamos al pic 16f84a que si que da permisos y tengo uno para hacer el prototipo.
la idea de simular lo que realizaremos es en una plaquita de protoboard, he visto el programa de proteus pero nunca he trabajado con el, si crees que seria mas eficiente y es sencillo para empezar puedo ponerlo a andar.
Como me indicas he paso la flecha desde el último temporizador a" Bit Gp0=1" pero la trama del no "Gp0=0 yo quiero que con esa condición Gp5 estea a valor bajo, si creo otro globo donde indique Bit Gp0=0 y lo saco del globo anterior de" Bit gp0= 1" se pone la linea en rojo.
He intentado generar un archivo Asm de la primera rama(la del si) pero me da error, no se el porque,
Quiero entender en el programa que el globo de" incio" e el de "configurar puertos" solo se poner en el inicio y todos los demas se conectan desde esos porque me hago algo de lio de donde quitar los globos para que sea el sitio correcto.
Ya me dices.
-
Para lo de la licencia depende de ti pues me imagino que tendrá un coste.
Se puede hacer perfectamente con el 16F84 y la versión demo de 6.2
Los globos (bloques) se pueden poner uno debajo de otro excepto los de decision. Si consigues la demo de la versión 6.2 mañana adjunto un diagrama de lo que llevas realizado hasta ahora y un pequeño avance de lo que quieres con una breve ezplicaciin.
Por otra parte pada adjuntar archivos debes primero comprimirlos y después de bajo de la zona de escribir los post aparecela opción de adjuntos y otras opciones pinchas y buscas el archivo ckmprikido.
Perdona por las faltas estoy respondiendo desde el móvil.
-
¡Ah! Las líneas en rojo no son error. Para una mejor interpretación del diagrama, al llegar a los bloques de decisión, Niple los diferencia como azul dl camino del si y con rojo el camino del no.
-
Te adjunto el programa, tal y como he interpretado lo que necesitarías.
He usado el 16F84 y como la versión demo creo que solo permite poner 20 bloques he intentado reducirlo al máximo para que puedas verlo.
Te cuento como entradas he utilizado RB0, RB1 y RB2 y como salidas RA0 y RA1. Cuando se activa RB1 se pone la temporización de la salida de RA0. Si se activa la entrada RB2 se activa la salida RA1 y cuando se activa RB0 se van a apagar siempre RA0 y RA1.
Ahora bien esto tiene un problema que a ver si lo detectas, pues no es exactamente 100% lo que quieres. Lo he realizado asi para que veas la lógica del programa.
Cuando termine de escribir lo voy a corregir para que aprecies el efecto y ese si sea compatible 100% para lo que quieres realizar, pero me gustaría que fueras tu el que encontrase la solución.
-
Bueno parece que no puedo adjuntar el fichero, voy a ver si se puede resolver y si no te adjunto la imagen del proyecto.
-
El archivo
-
Hola, ya veo que has trabajado mas que yo, gracias, lo tengo ya abierto en Niple por lo que veo estaría listo para copilarlo y ver el funcionamiento, en el pic 16F84A Funcionaria? porque es el que tengo, miraré también si logro simularlo en proteus como practica y ya te cuento.
Seguramente me surgirán dudas, tengo también descargado el manual de niple le echaré un buen vistazo porque hay cosas básicas que hay que saber.
-
la pata RB0 que pones como entrada para poner las dos salidas RA0 y RA1 a estado bajo no me aparece en el pineado del pic, pero al editarlo si que aparece en la lista, eso no me cuadra.
He estado mirando y por lo que veo son compatibles los dos pics solo que el terminado en A tiene mas flash.
-
En el programa has creado cuatro condiciones que se pueden dar en dos de las entradas una de ellas cuando están las dos entradas a estado bajo las dos salidas están a cero, después cuando una de las entradas esta a estado alto se activa la salida correspondiente el tiempo definido por el temporizador y pasa a estado bajo vuelve leer las condiciones y no se seguro si se volvería activarse, supongo que si, lo mismo pasaría con la otra entrada y salia, y después esta cuando las dos entradas están al valor alto que activa las dos salidas juntas el tiempo del temporizador.
Lo que no me cuadra es la RB0, es la otra entrada que al estar en estado alto pone las dos salida a cero pero no se porque unes las dos salidas a ella y porque pusiste RB0 que no la veo en el pineado del pic pero si que aparece como te he escrito antes al editarla.
-
Hola, ya veo que has trabajado mas que yo, gracias, lo tengo ya abierto en Niple por lo que veo estaría listo para copilarlo y ver el funcionamiento, en el pic 16F84A Funcionaria? porque es el que tengo, miraré también si logro simularlo en proteus como practica y ya te cuento.
Seguramente me surgirán dudas, tengo también descargado el manual de niple le echaré un buen vistazo porque hay cosas básicas que hay que saber.
Si te tieme que funcionar solamemte. que al abrir el programa en el menu 1º debes selecionar la opcion de "Migrar proyecto" seleccionas el PIC 16F84 y ya puedes trabajar con el.
Buena idea eso de echar un vistazo al manual, aunque un poco antiguo te servira perfectamente.
la pata RB0 que pones como entrada para poner las dos salidas RA0 y RA1 a estado bajo no me aparece en el pineado del pic, pero al editarlo si que aparece en la lista, eso no me cuadra.
He estado mirando y por lo que veo son compatibles los dos pics solo que el terminado en A tiene mas flash.
Que raro te debe de aparecer al no ser que si estas trabajando con la version demo tenga algun defecto.
En el programa has creado cuatro condiciones que se pueden dar en dos de las entradas una de ellas cuando están las dos entradas a estado bajo las dos salidas están a cero, después cuando una de las entradas esta a estado alto se activa la salida correspondiente el tiempo definido por el temporizador y pasa a estado bajo vuelve leer las condiciones y no se seguro si se volvería activarse, supongo que si, lo mismo pasaría con la otra entrada y salia, y después esta cuando las dos entradas están al valor alto que activa las dos salidas juntas el tiempo del temporizador.
Lo que no me cuadra es la RB0, es la otra entrada que al estar en estado alto pone las dos salida a cero pero no se porque unes las dos salidas a ella y porque pusiste RB0 que no la veo en el pineado del pic pero si que aparece como te he escrito antes al editarla.
Efectivamente he utilizado 4 condiciones de preguntas. Niple en las ultimas versiones tiene la posibilidad de realizar multiples condiciones de preguntas a la vez. Como tienes 2 entradas al final tienes 4 posibles casos.
Si he realizado asi las uniones es por el motivo de que la version demo, creo que solo permite colocar 20 bloques y he intentado minimizarlos al minimo para que veas el funcionamineto.
Como sabes dede el principio te dije que no es la forma mas efectiva de hacerlo pero si era buena para aprender el funcionamineto.
Pense que te darias cuenta de la pequeña "trampa " que puse para ver si lo detectabas. Se trata de que falta un bloque de temporizacion, justo antes de comprobar el estado de RB0. Si no lo pones tendras las salidas activas 500msg. Se apagaran e inmediatamnete se van a volver a encender debido a que a la velocidad que trabaja el micro en seguida se retorna ala parte de nueva comprobaciones del estado de las entradas.
El pin RB0 te debe de apareer si o si. Si uni las 2 es porque indicas que al ser 1 esa entrada se apague la salida activa. Porque lo hice asi, ya te digo que para ahorrar bloques si no tuviese esa limitacion lo habria realizado de ptra manera para que lo entendieras. Si cuando está activa alguna la tienes que pagar al poner RB0. ¿que mas te da poner las 2 a la vez? Si una ya lo esta no pasa nada por seguir poniendola a 0.
Te habras fijado que todavia no te he comentado como hacerlo mas efectivo, pues el programa tiene el defecto que siempre te indicado al inicio y prefiero que lo veas tu en el momento de probarlo.
-
Hola fer, he estado mirando bien el diagrama y efectivamente le falta como mínimo otra temporización, tienes toda la razón se la añadiré para ver los cambios que aparecen, pero el programa que realizaste una vez que lo migro y "espero hacerlo bien" cuando voi a archivo generar codigo ASM me da un error te envío pantalla de ello.
Por otro lado y aún mas importante es la carta que he visto hoy al entrar en el foro que has dejado, mucha gente te extrañara por aquí y yo el primero porque el poco tiempo que llevo tratando contigo ya has dejado miga para mi.
Un abrazo.
-
Al final para poder generar el código ASM he tenido que hacer otra traza desde RB0=1 a RA0=0 y así no me ha creado errores pero no entiendo porque tiene que tener dos trazas RB0=1
-
Por lo que parece es un bloque de decision. es decir tenes una salida de cuando se cumple, y una salida para cuando NO se cumple.
Si vos unicamentes definis 1 sola, el programa no puede adivinar que hacer con la otra salida. Entonces te tira el error.
Al menos eso es lo que entendi con tu imagen, lamentablemente no se puede ver el cuadro donde esta el error (ya que lo tapa el mismo mensaje de error). Y yo no manejo Niple, pero viene por ahi el tema.
-
No se que paso pero te respondi y por lo que se ve el post no está, te adjunte el fichero incluso con el programa migrado al 16F84A.
El problema surgia porque desde la toma de decision de Rb0 falta una union a la primera decision donde pruebas si RB1y RB2 son igual a 0.
Cuando llegue a casa lo vuelvo a adjuntar.
Te debe de funcionar (salvo lo indicado desde el principio) y genrar los ficheros ASM y hex sin probemas.
-
El fichero corregido
-
Gracias Killerjc , justamente andaba por ahí el problema, faltaba otra salida de ese bloque , me lo solucionó Fer en un momento.
He logrado probarlo en proteus y después de un buen rato, porque es la primera vez que trabajaba con ese programa he logrado hacerlo funcionar.
-
Señor Fer_taca. Ese programa lo he simulado en proteus y con el otro temporizador que le has colocado ahora se encienden y apagan las salidas, tomo nota para realizar yo otros ejercicios ya que desde proteus me resulta mas fácil probarlos que en la protoboard.
Me comentabas que existía una forma mas sencilla de realizarlo por medio de tmrs "creo" no seria mucho pedir que me enseñara, y una última cosa ya para no molestarlo mas,¿ si quisiéramos que las entradas RB0,RB1 y RB2 se quedaran en estado alto (internamente en el pic ) aunque la tensión real en la pata del pic fuera estado bajo ( es decir que la pata la alimentara a estado alto un simple pulsador) se podría hacer de una forma entendible para mi poca experiencia?
-
Sir, claro que puedo. De hecho ya te tengo preparada la mejora que te he venido comentando. Pero voy a prepararte jna explicación para que lo entiendas y veas por que lo realizado hasta tiene ese problema. Es más como puedes simularlo on Proteus puedes estudiar el comportamiento de forma rapida. Dame jnas horas y te lo pongo todo.
-
Si ya has visto y probado que el programa piensas que te funciona, voy a intentar explicarte el porque es muy correcto el hacerlo así:
Según está el funcionamiento es secuencial, es decir el micro ejecuta un bloque, cuando termina ese bloque empieza con el segundo, después el tercero y asi sucesivamente.
¿Pero que pasa al llegar a los delays? Exactamente lo mismo, el micro empieza a contar desde 0 hasta los 500msg. Pero esto es lo más importante. Se queda ahí y no hace otra cosa hasta que su cuenta llega al final y esto no es bueno, Te explico, imaginemos un caso real:
Tienes una máquina que hace un determinado proceso (poner en marcha un motr) que cuando recibe un 1 en su entrada y comienza su ciclo de parada, encendiendo y parando un motor. Piensa también que en vez de 500msg. tienes temporizaciones digamos de 1 minuto. Pues el motor se pondría en marcha durante ese minuto se pararía después durante otro minuto y así sucesivamente hasta que la entrada cambiase a nivel bajo.
¿Pero qué sucedería si durante el minuto que está en marcha se produce algún tipo de accidente? ¿Cómo y cuándo se desconectaría el motor? Bien para eso tendríamos la entrada, que en tu programa es RB0 y que podría ser como una parada de emergencia y que cuando se active paré de forma incondicional el motor (más o menos era lo planteado inicialmente en tu programa).
Pues lo que sucedería es que hasta que no trascurriese el 1 minuto de la temporización (tiempo en ON) más el otro tiempo de descanso, no tienes acceso a parar el sistema. Puedes probarlo y veras como es así. Cambia los valores del tiempo en ON a 1 minuto y el tiempo en OFF a 500mg. esto pasa con una de las entradas, pero para la otra pasa lo mismo.
Como se soluciona esto. Fácil, los micros tienen la posibilidad de ejecutar varias cosas a la vez o en 2º plano. Para ello dispone de mecanismos como los “tmr” para realizar temporizaciones; “interrupciones” que son digamos como señales de emergencia que son atendidas de forma prioritaria cuando son llamadas. Por el momento dejemos a un lado los “timers o tmr” y centrémonos en las interrupciones.
Si estas son eventos que son atendidos de forma inmediata ¿no crees que podría ser justo lo que necesitamos para resolver el problema. Bien pues todo micro, dependiendo de su constitución puede tener varias de ellas como: detección de cambio lógico en alguna entrada, fin de la conversión A/D; fin de transmisión o recepción de datos, etc. Eso lo puedes ver en los datasheet del micro que utilices en cada caso.
Como habrás visto en el programa te había asignado a RB0 la acción de resetear las 2 salidas en el momento de detectar si su nivel era un 1. La elección no fue caprichosa, ya que esta entrada tiene la posibilidad de ser configurada para la detección de su cambio de estado en el momento de producirse bien sea por un tránsito de nivel bajo a nivel alto o viceversa.
Bueno pues cambiando un poco el programa podes hacer uso de esta interrupción y tendríamos el caso solucionado de forma que cuando se detecte un paso de nivel bajo a nivel alto, pues la acción a realizar se pase a dejar las salidas a nivel bajo.
Bueno antes de dejarte l programa, te dejo que estudies lo indicado e intentes realizarlo, sino lo consigues me avisas y te adjunto el fichero.
Luego ya veremos el tema de cambiar los interruptores por pulsadores y el uso de manejo de los timers, pero para eso creo que si la versión demo solo te permite el uso de 20 bloques va a ser difícil el poder realzarlo. Lo estudiaré en todo caso.
Espero que hayas entendido la explicación y si no me indicas lo que no entiendas e intento hacerlo mejor.
-
Hola, me parece muy bien la expliación que me realizas, con todo lo que me indicas haré las modificaciones en el programa sobre los tiempos y veré sobre proteus como funciona, intentaré cambiar la configuración de la entrada RB0 para que realices lo que indicas,"espero ser capaz "y referente al problema del número de bloques limitado que tiene la versión demo no te preocupes que este fin de semana le daré solución para poder trabajar con el programa al 100%.
Un saludo, y buen fin de semana para todos.