Autor Tema: Control de encendido y apagado de una bomba usando PIC 16F84.  (Leído 17301 veces)

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

Desconectado quantum27

  • PIC10
  • *
  • Mensajes: 10
Control de encendido y apagado de una bomba usando PIC 16F84.
« en: 31 de Mayo de 2013, 20:35:04 »
Saludos amigos de todopic, soy muy muy novato en este extenso mundo de los microcontroladores, apenas he desarrollado un par de programas en CSS 4.1 simulandolos en Proteus 8.


Ojala me puedan apoyar, intento desarrollar un pequeño proyecto, que a continuación describo:

Se trata de controlar una bomba de agua, que se encienda cuando un tánque se vacíe y que se detenga cuando este se llene, mostrando en un display de 7 segmentos 5 estados: 0=vacio, 1=1/4, 2=a la mitad, 3=3/4 y 4=lleno... y además se debe encender el punto decimal del display cuando la bomba está prendida y apagar cuando se apaga.

Resumiendo entonces se trata de 2 corridas: 1) cuando el tanque está vació y comienza a llenarse (bomba prendida) hasta que llega al estado lleno (bomba se apaga). 2) Cuando el tanque se está vaciando, la bomba no se prende hasta que se llegue al estado vacio.


Lo intente usando un switch, pero me fastidie pronto y ahora lo hice con estructuras if... Lo pego abajo. Pienso que el problema está en los puertos porque al hacer la simulación en proteus, los puertos de salida B, parecen muertos y no mandan nada al display... ya me desesperé, tal vez sea algo muy tonto de resolver, pero no es mi área, solo que quiero inciarme, mil gracias a todos los que gusten asesorarme.


Código: [Seleccionar]

#include <16F84A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#use delay(clock=4000000)

#BYTE TRISA = 0x85    // Configuramos el TRISA
#BYTE TRISB = 0x86    // Configuramos el TRISB
#BYTE PORTA = 0x05    // Configuramos el PORTA
#BYTE PORTB = 0x06    // Configuramos el PORTB


void main
{

   TRISA = 0xff;
   TRISB = 0x00;
  
   int x;
 while (true)
   {
  x = 0;  
   if (x == 0)
 {
 output_high(pin_B7);
 }
 
 if (x == 1)
 {
 output_low(pin_B7);
 }
 
 
  while (x==0)
  {
 
   if (PORTA == 0X00 )
   {
       PORTB = (0xBF);
   }
  
   if (PORTA == 0X01)
   {
      PORTB = 0x86;
   }
      
   if (PORTA == 0X02)
   {
      PORTB = 0xDB;
   }
  
    if (PORTA == 0X03)
   {
      PORTB = 0xCF;
   }
      
    if (PORTA == 0X04)
   {
      PORTB = 0xE6;
   }
 }
 
 
  while (x==1)
  {
  
   if (PORTA == 0X00)
   {
      PORTB = 0xBF;
   }
  
   if (PORTA == 0X01)
   {
      PORTB = 0x86;
   }
      
   if (PORTA == 0X02)
   {
      PORTB = 0xDB;
   }
  
    if (PORTA == 0X03)
   {
      PORTB = 0xCF;
   }
      
    if (PORTA == 0X04)
   {
      PORTB = 0xE6;
   }
 }
}

}



Estoy usando la "x" como indicador de bomba prendida o bomba apagado. El programa me corre sin errores ni warnings, tal vez mi error también esta al hacer la simulación, si gustan subo el archivo de proteus también.


Gracias por todo amigos y saludos desde Mx.  (((:-)))
« Última modificación: 31 de Mayo de 2013, 20:45:33 por quantum27 »

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: Control de encendido y apagado de una bomba usando PIC 16F84.
« Respuesta #1 en: 31 de Mayo de 2013, 20:54:02 »
COnecta una resistencia de 10K en la patilla de MCLR y 5v. Si ya tienes eso checa esto.

En vez de usar hexadecimal para escribir y leer los puertos usa decimal o binario es mas sencillo o para hacerlo mas claro usa binario poniendo 0b10101010 donde los

ejemplo:

portb=0b01010101; donde         |   0   |   1   |    0   |   1   |   0   |   1   |   0   |   1   |
                                               | RB7 | RB6 |  RB5 | RB4 | RB3 | RB2 | RB1 | RB0 |
asi te podra ser mas facil ver que estas mandando prender y apagar.

Seria bueno ver el diagrama de proteus.

Desconectado quantum27

  • PIC10
  • *
  • Mensajes: 10
Re: Control de encendido y apagado de una bomba usando PIC 16F84.
« Respuesta #2 en: 31 de Mayo de 2013, 21:10:21 »
COnecta una resistencia de 10K en la patilla de MCLR y 5v. Si ya tienes eso checa esto.

En vez de usar hexadecimal para escribir y leer los puertos usa decimal o binario es mas sencillo o para hacerlo mas claro usa binario poniendo 0b10101010 donde los

ejemplo:

portb=0b01010101; donde         |   0   |   1   |    0   |   1   |   0   |   1   |   0   |   1   |
                                               | RB7 | RB6 |  RB5 | RB4 | RB3 | RB2 | RB1 | RB0 |
asi te podra ser mas facil ver que estas mandando prender y apagar.

Seria bueno ver el diagrama de proteus.

Muchas gracias por tomarte el tiempo de responder Gab163, si utilizo la resistencia que mencionas, probaré tu sugerencia y aqui una captura de la simulación, mil gracias.


Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Control de encendido y apagado de una bomba usando PIC 16F84.
« Respuesta #3 en: 31 de Mayo de 2013, 21:43:37 »
Hola,

pues si te estas iniciando, lo primero creo que ya lo has logrado, que es determinar mediante reglas el funcionamiento del programa. Ahora deberías llevarlo un poco más lejos y plantearlo en pseudocódigo:

mientras siempre
    si tanque vacio
        encender bomba
        mostrar bomba encendida en display
        mientras tanque no completamente lleno
             refrescar estado de nivel de tanque en display
        fin mientras
        apagar bomba
    sino
        mostrar estado actual del tanque en display
    fin si
fin mientras

Una vez que lo  tienes en pseudocódigo es más sencillo llevarlo a un lenguaje, en este caso a C.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado quantum27

  • PIC10
  • *
  • Mensajes: 10
Re: Control de encendido y apagado de una bomba usando PIC 16F84.
« Respuesta #4 en: 31 de Mayo de 2013, 21:55:17 »
Hola,

pues si te estas iniciando, lo primero creo que ya lo has logrado, que es determinar mediante reglas el funcionamiento del programa. Ahora deberías llevarlo un poco más lejos y plantearlo en pseudocódigo:

mientras siempre
    si tanque vacio
        encender bomba
        mostrar bomba encendida en display
        mientras tanque no completamente lleno
             refrescar estado de nivel de tanque en display
        fin mientras
        apagar bomba
    sino
        mostrar estado actual del tanque en display
    fin si
fin mientras

Una vez que lo  tienes en pseudocódigo es más sencillo llevarlo a un lenguaje, en este caso a C.

Saludos.


Gracias Bruno, comprendo el pseudocodigo, lo que no me queda claro es la configuración de los puertos, y sobre todo el porque en mi simulación el puerto B parece no activarse cuando el introduzco las entradas al puerto A.

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: Control de encendido y apagado de una bomba usando PIC 16F84.
« Respuesta #5 en: 31 de Mayo de 2013, 22:44:05 »
Saludos amigos de todopic, soy muy muy novato en este extenso mundo de los microcontroladores, apenas he desarrollado un par de programas en CSS 4.1 simulandolos en Proteus 8.


Ojala me puedan apoyar, intento desarrollar un pequeño proyecto, que a continuación describo:

Se trata de controlar una bomba de agua, que se encienda cuando un tánque se vacíe y que se detenga cuando este se llene, mostrando en un display de 7 segmentos 5 estados: 0=vacio, 1=1/4, 2=a la mitad, 3=3/4 y 4=lleno... y además se debe encender el punto decimal del display cuando la bomba está prendida y apagar cuando se apaga.

Resumiendo entonces se trata de 2 corridas: 1) cuando el tanque está vació y comienza a llenarse (bomba prendida) hasta que llega al estado lleno (bomba se apaga). 2) Cuando el tanque se está vaciando, la bomba no se prende hasta que se llegue al estado vacio.


Lo intente usando un switch, pero me fastidie pronto y ahora lo hice con estructuras if... Lo pego abajo. Pienso que el problema está en los puertos porque al hacer la simulación en proteus, los puertos de salida B, parecen muertos y no mandan nada al display... ya me desesperé, tal vez sea algo muy tonto de resolver, pero no es mi área, solo que quiero inciarme, mil gracias a todos los que gusten asesorarme.


Código: [Seleccionar]

#include <16F84A.h>

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES NOPUT                    //No Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading
#use delay(clock=4000000)

#BYTE TRISA = 0x85    // Configuramos el TRISA
#BYTE TRISB = 0x86    // Configuramos el TRISB
#BYTE PORTA = 0x05    // Configuramos el PORTA
#BYTE PORTB = 0x06    // Configuramos el PORTB


void main
{

   TRISA = 0xff;
   TRISB = 0x00;
  
   int x;
 while (true)
   {
  x = 0;  
   if (x == 0)
 {
 output_high(pin_B7);
 }
 
 if (x == 1)
 {
 output_low(pin_B7);
 }
 
 
  while (x==0)
  {
 
   if (PORTA == 0X00 )
   {
       PORTB = (0xBF);
   }
  
   if (PORTA == 0X01)
   {
      PORTB = 0x86;
   }
      
   if (PORTA == 0X02)
   {
      PORTB = 0xDB;
   }
  
    if (PORTA == 0X03)
   {
      PORTB = 0xCF;
   }
      
    if (PORTA == 0X04)
   {
      PORTB = 0xE6;
   }
 }
 
 
  while (x==1)
  {
  
   if (PORTA == 0X00)
   {
      PORTB = 0xBF;
   }
  
   if (PORTA == 0X01)
   {
      PORTB = 0x86;
   }
      
   if (PORTA == 0X02)
   {
      PORTB = 0xDB;
   }
  
    if (PORTA == 0X03)
   {
      PORTB = 0xCF;
   }
      
    if (PORTA == 0X04)
   {
      PORTB = 0xE6;
   }
 }
}

}



Estoy usando la "x" como indicador de bomba prendida o bomba apagado. El programa me corre sin errores ni warnings, tal vez mi error también esta al hacer la simulación, si gustan subo el archivo de proteus también.


Gracias por todo amigos y saludos desde Mx.  (((:-)))


Hola.
Estas chequeando por X=0 y X=1. Tenes una inicializacion de x=0, luego ¿como o quien cambia x a 1? porque en tu codigo no lo he visto. Me parece que siempre esta haciendo la parte de x=0 y no la de x=1. Me parece que tendrias que poner alguna pausa o contador para poder visualizar los datos en el display, como por ejemplo el punto que titila.
Me parece que la inicializacion de x tendrias que hacerla fuera del while (true), pero eso depende de como corrijas tu programa (despues de la observacion anterior)
Estaria bueno que utilizaras los if anidados. En este caso tu programa funciona igual, pero es una buena practica utilizarlos para acostumbrarte para programas mas complejos.
Un consejo, con las mejores buenas intenciones, es que con la ayuda de un buen libro de C te pongas ha hacer programas en la PC olvidandote de los microcontroladores. Es para que mejores tu nivel de programacion, podria probar los ejemplos del libro o los ejercicios que suelen traer los capitulos al final.
Saludos

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: Control de encendido y apagado de una bomba usando PIC 16F84.
« Respuesta #6 en: 31 de Mayo de 2013, 22:54:24 »
Corroborrando lo de Darkman en ningún lado cambia el valor de x a 1; armate bien tu pseudocodigo y por el foro hay algunos manuales y tutoriales para que comiences a hacer mas aplicaciones saludos. :mrgreen:

Desconectado quantum27

  • PIC10
  • *
  • Mensajes: 10
Re: Control de encendido y apagado de una bomba usando PIC 16F84.
« Respuesta #7 en: 31 de Mayo de 2013, 23:19:22 »
Corroborrando lo de Darkman en ningún lado cambia el valor de x a 1; armate bien tu pseudocodigo y por el foro hay algunos manuales y tutoriales para que comiences a hacer mas aplicaciones saludos. :mrgreen:

Tienen razón Gab163 y Darkman en que se me escapo poner a x como bandera, y solo haría la parte de x=0, sin embargo, ese no es mi conflicto principal, mi duda que no me daja en paz, es por que en la simulación puerto b no se prende nunca y el display está muerto, si el problema fuera que no cambio de valor para x=1, por lo menos encenderia el punto decimal o ejecutaria las tareas para x=0, pero no hace nada.... ya no es que lo haga mal, en cuyo caso es obvio que está mal mi codigo, no hace nada, lo cual quiere decir que hay un error en la configuración de los puertos, pero por más que leo e investigo no encuentro el error.


De cualquier forma gracias por tomarse el tiempo.

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Control de encendido y apagado de una bomba usando PIC 16F84.
« Respuesta #8 en: 01 de Junio de 2013, 00:31:27 »
Hola quantum27, te sugiero que inicies con lo basico, configurando puertos prendiendo y apagando leds, luego prueba con botones. Obviamente aun estas empezando y estas queriendo correr a ciegas, en el foro ya hay bastantes ejemplos de CCS.

ESTO TE SERVIRA


Saludos!! :P
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado quantum27

  • PIC10
  • *
  • Mensajes: 10
Re: Control de encendido y apagado de una bomba usando PIC 16F84.
« Respuesta #9 en: 01 de Junio de 2013, 01:04:51 »
Hola quantum27, te sugiero que inicies con lo basico, configurando puertos prendiendo y apagando leds, luego prueba con botones. Obviamente aun estas empezando y estas queriendo correr a ciegas, en el foro ya hay bastantes ejemplos de CCS.

ESTO TE SERVIRA


Saludos!! :P


No, no podré vivir tranquilo si no lo resuelvo... solo quiero que alguien me diga porque no fnciona el puerto b.... porque no me netrega nada, si la configuración parece correcta.

Desconectado gab163

  • PIC16
  • ***
  • Mensajes: 111
Re: Control de encendido y apagado de una bomba usando PIC 16F84.
« Respuesta #10 en: 01 de Junio de 2013, 01:55:57 »
el codigo que muestras ademas no podria compilarse porque le falta los paréntesis a la función main

void main (){


ya lo simule y el puerto b anda bien.

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: Control de encendido y apagado de una bomba usando PIC 16F84.
« Respuesta #11 en: 01 de Junio de 2013, 10:25:37 »
Hola quantum27, te sugiero que inicies con lo basico, configurando puertos prendiendo y apagando leds, luego prueba con botones. Obviamente aun estas empezando y estas queriendo correr a ciegas, en el foro ya hay bastantes ejemplos de CCS.

ESTO TE SERVIRA


Saludos!! :P


No, no podré vivir tranquilo si no lo resuelvo... solo quiero que alguien me diga porque no fnciona el puerto b.... porque no me netrega nada, si la configuración parece correcta.


Hola.
Como te comente en el mensaje anterior, tenes que poner una pausa o una demora para poder visualizar los datos. Pensa que las intrucciones se ejecutan a velocidades de ms y a esa velocidad estas cambiando el estado del display. Por la "inercia" del display no vas a ver nada o un solo estado. Es probable que tu programa este funcionando pero no puedas ver la salida en el display por el motivo que te comento.
Como te han mencionado, proba hacer algo con un solo led que encienda y apague. Es el mismo caso, tenes que poner una pausa o demora para que lo puedas visualizar (esto es si el programa corre tan rapido como en este caso. En otros programas que el cambio en la salida del puerto es mas lento quizas no necesites esta demora).
Fijate y sino consulta nuevamente.
Te recomiendo que estas cosas simples, como encender un led, la pruebes en un protoboard, porque a veces el simulador te la muestra que andan bien pero cuando pasar a la realidad no funcionan. "Juga" un rato con eso que te recomiendan de probar con un pulsador y un led. Te aseguro que no es una perdida de tiempo y si lo armas en un protoboard vas a aprender mucho, te lo digo desde mi experiencia. Luego lo que aprendiste probando te va a servir para tus otros projectos como el que estas encarando.
Saludos.

Desconectado quantum27

  • PIC10
  • *
  • Mensajes: 10
Re: Control de encendido y apagado de una bomba usando PIC 16F84.
« Respuesta #12 en: 01 de Junio de 2013, 10:45:22 »
Gracias Dakman y Gab163 por su ayuda, se me borraron algunas cosas al copiar el codigo, como el parentesis que mencionas Gab163, pero si me compila bien, solo una duda más, he notado que el proteus marca con un cuadrito azul si hay voltaje o si el estado lógico es 1 en los dispositivos (como muestra la simulación que pegue arriba), ¿por qué en las salidas del puerto b no hay cuadrito azúl? ¿cuál sería una forma de demostrar que el puerto b esta funcionando correctamente como salida?.

En lo que mencionas Darkman, te agradezco la sugerencia y ahora que le he tomado el gusto a esto te aseguro que experimentaré, sin embargo, este es un proyecto escolar que debo entregar el lunes, no soy electrónico, sino mecánico pero tuve que entrarle a esto para el control de la bomba... serías tan amable de mostrarme ¿cómo funciona eso de las pausas? ¿como puedo poner un retardo? ¿algún libro o link que me pueda servir?

Gracias a todos por sus comentarios, son muy útiles y alentadores.

Desconectado Darkman_A

  • PIC18
  • ****
  • Mensajes: 288
Re: Control de encendido y apagado de una bomba usando PIC 16F84.
« Respuesta #13 en: 01 de Junio de 2013, 13:49:10 »
Hola.
Podes usar delay_ms para generar la pausa. Fijate en el manual de CCS , pagina 33, "5-4 Funciones de retardo".
Un libro que te puede servir es este:

El autor es Eduardo Garcia Breijo y la editorial es Alfaomega. Aunque anda trucho por ahí para descargarlo, te recomiendo si es que podes, que lo compres. Esta bueno poder hojearlo para atras y adelante cuando estas haciendo pruebas y como libro de consulta cuando te olvidaste de como se hacia algo. No es un gran libro pero esta bueno tenerlo en la biblioteca.
Saludos.

Desconectado quantum27

  • PIC10
  • *
  • Mensajes: 10
Re: Control de encendido y apagado de una bomba usando PIC 16F84.
« Respuesta #14 en: 02 de Junio de 2013, 00:12:31 »
Hola.
Podes usar delay_ms para generar la pausa. Fijate en el manual de CCS , pagina 33, "5-4 Funciones de retardo".
Un libro que te puede servir es este:

El autor es Eduardo Garcia Breijo y la editorial es Alfaomega. Aunque anda trucho por ahí para descargarlo, te recomiendo si es que podes, que lo compres. Esta bueno poder hojearlo para atras y adelante cuando estas haciendo pruebas y como libro de consulta cuando te olvidaste de como se hacia algo. No es un gran libro pero esta bueno tenerlo en la biblioteca.
Saludos.



Muchas gracias por la ayuda Darkman, ya hallé el libro, en cuanto lo solucione comento como me fue.