Contar super lento y por largo tiempo con AVR

Pues esa es la cuestion chicos como lo hago sin dejar de atender otros procesos, por ejemplo necesito controlar 4 display de 7-seg a la misma ves que cuento durante 30 segundos los pulsos que me llegan a 8 patitas distintas, los pulsos tienen una frecuencia sumamente baja por ejemplo de frecuencia 0.01 Hz, el micro objetivo es un atmega32 y bueno rapidamente me fije en sus timers y me topo con que tiene 3 timers/contadores uno 16bits y 2 de 8bits y luego que prosigue.


PORTA <---- Entran las 8 señales que se deben contar durante 30 segundos
PORTB ----> Controlan los 4 display de 7 segmentos con el empleo de un 74LS47

Entonces como cuento esas 8 señales por separado durante 30 segundos sin dejar de actualizar los datos en los display

La verdad siempre he tenido problemas con esto de manipular varios procesos a la ves, generalmente lo resolvia empleando altas frecuencias pero en este caso me causaria mas problemas por lo del contador, ahora bien usar un DSP no me gustaria porque no se usarlos ademas no tengo herramientas para comenzar con DSP, porfa ayuda con esto que no le puedo dar solucion

Nadien que me apoye
 
Última edición:
A 0.01Hz en 30seg no contaria nada.
Una opcion es tomar el ultimo valor de PINA y guardarlo en una variable y compararlo despues con el valor actual de PINA, y si hubo un cambio se chequea el PIN que cambio de nivel.
Las interrupciones de timer es para el display.
 
La forma más fácil es usando una interrupción externa; lo que debes hacer es una OR entre las 8 inputs del PortA, la salida de esta OR va hacia una de las interrupciones externas (INT0, INT1 o INT2). En la rutina que atenderá la interrupción externa en cuestión llevas la cuenta de las señales que lleguen a cada pin del PortA.
La rutina de atención de los display 7 segmentos correrá en forma normal y, por lo tanto será "interrumpida" cada vez que llegue alguna señal a cualquiera de los pines del PortA.
Otra solución mejor (si se puede) es conseguirte un ATmega324, en este puedes habilitar directamente a los 8 pines del puertoA (o de cualquier otro) como fuentes externas de interrupciones y la OR correspondiente se hace dentro del chip, por ejemplo cualquier señal que llegue a cualquier pin del PortA activaría flag PCIF0 (para habilitar las interrupciones en los pines A0 a A7 debes setear el bit PCIE0 = Pin Change Interrupt 0)
Saludos.
 
A 0.01Hz en 30seg no contaria nada.
Una opcion es tomar el ultimo valor de PINA y guardarlo en una variable y compararlo despues con el valor actual de PINA, y si hubo un cambio se chequea el PIN que cambio de nivel.
Las interrupciones de timer es para el display.

Jeje bueno 0.01 era nomas de ejemplo en realidad sera como 0.1Hz mas menos, eso que me dices es lo que se me ocurrio y mas o menos intente hacerlo y seria asi:

if(PA.0 == 1) Checo si esta en alto
{
if(PA.0 == 0) Checo si esta en bajo si asi es entonces quiere decir que ya se genero un pulso
{
contador_De_pulso++;
}
}

Ahora esto tendria que hacerlo rapido bueno no tanto pero si lo suficiente, seguire viendo si es por aqui el camino gracias por tu ayuda

La forma más fácil es usando una interrupción externa; lo que debes hacer es una OR entre las 8 inputs del PortA, la salida de esta OR va hacia una de las interrupciones externas (INT0, INT1 o INT2). En la rutina que atenderá la interrupción externa en cuestión llevas la cuenta de las señales que lleguen a cada pin del PortA.
La rutina de atención de los display 7 segmentos correrá en forma normal y, por lo tanto será "interrumpida" cada vez que llegue alguna señal a cualquiera de los pines del PortA.
Otra solución mejor (si se puede) es conseguirte un ATmega324, en este puedes habilitar directamente a los 8 pines del puertoA (o de cualquier otro) como fuentes externas de interrupciones y la OR correspondiente se hace dentro del chip, por ejemplo cualquier señal que llegue a cualquier pin del PortA activaría flag PCIF0 (para habilitar las interrupciones en los pines A0 a A7 debes setear el bit PCIE0 = Pin Change Interrupt 0)
Saludos.

Hola gracias por tu ayuda, mira si se me habia ocurrido eso que me cuentas de usar las interrupciones el problema esta es que que pasaria si para mi desgracia ambos pulsos se generan al mismo tiempo, eso del atmega324 no lo habia visto voy a checarlo, a mi se me habia ocurrido otra cosa pero usando circuitos externos como un contador de 8 bits con salida tri-estado y usar un contador para cada sensor asi cuando termine de contar los 17 segundos solamente activo la salida de cada contador uno por uno y voy leyendo su cuenta y las almaceno en el micro como ves esa idea

Es que ademas se supone que debo controlar los 4 display a la vez que cuento 17 segundos y en esos 17 segundos debo contar los pulsos en los 8 pines del puerto entonces voy a usar el timer1 para generar los 17 segundos bueno voy a checar bien se agradece la ayuda de antemano
 
Última edición:
Yo siempre uso contadores anidados..... primero configuro una interrupcion para dar un valor fijo (por ejemplo 1mS) depues cuento 100 interrupciones, lo que me da 100mS, despues cuento 10 de esas interrupciones y me da 1S, y asi sucesivamente hasta llegar a meses, años etc...

Esa informacion la pongo en variables globales para que cualquier parte del programa pueda consultar la hora exacta de esta forma

cont_100ms
cont_1Seg
cont_1min
cont_1hor

requiere varias localidades de memoria... pero vale la pena... puedes llevar muchas cuentas al mismo tiempo
 
Los Display los debes controlar en la interrupción de un timer, que te puede servir perfectamente para hacer el contador anidad que comenta chico3001.

Según que ATmega te puede generar interrupciones en cualquier pin de entrada, así que puedes hacer que todos los pines de un puerto te activen una interrupción cuando camiben de estado, y luego, dentro de la interrupción miras quien ha cambiado.

También puedes ir mirando cada vez que se activa la interrupción del timer.

Para lo que tienes que hacer, el micro se puede pasar el 99% del tiempo 'durmiendo'.
 
Andala, bueno voy a dibujar el circuito que pretendo realizar y lo subo para que se den una mejor idea, ya ven una imagen dice mas que mil palabras sale ahorita son las 7:43 y ya voy de salida al trabajo jeje asi que sera mañana sale gracias
 
Atrás
Arriba