Duda con contador de objetos

Hola samu12

Supongo que ya tienes el programa para el PIC y que cada que presionas el botón que aparece en el esquema que adjuntaste se suma 1 al valor que aparece en los Display’s.

Ahora lo quieres hacer con una barrera de luz infraroja.
Necesitas agregar un emisor de luz infraroja y un receptor tambien de luz infraroja.

El emisor lo polarizas, para que encienda, con una corriente que debe estar especificada en sus hojas de datos.
El receptor lo polarizas con una corriente que debe estar especificada en sus hojas de datos.
Este receptor de luz infraroja puede ser un fotodiodo o un fototransistor para luz infraroja, claro.

Luego en el caso de un fotodiodo puedes conectar el cátodo a tierra y en el ánodo una resistencia hacia el voltaje de polarización. La juntura ánodo – resistencia van hacia el PIC a donde está actualmente el Botón.

En el caso de un fototransistor puedes conectar el emisor a tierra y el colector a una resistencia hacia el voltaje de polarización. La juntura colector - resistencia van hacia el PIC a donde está actualmente el Botón.

Busca en tu ubicación que emisores y sensores de luz infraroja venden. Luego busca sus especificaciones por aquí:
http://www.alldatasheet.com/

saludos
a sus ordenes
 
Holo MrCarlos, ante todo gracias por la respuesta el programa para el PIC ya lo tengo, pero lo tengo sin tener en cuenta la barrera infrarroja, por cierto, el boton de la izquierda es el boton reset, actualmente esta programado para que sume 1 sin accionar ningun pulsador.
El emisor podria ser un diodo led infrarrojo ? Y si el emisor podria ser el que le acabo de proponer, el receptor podria ser igualmente uno de los dos elementos que me nombró en el primer comentario?

Gracias
 
Hola samu12

Bueno tendrás que modificar ese programa que dices tener para el PIC.

Sí, efectivamente el emisor de LUZ infrarroja podría ser un LED.
Investiga cuales se consiguen es tu localidad y busca las características por aquí:
http://www.alldatasheet.com/
Tambien puedes buscar por DESCRIPTION.

Tambien puedes, primero, buscar en tu localidad el receptor de luz infrarroja y luego busca las características en en mismo enlace de arriba.
Tambien puedes buscar por DESCRIPTION.
En lugar de INFRARED LED le escribes INFRARED TRANSISTOR. Ó INFRARED SENSOR.
El sensor(Receptor) de luz infrarroja tambien puede ser un Diodo. Claro(Por Supuesto) sensor de luz.

Te sugiero que primero investigues los que se consiguen en tu localidad porque si encuentras uno en el enlace que te adjunte y ese no se consigue en tu localidad tendrás que volver a .......

saludos
a sus ordenes
 

Adjuntos

  • Bórrame 1.jpg
    Bórrame 1.jpg
    327.1 KB · Visitas: 19
Hola MrCarlos, el programa para el PIC lo conseguí en internet, no tengo ni idea de programación sinceramente, entonces nosé modificar el programa para mi objetivo lo único que sé es que esta programado en C, entonces como hago para modificarlo?
 

Adjuntos

  • contador_4_displays.rar
    536 bytes · Visitas: 75
Hola samu12

Qué supones que hace ese programa para el PIC que conseguiste en Internet ???

El esquema que dices tener, en tu primer mensaje, adjúntalo aquí.
Pero el que genera tu simulador; comprímelo con WinZip o WinRar y adjúntalo.
Preferentemente al que ya le hayas modificado agregándole los barreras infrarrojas.
Supongo que utilizas el ISIS de Proteus para desarrollar tus proyectos.

Si no tienes ni idea de programación debes aprender algún lenguaje para ello. Si no lo haces no podrás continuar con tu proyecto.
Puesto que adjuntaste un archivo que está en código C deberías empezar por estudiar(Aprender) ese lenguaje C para PIC.
Luego para modificarlo se requiere un editor de Texto o el mismo que viene en el Cross-Compiler.
Cross-Compiler es un programa para PC que, precisamente, compila el archivo de código a otro archivo el cual entiende el PIC. Y es Cross porque no compila para el procesador que trae la PC sino en lenguaje para el PIC.

Hice un experimento pero solo salen Garabatos en los Display’s
Pruébalo.

saludos
a sus ordenes
 

Adjuntos

  • Contador De Objetos.zip
    19.5 KB · Visitas: 54
Hola MrCarlos, te adjunto el simulador junto con el programa, todavia no he podido modificar el simulador que bajé de Internet porque ando bastante corto de tiempo.

Que página me recomiendas para poder aprender C?

Gracias
 

Adjuntos

  • Contador.rar
    15.5 KB · Visitas: 31
Hola samu12

Di una probada el circuito que adjuntaste comprimido en el contador.rar.
Se ve que solo habilitan el RA0 y RA1 pero al mismo tiempo. Así que aparece el mismo número en los Display’s de unidades y decenas.

Los RA3 y RA4 al parecen tienen un voltaje pequeño que alcanza a dejar pasar corriente del emisor al colector y por eso se ve tambien el mismo número en todos los Display’s.

Ese programa(Código en C) que conseguiste en Internet no te servirá de mucho pues hay que corregirlo, muchos cambios, además de agregarle lo de la barrera infrarroja que mencionas en tu mensaje original.

Llevas algún avance en el circuito ??

No sé de alguna página para aprender lenguaje C; sin embargo entra a Google.com e indaga por, por ejemplo:
Tutorial lenguaje C para PIC.
O simplemente: Lenguaje C para PIC.

saludos
a sus ordenes
 
Estás de enhorabuena, mi prototipo del curso de electrónica tiene que ver con esto, tengo 2 versiones hechas, una con LCD y otra con 7 segmentos, te paso la del LCD que es la última y más actualizada. Se trata de un contador óptico, que cuenta a medida que se interrumpe un haz (creado con simplemente 3 pilas, una resistencia y un diodo LED infrarrojo) que va aparte. El "sensor" es un fototransistor BPW40, y el resto es un generador de sonido, con un led parpadeante cuando detecta un atranco (tiempo de interrupción del haz mayor a 5 segundos, configurable por software) la conexión al LCD, la alimentación... Otro detalle es que guarda los datos en la EEPROM, en caso de perder la alimentación, al encenderlo sigue en el punto en el que estaba.

Código:
/************************************************************************
   Prototipo de contador de objetos por medio óptico, con función de
   seguridad (guardado de datos en EEPROM)
   Iván
************************************************************************/
#include <16f876a.h> // Selecciona el PIC
#fuses XT,NOWDT,NOPROTECT,PUT,BROWNOUT // Opciones de configuración, cristal, sin perro guardian, sin proteccion de codigo
#use delay(clock=4000000) // Velocidad del Cristal : 4 Mhz
#use standard_io(B) // PORTB en estandar IO digital
//#use fixed_io(b_outputs=PIN_B0,PIN_B1,PIN_B2,PIN_B3,PIN_B4,PIN_B5,PIN_B6,PIN_B7)
#use standard_io(A)
//#use standard_io(C)  //Da problemas con la salida, estados indeterminados (1V)
#use fast_io(C)
#include <lcd.c>

#use fast_io(B)
#DEFINE ATRANCO  5 //segundos para determinar que hay un atranco en la barrera optica
char const RTCCxS=15; // Número de RTCC's para 1 segundo con 4 Mhz / 1:256.

// VARIABLES GLOBALES

int nRTCC=0x00;           // Contador de interrupciones RTCC completas
int segundo=0x0;          // Segundos del Reloj
//int l_digit, h_digit;
int DirCen = 0x00;            // Dirección de las centenas en la EEPROM (0)
int DirDec = 0x01;            // Dirección de las decenas en la EEPROM (1)
int DirUds = 0x02;            // Dirección de las unidades en la EEPROM (2)
// Contador
int Cen = 0;
int Dec = 0;
int Uds = 0;

int alarma = 0;                    //flag de alarma 
int contando = 0;                  // flag contando


//Funciones
void Cuentauno(void);
void cargaEEPROM(void);
void actualiza(void);
void clear(void);


//Interrupciones
#int_RTCC                 // Interrupción por desbordamiento
void RTCC_isr() {              // del TIMER0 RTCC

  if(++nRTCC==RTCCxS){
    nRTCC=0x00;
     segundo++;
  }
}

void main(void) {
  setup_spi(FALSE); //añadido
  setup_comparator(NC_NC_NC_NC); //añadido
  setup_vref(FALSE); //añadido
  setup_counters(RTCC_INTERNAL,RTCC_DIV_256); // TIMER0: Clock Interno y Preescaler 1:256
  setup_timer_1(T1_DISABLED);
  setup_timer_2(T2_DISABLED,0,1);
  setup_comparator(NC_NC_NC_NC);
  setup_vref(FALSE);
  SET_TRIS_A(0b11110111);
  SET_TRIS_B(0b00000000);
  SET_TRIS_C(0b00000000);
  output_bit(PIN_A3, 0);
  lcd_init();
  delay_ms(1000);
  printf(lcd_putc,"\f Ivan\nContador optico");
  delay_ms(1000);
  enable_interrupts(INT_RTCC);// Habilito Interrupción RTCC
  enable_interrupts(global);  // Habilito Interrupciones
  cargaEEPROM(); //cargamos los datos de la EEPROM en la RAM (función de seguridad)
  actualiza();
  delay_ms(3000);
  do{ // Bucle infinito
   if (alarma == 0) {
   if (segundo >= ATRANCO && alarma == 0) { //Si llegamos al limite para considerar un atranco, activamos alarma
            alarma = 1;
            printf(lcd_putc, "\f ALARMA\n Retire atranco");
         } 
      if (input(PIN_A2) == 0) { clear(); }
      if (input(PIN_A0) == 0 && contando == 0) { // Si interrumpimos el haz y no está contando, sumamos uno
                  Cuentauno();
                  contando = 1;
                  actualiza();
                  delay_ms(150);
      }
      if (input(PIN_A0) == 1) { 
                   segundo = 0; // Si no se interrumpe el haz, reseteamos el contador de alarma
                   contando = 0;
                   //actualiza();
      } 
   }
   if (alarma == 1) {
         printf(lcd_putc, "\f ALARMA\n Retire atranco");
         delay_ms(450);
         
         if (input(PIN_A1) == 0) {
            alarma = 0;
            output_bit(PIN_A3, 0);
            actualiza();
            
         }
         else { output_bit(PIN_A3, 1); }
   }
   

  }While(TRUE);

}

void cargaEEPROM (void) { // Funcion que carga la EEPROM en memoria al iniciarse el micro
   if (read_eeprom(DirCen)==0xFF) { write_eeprom(DirCen, 0); } // Si tienen el valor máximo con el que vienen cuando no
   if (read_eeprom(DirDec)==0xFF) { write_eeprom(DirDec, 0); } // tienen datos en la EEPROM, lo que indica que no hay datos
   if (read_eeprom(DirUds)==0xFF) { write_eeprom(DirUds, 0); } // grabados (situacion inicial), los reiniciamos a 0
   Uds = read_eeprom(DirUds);
   Dec = read_eeprom(DirDec);
   Cen=read_eeprom(DirCen);
}

void Cuentauno (void) {  // Funcion que suma uno a la cuenta y lo guarda en EEPROM
   if (Uds == 9) {
      Uds = 0;
      Dec++;
      if (Dec > 9) {
         Dec = 0;
         Cen++;
      }
   }
   else {
      Uds++;
   }
   write_eeprom(DirCen, Cen); // Guardado de las variables en la EEPROM
   write_eeprom(DirDec, Dec); // Funcion de seguridad por si se queda sin alimentación
   write_eeprom(DirUds, Uds);
}
void actualiza(void) {
printf(lcd_putc,"\fContando...\n %i%i%i", Cen Dec Uds);
}

void clear(void) {
write_eeprom(DirCen, 0); // Guardamos 0 en las centenas
write_eeprom(DirDec, 0); // Guardamos 0 en las decenas
write_eeprom(DirUds, 0); // Guardamos 0 en las unidades
Cen = 0;                 //Vaciamos variables
Dec = 0;
Uds = 0;
actualiza();          // Refrescamos los displays
}

Cualquier duda... Aquí estamos, saludos!
 

Adjuntos

  • esquema.pdf
    18.6 KB · Visitas: 62
Hola MrCarlos, aun no he podido hacer ningún cambio todavía estoy buscando un rato libre, cuando haga alguna modificación lo comentaré.

Hola FailSafe, gracias por la información que me has aportado, pero aún así sigo sin entender mucho, hay algunos componentes que no se cuales son, otra cosa, hay varios circuitos, en la simulación los tengo que montar todos o es solo uno?

Gracias a los 2
 
El conector de 28 pines es un pic 16F876, el de 16 es un LCD, y es todo un circuíto, dividido en subpartes para una mejor comprensión, está la alarma de aviso de atranco, la alimentación, el sensor propiamente dicho y el micro con sus pulsadores de reset, reinicio y rearme. ¿Qué componentes no conoces?
 
Q1 es un fototransistor BPW40, el resto de QX (X cualquier numero) son transistores, hay algún diodo LED, en la alimentación: transformador, puente rectificador, reguladores de tensión, transistor de potencia (el 2n3055), condensadores.. en la alarma: un astable hecho con transistores para generar sonido, un led, un zener, etc etc... Es bastante simple... si no conoces alguna cosa en particular preguntamela y te contestaré encantado.
 
Porque el circuíto externo del que forma parte el astable a transistores es una sirena realizada en prácticas anteriores, y por comodidad, lo dejé tal cual estaba, además de no tener que programarlo, son pocos componentes, comunes en clase y por sencillez, es más cómodo dejar un pin en alto que active el transistor para que suene la alarma que generar la señal. Aunque sería posible hacerlo sin él, efectivamente. Gracias por la pregunta :)
 
Atrás
Arriba