Autor Tema: Projecto contador de vehiculos com pic 16f84a  (Leído 2313 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado raul27

  • PIC10
  • *
  • Mensajes: 6
Projecto contador de vehiculos com pic 16f84a
« en: 16 de Febrero de 2020, 18:52:37 »
Saludos colegas. Estoy con un problema en a prormacion de un projecto de un contador de vehiculos. Funcionaria asi, el local tiene un solo lugar por donde entran y salen los carros. Entonces, quiero colocar 2 sensores uno tras de otro (separados por una distancia de 1metro). Para el microcontrolador considerar que el carro entro, el carro debe pasar por ambos sensores en sentido izquierda hacia derecha y para considerar el carro salio,este debe pasar por los sensores e sentido contrario (derecha hacia izquierda). De esta forma, el controlador incrementaria o decrementaria la variable CONTADOR que fue creada. Tambien, mientras existan puestos disponibles hay un led verde encendido y cuando no, se apaga elled verde y enciende un led rojo. Para las pruebas, fue asignada en 5 la cantidad de puestos del lugar. El problema es el siguiente, yo hice la programacion pero solo incementa y no consigo que haga el decremento. Estoy usando  el programador MikroC pro pic. Ya llevo casi un mes y no doy con solucion. Pido su colaboracion por favor. Simule en proteus.

CODIGO:

   #define S1 RB0_bit
    #define S2 RB1_bit
    #define NO RB3_bit
    #define LEE RB4_bit
    #define SI RB2_bit
    #define RESET RA0_bit

    int     CONTADOR;
    int     pulso = 0;
    int     pulso1 = 0;
    int     estado;
    int     estado1;


void main()
 {
     TRISA = 1;
     TRISB = 3;
     PORTB = 4;
     PORTA = 0;
     estado = 0;
     estado1 = 0;
     CONTADOR = 0;

     CONTADOR = EEPROM_Read(0x00);

     while(1)
     {
     
     EEPROM_Write(0x00,CONTADOR);
     delay_ms(10);


           if (Button(&PORTB, 0, 1, 1)) {
                estado = 1;
                }
           if (estado && Button(&PORTB, 0, 1, 0)) {
               pulso = 1;
               estado = 0;
                }
                 
           if (Button(&PORTB, 1, 1, 1)) {
                estado1 = 1;
                }
           if (estado1 && Button(&PORTB, 1, 1, 0)) {
               pulso1 = 1;
               estado1 = 0;
               }
               
           if (pulso == 1){
              if (pulso1 == 1){
                  delay_ms(10);
                  LEE = 1;
                  delay_ms(200);
                  LEE = 0;
                  CONTADOR = CONTADOR + 1;
                  pulso = 0;
                  pulso1 = 0;
                   }
                  }
                 
           if (pulso1 == 1){
               if (pulso == 1){
                  delay_ms(10);
                  LEE = 1;
                  delay_ms(200);
                  LEE = 0;
                  CONTADOR = CONTADOR - 1;
                  pulso = 0;
                  pulso1 = 0;
                   }
                  }
                 
               if (CONTADOR < 5)
                    {
                     SI = 1;
                     NO = 0;
                    delay_ms(10);
                    }
                   else
                 // if (CONTADOR >= 5)
                    {
                     SI = 0;
                     NO = 1;
                    delay_ms(10);
                    }

               if (RESET == 1)
                    {
                    delay_ms(10);
                    CONTADOR = 0;
                    }
           }


           }





Desconectado Robert76

  • PIC24F
  • *****
  • Mensajes: 571
Re:Projecto contador de vehiculos com pic 16f84a
« Respuesta #1 en: 16 de Febrero de 2020, 19:25:53 »
Hola, honestamente no me he puesto a analizar tu código, pero te comento lo que yo haría.
Simplemente una máquina de estados para detectar el sentido de acción de los sensores. Por ejem.
Suponemos sensor SA y SB.

Detecta sentido A-B:
IF(!SA&&!SB&&estado==1{contador++;estado==2;}
IF(!SA&&SB&&estado==0) estado=1;

Detecta sentido B-A:
IF(!SB&&!SA&&estado==1){contador--;estado==2;}
IF(!SB&&SA&&estado==0)estado=1;


Vuelve máquina de estados a 0 en condición sin detección:
IF(SA&&SB)estado=0;

Todo lo anterior se puede optimizar, es a modo orientativo.
Otro detalle a contemplar es si por ejem. Un sensor se acciona y el otro no en X tiempo. Entonces debe resetearse cualquier posible condición fuera de esa instancia.
Además, si la variable Contador vale 0, no debe seguir decrementando, para evitar conflictos.
« Última modificación: 16 de Febrero de 2020, 19:33:10 por Robert76 »

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Projecto contador de vehiculos com pic 16f84a
« Respuesta #2 en: 17 de Febrero de 2020, 14:58:00 »
     EEPROM_Write(0x00,CONTADOR);
     delay_ms(10);

En primer lugar no es una buena práctica poner una actualización de la eeprom en un bucle while(1), te vas a cargar la eeprom en poco tiempo. Pon un condicionante para que solo se actualice cuando el valor cambie.

Y en segundo lugar, esas dos condiciones, para que CONTADOR sume o reste, son la misma, por eso no te funciona la resta. Lo cierto es que el programa que has hecho es un auténtico caos, pesimamente planteado y peor programado.

           if (pulso == 1){
              if (pulso1 == 1){

                  delay_ms(10);
                  LEE = 1;
                  delay_ms(200);
                  LEE = 0;
                  CONTADOR = CONTADOR + 1;
                  pulso = 0;
                  pulso1 = 0;
                   }
                  }
                 
           if (pulso1 == 1){
               if (pulso == 1){

                  delay_ms(10);
                  LEE = 1;
                  delay_ms(200);
                  LEE = 0;
                  CONTADOR = CONTADOR - 1;
                  pulso = 0;
                  pulso1 = 0;
                   }
                  }


Empieza por cambiar la actualización de la eeprom para no quemar el chip en poco tiempo

int  CONTADOR=0, contador2=0;

while(1) {
if(contador2 != CONTADOR) {
    contador2 = CONTADOR;

    EEPROM_Write(0x00,CONTADOR);
    delay_ms(10);
}


Y cambia las condiciones para la suma y resta del CONTADOR. Probablemente solo necesitas una condición en cada IF, el primero SOLO para pulso y el segundo para pulso1, y no resetees ambas variables en los dos IF o cuando llega al segundo esa variable ya está a cero.

if (pulso){
                  delay_ms(10); LEE = 1;
                  delay_ms(200); LEE = 0;
                  CONTADOR++;
                  pulso = 0;
                  }
                 
if (pulso1){
                  delay_ms(10);  LEE = 1;
                  delay_ms(200); LEE = 0;
                  CONTADOR--;
                  pulso1 = 0;
                  }


PD: consejo, no pongas los nombres de las variables en mayúsculas (ejemplo, CONTADOR), eso se suele utilizar para definir constantes.

« Última modificación: 17 de Febrero de 2020, 15:25:12 por planeta9999 »

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Projecto contador de vehiculos com pic 16f84a
« Respuesta #3 en: 17 de Febrero de 2020, 19:28:22 »
Saludos colegas. Estoy con un problema en a prormacion de un projecto de un contador de vehiculos. Funcionaria asi, el local tiene un solo lugar por donde entran y salen los carros. Entonces, quiero colocar 2 sensores uno tras de otro (separados por una distancia de 1metro). Para el microcontrolador considerar que el carro entro, el carro debe pasar por ambos sensores en sentido izquierda hacia derecha y para considerar el carro salio,este debe pasar por los sensores e sentido contrario (derecha hacia izquierda). De esta forma, el controlador incrementaria o decrementaria la variable CONTADOR que fue creada. Tambien, mientras existan puestos disponibles hay un led verde encendido y cuando no, se apaga elled verde y enciende un led rojo. Para las pruebas, fue asignada en 5 la cantidad de puestos del lugar. El problema es el siguiente, yo hice la programacion pero solo incementa y no consigo que haga el decremento. Estoy usando  el programador MikroC pro pic. Ya llevo casi un mes y no doy con solucion. Pido su colaboracion por favor. Simule en proteus.

CODIGO:

   #define S1 RB0_bit
    #define S2 RB1_bit
    #define NO RB3_bit
    #define LEE RB4_bit
    #define SI RB2_bit
    #define RESET RA0_bit

    int     CONTADOR;
    int     pulso = 0;
    int     pulso1 = 0;
    int     estado;
    int     estado1;


void main()
 {
     TRISA = 1;
     TRISB = 3;
     PORTB = 4;
     PORTA = 0;
     estado = 0;
     estado1 = 0;
     CONTADOR = 0;

     CONTADOR = EEPROM_Read(0x00);

     while(1)
     {
     
     EEPROM_Write(0x00,CONTADOR);
     delay_ms(10);


           if (Button(&PORTB, 0, 1, 1)) {
                estado = 1;
                }
           if (estado && Button(&PORTB, 0, 1, 0)) {
               pulso = 1;
               estado = 0;
                }
                 
           if (Button(&PORTB, 1, 1, 1)) {
                estado1 = 1;
                }
           if (estado1 && Button(&PORTB, 1, 1, 0)) {
               pulso1 = 1;
               estado1 = 0;
               }
               
           if (pulso == 1){
              if (pulso1 == 1){
                  delay_ms(10);
                  LEE = 1;
                  delay_ms(200);
                  LEE = 0;
                  CONTADOR = CONTADOR + 1;
                  pulso = 0;
                  pulso1 = 0;
                   }
                  }
                 
           if (pulso1 == 1){
               if (pulso == 1){
                  delay_ms(10);
                  LEE = 1;
                  delay_ms(200);
                  LEE = 0;
                  CONTADOR = CONTADOR - 1;
                  pulso = 0;
                  pulso1 = 0;
                   }
                  }
                 
               if (CONTADOR < 5)
                    {
                     SI = 1;
                     NO = 0;
                    delay_ms(10);
                    }
                   else
                 // if (CONTADOR >= 5)
                    {
                     SI = 0;
                     NO = 1;
                    delay_ms(10);
                    }

               if (RESET == 1)
                    {
                    delay_ms(10);
                    CONTADOR = 0;
                    }
           }


           }


 Madre mía. Pobre de tu eeprom. 

Saca el eeprom_write del while(1) si no quieres quemarla en un ratito y de un plumazo.  O ponle un condicionante para que solo se grabe de vez en cuando

Desconectado raul27

  • PIC10
  • *
  • Mensajes: 6
Re:Projecto contador de vehiculos com pic 16f84a
« Respuesta #4 en: 19 de Febrero de 2020, 14:44:08 »
Gracias por interesarse en este projecto y comentar. Disculpen si el código esta un poco desorganizado, la verdad solo lo escribi asi intentado que funcionara para despues arreglarlo mejor. Hace mas de 10 a#os desde la ultima vez que vi microcontroladores cuando estudiaba. Por eso, esos detalles indeseados en el codigo :lol:  Voy a hacer esos ajustes en elcodigo y probar y comento. Lo del pulso y pulso1, los use y condicione porque para el programa contar+, el carro debe  pasar por ambos sensores en un sentido y viceversa para decrementar. Pero no entendia el por que se comportaban como lo mismo y no decrementaba.

Desconectado raul27

  • PIC10
  • *
  • Mensajes: 6
Re:Projecto contador de vehiculos com pic 16f84a
« Respuesta #5 en: 19 de Febrero de 2020, 14:49:09 »
planeta9999, quiero que el programa aumente si el vehiculo pasa por ambos sensores en un sentido y decremente si pasa por ambos sensores en sentido opuesto. Por eso condicione pulso y pulso1. Intentando hacer eso.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Projecto contador de vehiculos com pic 16f84a
« Respuesta #6 en: 19 de Febrero de 2020, 17:34:51 »
planeta9999, quiero que el programa aumente si el vehiculo pasa por ambos sensores en un sentido y decremente si pasa por ambos sensores en sentido opuesto. Por eso condicione pulso y pulso1. Intentando hacer eso.

Bien, pero es que estos dos grupos de dos IF anidados son exactamente lo mismo, el orden no cambia el resultado, es un AND de dos variables. Por eso solo te funciona la primera, ya que reinicias las variables, aunque el problema es que quieres incrementar y decrementar CONTADOR con la misma condición en ambos casos.


           if (pulso == 1){
              if (pulso1 == 1){

                 
           if (pulso1 == 1){
               if (pulso == 1){


También se puede escribir así, para que resulte más elegante:

           if (pulso1 && pulso){



« Última modificación: 19 de Febrero de 2020, 17:37:29 por planeta9999 »

Desconectado raul27

  • PIC10
  • *
  • Mensajes: 6
Re:Projecto contador de vehiculos com pic 16f84a
« Respuesta #7 en: 19 de Febrero de 2020, 20:07:20 »
entendi ahora. Yo estaba intentando aplicar otra logica pero ahora entiendo porque solo incrementaba y no decrementaba. Me pudieras ayudar en esa parte por fa. Cual logica puedo usar para lograr eso.

Desconectado raul27

  • PIC10
  • *
  • Mensajes: 6
Re:Projecto contador de vehiculos com pic 16f84a
« Respuesta #8 en: 19 de Febrero de 2020, 20:09:46 »
O alguna idea paa yo desarollar el codigo que consiga hacer eso. De condicionar los dos sensores para que incremente en un sentido y decremente al contrario.

Desconectado planeta9999

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3520
    • Pinballsp
Re:Projecto contador de vehiculos com pic 16f84a
« Respuesta #9 en: 19 de Febrero de 2020, 22:24:02 »
 
Prueba así, pero en ese programa tienes todavía mucho que depurar. Yo hace muchos años que no uso PIC, me pase a ARM 32bit, pero no creo que con un simple define puedas leer o cambiar el estado de un puerto, revísalo.


Código: C
  1. bool sensor1=false, sensor2=false, procesa=false, leds=true;
  2.  
  3.  
  4. while(1)
  5. {
  6.  
  7. // Vehiculo sale
  8.  if (Button(&PORTB, 0, 1, 1))
  9.         {
  10.              sensor1=true;
  11.              if(sensor2)
  12.              {
  13.                 procesa=true;
  14.                 CONTADOR++;
  15.              }
  16.         }
  17.  
  18. // Vehiculo entra
  19.  if (Button(&PORTB, 1, 1, 1) && procesa==false)
  20.         {
  21.              sensor2=true;
  22.              if(sensor1)
  23.              {
  24.                 procesa=true;
  25.                 CONTADOR--;
  26.              }
  27.         }
  28.  
  29. // Actualiza Eeprom
  30.  if (procesa)
  31.    {
  32.         procesa=false;
  33.         delay_ms(10); LEE = 1;
  34.         delay_ms(200); LEE = 0;
  35.         EEPROM_Write(0x00,CONTADOR); delay_ms(10);
  36.         sensor1=false; sensor2=false;
  37.         leds=true;
  38.    }
  39.  
  40. // Plazas libres
  41.  if(leds)
  42.  {
  43.    if(CONTADOR<5) {SI = 1; NO = 0;}
  44.         else {SI = 0; NO = 1;}    
  45.    leds=false;
  46.    delay_ms(10);
  47.  }
  48.  
  49. // Reiniciar contador
  50.  if (RESET) CONTADOR=0;
  51.  
  52.  
  53. }

« Última modificación: 19 de Febrero de 2020, 22:27:11 por planeta9999 »

Desconectado raul27

  • PIC10
  • *
  • Mensajes: 6
Re:Projecto contador de vehiculos com pic 16f84a
« Respuesta #10 en: 20 de Febrero de 2020, 19:46:32 »
Ok amigo. Voy a hacer la prueba y comento. Gracias por tu tiempo.