Mostrar varios datos en display 7 segmentos

Pues lo mismo pero al revés.
Es pecado mortal motivo de excomunión colocar bucles, retardos y esperas a cualquier cosa dentro de una rutina de interrupción.
Esa es precisamente la idea, se usa una interrupción para NO hacer eso.

Si necesitas algo así (no sé para qué) usa flags. Es decir, cambias el valor de una variable y sales de la interrupción. En el bucle principal si esa variable es ta se hace tal cosa y si es cual se hace cual cosa.

A la rutina de interrupción se entra y se sale lo más rápidamente posible. Esa es la idea.
Claro entiendo! Pero con el timer no se como hacerlo, con la int r0 cada ves que se activa se que avanza el lectura, y no se como hacerlo con la interrupción RB por el pin 4 o por adc pin A1
Mensaje automáticamente combinado:

Me tome el atrevimiento de modificar un poco el codigo, y eliminar cosas que no servian, como el timer2 y algo mas, como mejor formateo del codigo...

Hay una parte que no entiendo o esta mal.
Cuando lees los flancos, pones primero "set_timer1(0);", y luego asignas a la variable que sigue el valor de "get_timer1();", pero en todo caso sigue siendo 0, ya que lo reiniciaste.

Ademas en la simulacion, cuando el duty cicle es 50%, hace cosas raras, y pasa de 49,50,90,etc. Y cambie la frecuencia de 116 a 216Hz, y con 50% de duty cicle me marca 98%... No me puse a realizar bien el codigo, solo me base en lo que subiste, pero creo que esa parte tendrias que replanteartela.

Intente usar interrupciones con el timer para mostrar el display, pero por falta de experiencia y estudio, no fui capaz.

PD: Use la misma simulacion que subiste. Proteus v8.8, CCS C Compiler 4.104
Voy a revisar gracias por comentar
Mensaje automáticamente combinado:

Se podría hacer por el pin 1 del adc, con interrupción de adc ?
 
Última edición:
Pues está claro, pones un timer con interrupción para conseguir que algo se ejecute en un momento dado.
Pues ya está, ¡¡hazlo!!
Para eso has puesto el timer para que algo pase en un momento determinado, si cuando llega la interrupción te pines a hacer no sé qué, ya no es ese tiempo.

Ejemplo cotidiano. Pones la comida al fuego y un despertador. Cuando suena, la apagas porque está hecha. Punto.
Si cuando suena te pones a resolver una integral por el método alemán*, se te quema la comida.

*Ni me acuerdo de cómo se hacía, solo recuerdo que eran dos polinomios y un algoritmo repetitivo muy trabajoso.



Volviendo al display.
Cuando "suena el despertador" apagas este display, pones en el port el contenido del siguiente y lo enciendes.
Nada más.
Con eso garantizas que todos están el mismo tiempo.
Si te pones a calcular "órbitas de asteroides" mientras tanto cada display lucirá diferente porque se activan en tiempos diferentes. Además de eso puede pasar que tardes tanto que llegue la siguiente o peor aún muchas interrupciones, la pila desborde y el sistema caiga.

Osea, que el pseudocódigo de la interrupcion es:

Necesitas un array de char o byte para que contenga los caracteres de la pantalla, para escribir en la pantalla simplemente asignas valores ahí.
Necesitas un puntero que indique que caracter estás viendo

pines_comunes contiene el port que maneja los ánodos o cátodos comunes de los displayes
portleds maneja el port que activa el otro extremo de los leds

interrupción:
pines_comunes = 0 // Apaga los pines de lo ánodos o cátodos comunes
portleds = 0 // apaga los pines de los leds
puntero ++ // Apuntamos al siguiente caracter de la pantalla
if (puntero == num_disp) puntero = 0 // si te has salida del dsplay vuelves a apuntar al display 1
pines_comunes = 2^puntero // activa el pin correspondiente al ánodo o cátodo común
portleds = pantalla[puntero] // has de tener un array de char o byete con el contenido de la pantalla
fin de interrupción
 
Vamos a intentar, voy a buscar información y ejemplos de código de lo que me desis, gracias

ahi funciona mejor, pero los datos siguen sin ser precisos, y no puedo ponerlos estables , y no se porque hay digitos que prenden mas bajos, si pongo todos los datos a cero encienden los 3 digitos parejos
if(flagHayDatos==0){
frecuencia = 0;
porcentaje=0;
}

ejemplo asi, pero ya casi esta.....
 

Adjuntos

  • fuente geo2.rar
    101.8 KB · Visitas: 5
hola ahí funciona bien, solo tengo un problema, cuando corto el pulso no me queda en 0,

if(flagHayDatos==0){
frecuencia = 0;
porcentaje=0;
}
si pongo esta sentencia siempre me queda en cero, necesito ayuda, gracias
 

Adjuntos

  • fuente geo2.rar
    168.2 KB · Visitas: 5
Para que necesitas esa sentencia?
En todo caso deberias ponerlo al final de todo el loop (while).
Para que cuando no hayan pulsos vuelva a cero, me queda las variables cargadas con el último dato
Mensaje automáticamente combinado:

Lo puse al final y cada ves que uso alguna sentencia siempre me queda en cero y empieza otra vez a ver los display medio encender

funciona de maravillas, pero sigo con el problema de cuando no hay dato llevar las variables a cero, no se como hacer probe de todo!!
 
Atrás
Arriba