Retraso máximo alcanzable con microcontrolador

Estoy diseñando un circuito de retardo basado en un microcontrolador para implementar retardos de 2 horas, 1 hora, 45 minutos y 30 minutos. El circuito apagará automáticamente un relé después de que haya transcurrido este período de tiempo.

Estoy atascado con una selección limitada de microcontroladores disponibles localmente en el mercado:

  • 89C51
  • 89C52
  • 89S51
  • 89S52
  • 89C2051
  • FOTO 16C71
  • FOTO 16F84

He revisado las hojas de datos de estos microcontroladores pero no hay información sobre el retardo máximo que pueden producir.

¿Cuál es el retardo máximo que se puede producir con estos microcontroladores?

Incluso la serie PIC10 de 6 pines puede hacer eso. Incluso es posible que desee contar la cantidad de tiempos de espera de vigilancia secuenciales como se sugiere en la respuesta a continuación, si son más largos que el valor máximo del temporizador 0.
@ TheNoble-Coder, aspecto importante, ¿qué precisión necesita?
Estoy de acuerdo con @kortuk. Si la precisión es un problema, será difícil obtener un temporizador preciso solo con un mcu, incluso con un cristal bastante bueno. ¿Puedo recomendar un buen módulo RTC? hojas de datos.maxim-ic.com/en/ds/DS3231.pdf
@CMP, casi todos quieren precisión, pero a menudo piensan en términos de su propia precisión. Mucha gente sabe que es realmente fácil obtener +- unos pocos minutos ellos mismos y asumen que un microcontrolador puede hacerlo fácilmente, pero obtener de manera confiable +-1 minuto en 1 año con un microcontrolador sin saber lo que debe compensarse puede ser casi imposible.

Respuestas (5)

El retraso puede ser tan largo como quieras. Si un temporizador no le da el retraso que necesita, simplemente incremente un registro, o varios registros, cada vez que se desborde. Aquí hay un programa simple que usa Timer0 que ilustra la técnica:

        #include    "P16F88.INC"

#define LED 0

    errorlevel -302     ;suppress "not in bank 0" message

#define RB0 0
#define INIT_COUNT 0    ;gives (255 - 199) * 17.36 = 972 us between interrupts


    cblock  0x20
    tick_counter
    temp    
    endc

    ;reset vector
    org     0
    nop
    goto    main

    ;interrupt vector
    org     4
    banksel INTCON
    bcf     INTCON,TMR0IF   ;clear Timer0 interrupt flag
    movlw   0x00            ;re-initialise count
    movwf   TMR0
    decf    tick_counter,f
    retfie

main:
    banksel OPTION_REG
    movlw   b'00000111'     ;prescaler 1/128
    movwf   OPTION_REG      ;giving 7.3728 Mz/128 = 57600 Hz (period = 17.36 us)
    banksel TMR0
    movlw   0x00            ;initialise timer count value
    movwf   TMR0
    bsf     INTCON,GIE      ;enable global interrupt
    bsf     INTCON,TMR0IE   ;enable Timer0 interrupt
    banksel TRISB
    bcf     TRISB,LED   ;RB0 is LED output
    banksel 0

mainloop:
    goto    mainloop

    bsf     PORTB,LED
    call    dly
    bcf     PORTB,LED
    call    dly 
    goto    mainloop

dly:
    movlw   20
    movwf   tick_counter
dly1:
    movf    tick_counter,f
    skpz
    goto    dly1
    return

    end
solo quiero preguntar ¿Es correcto este concepto de que un retraso tan largo no puede ser producido por 89c51 o 89c52?
Puede usar la misma técnica con cualquier MCU.
Ops, creo que el formato del código necesita edición.
Ser exigente, hay un límite. Dado que la memoria RAM y el número de registros son finitos, el recuento máximo que puedes hacer con ellos también es finito, aunque enorme. Tu respuesta es buena y ya hice +1.
@Telaclavo: abordé la cantidad de RAM requerida. No es mucho, en realidad.
@FakeName Su punto es que con cualquier cantidad finita de ram, hay un número máximo finito (aunque grande) con el que puede contar.

No se especifica porque cualquier microcontrolador normal puede, por medio del software, crear un retraso esencialmente ilimitado, es decir, de mucho más tiempo del que hay razón para esperar que el circuito aún esté operativo o que alguien se preocupe por el resultado.

Esencialmente, encuentra algún medio para generar un retraso breve, como hacer que el procesador ejecute algunas instrucciones, o usar un temporizador de hardware, y luego usa un contador para hacerlo cuantas veces sea necesario para compensar el período de retraso. tu deseo

Cada byte de registro disponible o almacenamiento de RAM para el valor de conteo aumentaría su retraso disponible en un factor de 256. Con tan solo 64 bytes de RAM (la mayoría de los micros tienen varias veces eso), podría crear retrasos donde el la edad de la tierra palidece en comparación.

Gracias por la respuesta. En realidad, este microcontrolador tiene solo 1 byte (8 bits). ¿Puedo producir tanto retraso con él?
@ TheNoble-Coder: se refiere al ancho de una sola operación. Al hacer operaciones matemáticas en múltiples operaciones, puede incrementar números cerca del límite de su memoria, al igual que puede hacer manualmente aritmética de varios dígitos, un lugar de dígito a la vez. De modo que se mantiene el análisis esencialmente ilimitado. FWIW, un compilador de C tenderá a manejar matemáticas de hasta 32 bits para usted sin ningún truco especial, haciendo la combinación de operaciones necesarias para lograr eso en un chip de 8 bits detrás de escena para usted. Los bucles anidados de 32 bits serían una solución fácil de implementar, hasta un factor de 4 mil millones para cada bucle.
mmm. Tengo tu punto. Muchas gracias.
Algunos controladores PIC tienen tan solo 24 bytes de RAM. Por otro lado, 24 bytes serían suficientes para contar hasta casi 10^58. Un montón de tiempo.
Si está contando segundos, 16 bits le darán alrededor de 4,5 horas. Con cuatro configuraciones posibles, necesita 2 bits para el modo en el que se encuentra, y tal vez dos bits más para saber si está contando o no, y el estado actual de su relé. Eso le deja 21,5 bytes de RAM para el resto de su programa, incluso en la máquina de 24 bytes. Apretado, pero esperar algo es factible incluso en un sistema muy restringido.
@wrosecrans: no olvide que puede reutilizar el espacio de la memoria, especialmente si está escribiendo en ensamblador. Siempre que no necesite estar haciendo otra cosa mientras espera, puede usar la misma RAM para varias tareas.
@wrosecrans La mayoría de estos MCU realmente pequeños usan arquitecturas de Harvard, y al menos tienen áreas de memoria separadas. Los 24 bytes de RAM son distintos de cualquier memoria de programa que tenga.

Otros ya explicaron que realmente no hay un límite para lo que puede hacer, y Fake Name hizo malabares con números grandes para mostrar que 5 bytes serían suficientes en cualquier controlador.

¡Un desperdicio! :-) Al elegir cuidadosamente un microcontrolador, puede usar su temporizador con hasta 9 horas de retraso con solo 1 byte de RAM.

Lo primero que debe hacer es sincronizar su microcontrolador lo más lento posible. El MSP430 puede funcionar con un cristal de 32,768 kHz, que es lo más lento que puede utilizar si desea cierta precisión. (Los relojes más lentos no usarán un cristal).

A continuación, utilice preescaladores. El MSP430 puede preescalar la frecuencia del cristal ÷ 8 para crear un reloj auxiliar A C L k . A C L k entonces será 4096Hz. Puedes usar A C L k para cronometrar un temporizador de 16 bits, pero también aquí tienes un ÷ Opción de 8 preescaladores. Usar eso significa que el temporizador de 16 bits se sincroniza a 512 Hz. 2 dieciséis 512 H z = 128 s. Entonces, usando un cristal de baja frecuencia y dos preescaladores, el temporizador se desbordará cada 128 s. El uso de un contador de 8 bits para contar el número de desbordamientos del temporizador le permite contar 256 × 128s = 32768s, o más de 9 horas, con un solo byte.

Nitpick: un prescaler es un tipo de memoria, ya que tiene un estado interno. También lo son los temporizadores. :)
@Nick - ¡Pero no son RAM!
Correcto, solo estoy señalando que el hecho de que no esté usando la memoria del sistema no le permite evitar el problema de que el límite superior de conteo se basa en la cantidad de bits de estado.

El retraso máximo alcanzable se basa en una combinación del reloj del sistema y la RAM disponible.

Básicamente, puede crear variables grandes (por ejemplo, entradas de 32 bits, entradas de 64 bits) en una MCU de 8 bits al distribuir la int en varios segmentos de RAM de 8 bits. Se necesitan varias operaciones para realizar la suma o la multiplicación de dichos números (ya que debe iterar sobre los bytes individuales), pero la velocidad no es exactamente crítica aquí, por lo que está bien.


Entonces, suponiendo un reloj de 20 Mhz, ¿qué tamaño de variable necesita?

Estoy haciendo muchas suposiciones aquí. Primero, asumo una paridad de instrucción de reloj. Muchas MCU requieren varios ciclos de reloj para ejecutar una sola instrucción, lo que reduciría la velocidad de reloj efectiva. En segundo lugar, asumo que su contador base se incrementa al mismo ritmo que el reloj del sistema. Esto generalmente solo es cierto para los contadores de hardware. Tercero, los números que estoy usando para las cosas (la duración de un año, etc...) son versiones redondeadas de los números reales. Por último, todo este ejercicio es bastante tonto.

20 METRO h z = 20 × 10 6 = 20 , 000 , 000
Bien, yo o gramo ( 20 , 000 , 000 ) yo o gramo ( 2 ) = 24.2534966642115 , por lo que necesita ~24,25 bits para retrasar un segundo.
2 horas = 2 60 60 = 7200   segundos, por lo que necesita yo o gramo ( 20 , 000 , 000 7 , 200 ) yo o gramo ( 2 ) = 37.0672778554286 , por lo que necesita 37,06 (o básicamente 38 bits) bits de RAM para representar un retraso de 2 horas.

Entonces... Suponiendo que su microcontrolador tenga al menos 5 bytes de RAM, todos los dispositivos enumerados funcionarán.


Por diversión, veamos cuánto long longduraría una de 64 bits:

2 64 = 18 , 446 , 744 , 073 , 709 , 551 , 616
18 , 446 , 744 , 073 , 709 , 551 , 616 / 20 , 000 , 000 =   922337203685.478     Segundos
922337203685 60 60 24 365 =   29247.120     años

Entonces, con solo 8 bytes de memoria, parece que estarás bien durante al menos los próximos 30 mil años.

¿Qué pasa si no es suficiente?
Representar su resultado en 15 dígitos significativos es ridículo. Incluso ese no es el valor exacto, entonces, ¿cuál es exactamente el punto? Muchas personas no parecen darse cuenta de lo poco 1 en 10 15 es. Incluso en la misma línea, elimina 11 de los dígitos, cometiendo un error de redondeo de 37.06 en el proceso. Así que empiezas con 15 dígitos y terminas con 4 donde el último está mal...
La duración del año tropical es de unos 365,24219 días. Su cálculo para la cantidad de años que comienza con 15 dígitos para la cantidad de segundos tiene un error en el cuarto dígito. Solo para ilustrar lo inútil que es todo.
@stevenvh - ¿Es el resultado de mi calculadora? Ciertamente no afirmo que sea esa desviación precisa, diablos, del 0,1% en el oscilador del sistema, lo que hará que retrasos tan largos sean muy imprecisos, y mucho menos la deriva en un oscilador RC (si se usa tal).
Realmente, es más que truncar las precisiones en una calculadora digital moderna es más difícil que usar el valor numéricamente preciso , pero realmente inexacto . usé (el símbolo TeX "aproximado").
Realmente, es solo un ejercicio (algo) tonto, que muestra cuán poca RAM se requiere para lograr retrasos ridículamente largos.
"Realmente, es solo un ejercicio (algo) tonto". Por supuesto, estoy de acuerdo en eso. Pero incluso con el   Espero que todos menos quizás el último dígito sean correctos.
@stevenvh: agregué una nota con respecto a su punto sobre la duración de un año. esta justo antes del comentarioLastly, this whole exercise is rather silly.
Francamente, la inexactitud en la duración de un año es solo un error de ~0.06%. Esperaría que la deriva del oscilador fuera de órdenes de magnitud más grandes que eso, y eso no es exactamente algo que pueda solucionar aumentando la precisión de las constantes que estoy usando.
@abdullah: 128 bits le dan un retraso máximo de   5.4 × 10 23 años. Eso debería ser suficiente para hervir esos huevos.
@stevenvh - En ese punto, creo que puedes dejar que el calor de la muerte del universo los hierva por ti.
@stevenvh ah, eso es exactamente lo que necesito, ¡gracias!

Tenemos cuatro bancos de memoria cada uno con ocho registros r0 a r7. Utilizando cualquier número de registros podemos generar retrasos incluso de 10 horas

Sería de ayuda si pudieras explicar más tu sugerencia. En este momento, no está claro si se relaciona con alguno de los procesadores de la pregunta.