Contador programable en Teensy++ 2.0

#1
Buenas noches. Un saludo al los miembros del foro y los administradores. Primero aclarar que debí hacer un nuevo usuario ya que no he tenido forma de recuperar el anterior que era Vitruvius.
Paso al tema. Tengo una buena experiencia en electrónica y realicé hace muchos años un contador programable de cuatro dígitos con display de siete segmentos. Este contador fue realizado con microcircuitos de lógica discreta: contadores de cuatro bits en cascada, compradores de cuatro bits, una compuerta lógica que da salida al control de un relay y decodificadores bcd a 7 segmentos. Esto sin contar una serie de temporizadores utilizados para generar pulsos limpios para la programación de la cuenta.
En total utilicé 26 circuitos integrados.
Este equipo sufrió una vería por corto circuito y resultaron dañados varios integrados que no se consiguen ya. Es por esto que he decidido realizar este contador en lenguaje de arduino, pero que opere de la misma manera. En concreto he comprado la placa Teensy++ 2.0. Ya he logrado implementar el programa de Arduino con la extensión para esta tarjeta (Teensy Loader) y cargar programas que vienen de ejemplo, mas necesito ahora emprender la programación del contador.
No se si alguien puede indicarme donde puedo conseguir un sketch adecuado para esta función. Mi experiencia en C++ en cero, estoy aprendiendo a la fuerza, pues necesito resolver este tema porque es un asunto de trabajo.

Muchas gracias por cualquier aporte.
 
#2
Aprender a programar desde cero no es una tarea fácil, Vos ya sabes de circuitos lógicos, por ahí no sabés de la existencia de unos integrados llamados MM74C925/26/27/28, son unos contadores con decodificación a led 7 segmentos de cuatro dígitos, buscá las hojas de datos, una de esas solo un integrado te soluciona el problema...
Más popular es el MC14553 (ó cd4554) contador decimal con tres dígitos, capaz de manejar los led display 7seg. tambien
No decís que tipo de contador requerís, medio dificil ayudarte....
 
#3
AleSergi, ante todo muchas gracias por responder. Paso a describir el contador. Pertenece a una maquina de impresión offset y cuenta la calidad de copias con un contador de cuatro dígitos. Previamente se establece la cuenta en otro contador también de 4 dígitos. Una ves la cantidad de copias iguala la cuenta programada en el segundo contador, abre un relay que detiene el mecanismo de impresión.
Respecto a los integrados que sugiere, recuerdo haber analizado una forma de utilizarlos, que me ahorraba una cantidad de integrados, agregando la dificultad de que no poseen una forma de tomar la cuenta para compararla con la cuenta programada. Luego desistí de ese análisis debido a la dificultad de conseguir también este integrado (el MM74C925/26/27/28. El de tres dígitos no es suficiente). Son integrados antiguos y es cada vez más difícil encontrarlos. En Uruguay, donde vivo, el comercio de los componentes electrónicos está en decadencia y el único proveedor de ic´s "raros", ve en ello una oportunidad de desquitar lo poco que vende y los cobra a precios ridículos.

Adjunto foto del aspecto del contador y explico: El numerador de arriba, cuanta las copias; El numerador de abajo se setea con los botones azules, que manejan en forma ascendente, Unidades, Decenas, Centenas y Millares, respectivamente. Los botones rojos son reset respectivos de cada cuenta (la contada y la programanda).

IMG_2496.jpg


Muchísimas gracias nuevamente.
 
#4
Una vuelta más de tuerca antes que tengas que aprender a programar.
Del otro lado del río existe una empresa llamada Gaynor que hace unos módulos controladores de temperatura, contadores... y otras funcionalidades, que hacen lo que estás pidiendo.
Existen de otras marcas e incluso he visto algunos que pueden ser traídos desde China.

Contadores / Tacómetros - GAYNOR CONTROLS
 
#5
Es muy realista la sugerencia. Trataré de ponerme en contacto con la empresa. Los he visto chinos también si, el problema es que apremia el tiempo, la maquina está funcionando, pero requiere una persona que cuente, y eso crea dificultades y errores de todo tipo. En estos días tienen un volumen de trabajo grande, la importación tiene sus tiempos y solo algunos días, ya es tragedia... Lógicamente tampoco es el momento de convertirse de la noche a la mañana en un experto programador, pero de pronto existe algo que pueda cargar en esta placa y sacarla andando.
De cualquier forma, este tipo de dificultades-soluciones se presentarán en el futuro, así que con esto doy por iniciada mi formación en C++.
Esta noche repararé este contador programable (con alambre y sin dormir...), y con más tranquilidad, resolveré si cruzo el charco, lo traigo de China, o me da le tiempo de crear o modificar algún código existente, que es la opción que me resulta más atractiva.
 
#7
¡Que tal DOSMETROS !. Este cambio de identidad me desconcierta un poco... jaja.
Bueno si, es lo que me sugería AleSergi y que yo había encontrado de un proveedor de China. Lo de la calculadora es interesante y dispara mi creatividad, pero en la practica el cliente no lo aceptará.
En principio, a la 1:35 am del dia de ayer (domingo), logré revivir el contador, tal como me lo había propuesto, con unas adaptaciones horribles de contadores 74192 trabajando como si fuesen 7490, que no se consiguen ya...
Igualmente mantengo la esperanza de poder programar un código que cumpla la misma función y remplazar las placas de este por una pequeña Teensy. Sería un gran paso para mí y me permitiría sortear problemas semejantes en el futuro, sin recurrir a soluciones comerciales que no siempre se adaptan a las necesidades concretas.
De modo que sigo, ahora mas tranquilo, buscando un código que funcione como he descrito antes.

Saludos
 

DOSMETROS

High 2m Modereitor
#8
¡Que tal DOSMETROS !. Este cambio de identidad me desconcierta un poco... jaja.
Ahí mandé una denuncia a ver si Andrés lo arregla.

Esos contadores deberían llevar batería que soporte la memoria ante corte de luz o trabajo que terminarán mañana o después del almuerzo . . . con que solo alimente los contadores sin display.

Te cuento una de hace muchos años . . . también muy pobre :rolleyes: , una máquina llevaba un contador mecánico que se seteaba con rueditas y al llegar a 00000 su mecanismo interno accionaba un microswitch de detención , ese mecanismo se había destrozado y no había forma de recuperarlo , así que con todos los ceros hacia arriba le había hecho un pequeño agujero pasante a cada rueda , horizontalmente un poco debajo del eje (como si fuera desde entre el 3 y 4 a entre el 6 y 7) le había puesto 5 leds infrarrojos en serie y también 5 fototransistores en serie que con un transistor accionaban un microrelé :cool:

Un abrazo !
 
#9
¡Impecable, buena solución!. La tarea técnica tiene una parte de artesanía que te la da los años y no hay forma de transmitirlo en un curso... Es el valor de la experiencia.
 
#10
Buenas noches.
Quería compartir con la comunidad un código que encontré para comenzar a realizar el contador que planteaba, con la placa Teensy++. En principio es solo un contador, del cual me queda ahora la ardua tarea de inventar una forma de resetearlo, como primera medida y luego toda otra etapa de investigación que será la de comparar el valor del contador con una cuenta programada en otro display, para que dé una salida de control.
El sketch está hecho para un display led de 4 dígitos y siete segmentos.

C++:
/*  Display Control for 4 anodes and 8 cathodes (for common cathode, see inline comments in displayRefresh())
    signal for segments controlled by Arduino Pin Numbers 6-13 as follows
       ___
      | a |
    f |___| b
    e | g | c
      |___| .
        d   dp
    a = 6, b = 7, c = 8, d = 9, e = 10, f = 11, g = 12, dp = 13

    signal for commons controlled by Arduino Pin Numbers 2-5 as follows
     _   _   _   _
    |_| |_| |_| |_|
    |_| |_| |_| |_|
    d4  d3  d2  d1
    d1 = 5, d2 = 4, d3 = 3, d4 = 2;
*/

const byte NumbersLUT[11] = {0xFC, 0x60, 0xDA, 0xf2, 0x66, 0xB6, 0xBE, 0xE0, 0xFE, 0xF6, 0x00};// segment data for numbers 0-9 and blank
const byte SegmentsLUT[8] = {6, 7, 8, 9, 10, 11, 12, 13};// pin numbers for segments
const byte CommonsLUT[4] = {2, 3, 4, 5};// pin numbers for commons
const unsigned long refreshRate = 1000UL;
unsigned long refreshTimestamp;
byte displayData[4] = {0x00, 0x00, 0x00, 0xFC};// stores data from NumbersLUT for each digit
byte digitIndex = 3;// indexes displayData and CommonsLUT to multiplex display

const byte ButtonPin = 14;
int lastButtonState;
unsigned long buttonDebounceTimestamp;
byte ones;
byte tens;
byte hundreds;
byte thousands;


void setup() {
  for (byte i = 2; i <= 13; i++) pinMode(i, OUTPUT);// sets pins 2-13 as outputs
  pinMode(ButtonPin, INPUT);
}

void loop() {
  if (pollbutton()) incrementCount();
  displayData[0] = (thousands == 0) ? 0x00 : NumbersLUT[thousands];
  displayData[1] = (thousands == 0 && hundreds == 0) ? 0x00 : NumbersLUT[hundreds];
  displayData[2] = (thousands == 0 && hundreds == 0 && tens == 0) ? 0x00 : NumbersLUT[tens];
  displayData[3] = NumbersLUT[ones];
  displayRefresh();
}

bool pollbutton() {
  int buttonState = digitalRead(ButtonPin);
  if (buttonState != lastButtonState && buttonState == HIGH) {// transition is LOW to HIGH
    if (millis() - buttonDebounceTimestamp >= 50UL) {// 50UL = 50ms = time for debounce
      lastButtonState = buttonState;
      buttonDebounceTimestamp = millis();
      return true;
    }
  }
  else {
    lastButtonState = buttonState;
    return false;
  }
}

void incrementCount() {
  if (ones >= 9) {
    ones = 0;
    if (tens >= 9) {
      tens = 0;
      if (hundreds >= 9) {
        hundreds = 0;
        if (thousands >= 9) {
          thousands = 0;
        }
        else thousands++;
      }
      else hundreds++;
    }
    else tens++;
  }
  else ones++;
}

void displayRefresh() {
  if (micros() - refreshTimestamp >= refreshRate) {
    digitalWrite(CommonsLUT[digitIndex], LOW);// HIGH for common cathode
    for (int i = 0; i < 8; i++) digitalWrite(SegmentsLUT[i], ((displayData[digitIndex] & (0x01 << i)) ? LOW : HIGH));// swap HIGH and LOW for common cathode
    digitIndex = (digitIndex >= 3) ? 0 : (digitIndex + 1);
    digitalWrite(CommonsLUT[digitIndex], HIGH);// LOW for common cathode
    refreshTimestamp = micros();
  }
}
Por cierto, con menos sueño subiré el diagrama de conexiones, que por alguna razón da una diferencia con lo pines de salida indicados.
Lo he probado en protoboard y funciona. Por cierto, vengo del ámbito de la electrónica y jamás entenderé porque rayos los pines de la tarjeta no se numeran en el orden tradicional del 1 al 40 comenzando por el de arriba la izquierda, como Dios manda... Siguen un orden derivado de su función y eso complica muchísimo. Comienza por el 27, luego va del 0 al 17 para continuar del 45 al 38 y luego del 18 al 26. La odié.
 
Última edición:

Arriba