¿Se pueden ejecutar los microcontroladores a frecuencias de reloj arbitrariamente bajas?

La hoja de datos del ATTiny13A, por ejemplo, enumera la frecuencia mínima de 0 MHz. ¿Significa esto que el reloj puede funcionar a cualquier frecuencia arbitrariamente baja sin efectos nocivos? ¿Supongo que consume menos corriente a velocidades de reloj más bajas? ¿Significa 0 MHz que puede detener el reloj por completo y, mientras se siga aplicando energía, recordará su estado indefinidamente?

Me gustaría agregar, esta es una excelente pregunta. La mayoría de los EE superiores no se toman el tiempo para leer y pensar en las hojas de datos, lo cual es un complemento para usted o un insulto para ellos, me gustaría insinuar ambas cosas.
No estoy completamente seguro de que el oscilador RC interno se apague a menos que se lo indique específicamente (a través de varias opciones de ahorro de energía). No estoy seguro de para qué se usa, pero al menos para EEPROM y probablemente ADC.
@jippie, ¿qué RC interno estás diciendo? ATMegaX por ejemplo, tiene el RC interno para el reloj del sistema (normalmente 8Mhz, con prescaler div 8 opcional), tiene el oscilador de vigilancia. El reloj del sistema está seleccionado por fusible y probablemente esté apagado cuando se usa un reloj externo. Los demás como dijiste pueden estar deshabilitados por modos de ahorro de energía, pero dudo que se detengan por el reloj del sistema.

Respuestas (5)

Sí. Si la hoja de datos dice "funcionamiento completamente estático", entonces puede sincronizarlo a cualquier velocidad, incluso a 0 Hz. Un chip "dinámico" necesita tener un reloj a una velocidad específica o pierde su estado.

¿Tienes un ejemplo de un micro que permite esto?
Los microcontroladores que contienen flash en chip pueden especificar una velocidad de reloj de flash mínima (y máxima) al escribir en flash. Sin embargo, al leer desde flash, esto no se aplica.
MrEvil, la serie Atmel AVR ATtiny mencionada en la pregunta es completamente estática, como creo que la mayoría de los chips Atmel AVR. Y creo que la mayoría de los microcontroladores PIC de Microchip.
Me gustaría agregar MSP430 a la lista de todbot. La mayoría de los microcontroladores modernos lo hacen, el tipo dinámico es un dolor de cabeza para diseñar, por lo que la mayoría no lo hace.
En realidad, creo que el ADC en el ATTiny13A no funciona a bajas frecuencias, ¿tal vez debido a la descomposición del capacitor de muestreo y retención? "De forma predeterminada, el circuito de aproximación sucesiva requiere una frecuencia de reloj de entrada entre 50 kHz y 200 kHz para obtener la máxima resolución... El módulo ADC contiene un preescalador, que genera una frecuencia de reloj ADC aceptable a partir de cualquier frecuencia de CPU superior a 100 kHz".
endolito: estoy de acuerdo, los ADC generalmente no funcionan a bajas frecuencias. Por lo que puedo decir, todo lo demás en prácticamente todos los microcontroladores modernos continúa funcionando bien hasta "0 Hz", también conocido como "pausa indefinida". En particular, muchos microcontroladores tienen un modo de "suspensión de bajo consumo" que detiene todos los relojes, hasta que algo, generalmente una persona que presiona un botón, lo activa y continúa justo donde lo dejó. en.wikipedia.org/wiki/Static_logic_(digital_logic)
El RCA 1802 ( en.wikipedia.org/wiki/RCA_1802 ) fue, AFAIK, el primer micro que permitió la operación estática, allá por 1976.
Sin embargo, el ADC puede considerarse un periférico desde la perspectiva del rango de reloj del núcleo de la CPU. La operación estática no parece ser un gran problema. Puede ensamblar un circuito secuencial usando chips TTL y funcionará a velocidades de reloj arbitrariamente bajas. Son cosas como la presencia de DRAM que necesita actualización las que crean desafíos.
@Kaz: Al fabricar un dispositivo NMOS, es más eficiente energéticamente subir incondicionalmente un bus en la mitad de un ciclo y luego bajarlo condicionalmente en la otra mitad de un ciclo, que usar un pull-up pasivo que debe ser fuerte lo suficiente como para hacer subir el autobús en un ciclo. El primer enfoque desperdiciará corriente proporcional a la capacitancia real del bus en cada ciclo, mientras que el segundo desperdiciará corriente proporcional a la corriente de suministro real de un circuito cuya capacidad de suministro de corriente en el peor de los casos (más baja) debe ser suficiente para alimentar el peor de los casos ( máximo) capacitancia del bus.
@Kaz: Muchos dispositivos NMOS como el 6502 usaban lógica dinámica para cosas como la conducción de autobuses, y no solo "memoria" dinámica. El uso de la conducción de bus dinámica significa que se deben garantizar las relaciones de capacitancia/fuga, pero por lo demás permite márgenes mucho más generosos en muchos otros parámetros de fabricación de lo que sería posible en un diseño completamente estático.

Estoy publicando otra respuesta, solo porque la última pregunta que tenía no fue respondida antes.

Todbot es completamente correcto. También consumirá menos energía a velocidades más bajas. También significa que si proporciona su reloj desde otro procesador, por ejemplo, puede dejar de suministrarlo en cualquier momento y luego comenzar a sincronizarlo más tarde, siempre que no vaya más rápido que la velocidad máxima, estará bien.

Los chips que tengo obtienen un cambio de orden de magnitud entre el oscilador de 32768Hz y uno de 1MHz. He tenido aplicaciones en las que no necesitaba velocidad, solo necesitaba a otro pequeño que manejara algunos datos básicos por mí.

Espero que esto ayude.

Siempre he querido ejecutar la línea de reloj de un microcontrolador con un botón. Que el humano sea el reloj. :) Hablando en serio, una de las cosas realmente buenas de estos diseños estáticos es que su consumo de energía es lineal con la velocidad del reloj: reduce la velocidad del reloj y usa menos energía. Esto puede ser muy útil.
Sí, pero me gusta señalar que el consumo de energía es una función lineal con una compensación, incluso sin un reloj, siguen consumiendo energía, especialmente con las salidas activadas. Acabamos de recibir nuevos pasantes en mi trabajo, sugeriré que usemos un botón y veamos qué sucede.
@todbot Buena idea. :-) Pero asegúrese de rebotar el pulsador.
Pruebe con una "manivela de molienda" (como en el significado de la jerga: jargon.net/jargonfile/g/grindcrank.html ) :-)) (y sí, hace muchos años construí uno para pasar por el código cuando estaba usando Turbo Pascal en la escuela :-)
@todbot No es realmente descabellado o difícil, si puede aceptar una abstracción aproximada. Hay varios ejemplos de personas que usan estos dispositivos para enseñar cómo funcionan las computadoras. Myke Predko tiene un libro realmente bueno, e incluso viene con PCB (aunque no para el proyecto de la computadora): amazon.com/Digital-Electronics-Guidebook-Michael-Predko/dp/…
@todos, estoy 99 % seguro de que todbot sabía que funcionaría y pretendía que fuera una broma, ya que la mayoría de los procesadores RISC necesitan tantos tictacs de reloj que sería mucho tiempo. @starblue, Mientras escribía antes, pensé en bromear sobre olvidarse de rebotar para obtener una frecuencia de reloj más alta por pulsación.
@Axeman: el archivo de jerga afirma que la "manivela de molienda" es mítica. Aquí hay evidencia de lo contrario: computerhistory.org/babbage . La manivela de la derecha impulsa la computadora; el de la izquierda maneja la impresora. Puede tener una mejor idea del tamaño de la cosa mirando el video en esa página; mide unos dos metros y medio de alto.
@PeteBecker: La Calculadora Curta también tenía una manivela, que en realidad se podía tirar hacia arriba o hacia abajo para seleccionar la suma o la resta.

La mayoría de los diseños de microcontroladores modernos funcionarán con cualquier patrón en su entrada de reloj, siempre que ningún pulso alto esté por debajo de una longitud mínima determinada, ningún pulso bajo esté por debajo de una longitud mínima determinada y ningún pulso bajo-alto-bajo o alto-bajo-alto. par de pulsos está por debajo de cierta longitud. Esencialmente, lo que sucede es que después de que el chip realiza todas las acciones asociadas con un borde de reloj en particular, el chip estará en un estado en el que no hace nada más que esperar el siguiente borde de reloj. Si el siguiente borde del reloj no llega hasta dentro de diez días (a menos que el chip tenga un perro guardián externo), el chip estará en el mismo estado que si el borde hubiera llegado en el momento en que el chip estaba listo para recibirlo.

Tenga en cuenta que, en general, pausar el reloj en un microcontrolador reducirá sustancialmente el consumo de corriente, pero no tanto como usar la función de "suspensión". El consumo de corriente de la mayoría de los microcontroladores en el modo "ejecutar" se puede estimar bastante bien como una corriente de reposo constante más una cierta cantidad de corriente por ciclo por segundo (que podría expresarse de forma más "natural" como carga por ciclo). Por ejemplo, un chip puede tener una corriente de reposo de 10 uA, más una corriente de 0,1 mA/MHz (100 pC/ciclo). Hacer funcionar un chip de este tipo a 10 MHz produciría una corriente de 1,01 mA. Ejecutarlo a 1 MHz produciría 0,11 mA. Ejecutarlo a 100 KHz produciría 0,02 mA. Ejecutarlo a 1 Hz produciría 0.0100001 mA. Por otro lado, el chip podría ofrecer una corriente de reposo de 1uA. Generalmente, entrar en el modo de suspensión apagará por completo las áreas del chip que no van a hacer nada útil mientras el chip está durmiendo, evitando así cualquier fuga de corriente que puedan tener dichas áreas. En algunos casos, también reducirá el voltaje en áreas como los archivos de registro a un nivel en el que los archivos de registro pueden contener su contenido, pero no acceder a ellos muy rápidamente (dado que no se accederá a ellos en absoluto, la velocidad de acceso no importa) .

Algunos microprocesadores, microcontroladores y otros dispositivos más antiguos tenían tiempos máximos de reloj alto y/o reloj bajo. Dichos procesadores hicieron uso de la lógica dinámica para ahorrar circuitos. Como ejemplo de lógica dinámica, considere un registro de desplazamiento: un bit de registro estático típico requiere un circuito de dos transistores para mantener el valor, mientras que un bit de registro dinámico mantiene el valor en la puerta de un transistor de lectura. Se puede realizar un registro de desplazamiento dinámico con reloj de dos fases en NMOS utilizando cuatro NFET y dos resistencias por bit. Un registro de desplazamiento estático requeriría ocho NFET y cuatro resistencias por bit. Los enfoques de lógica dinámica no son tan comunes hoy en día. En la década de 1970, la capacitancia de la puerta era sustancial y no había forma de deshacerse de ella. Por lo tanto, no había ninguna razón particular para no aprovecharlo. Hoy en día, la capacitancia de la puerta es generalmente mucho más baja, y los fabricantes de chips están tratando activamente de reducirlo aún más. Hacer que la lógica dinámica funcione de manera confiable a menudo requeriría trabajar deliberadamente para aumentar la capacitancia de la puerta. En la mayoría de los casos, el área adicional del chip necesaria para aumentar la capacitancia podría usarse con la misma eficacia para agregar más transistores y hacer que la capacitancia sea innecesaria.

Usted menciona NMOS y IIRC, existe una conexión entre la popularidad de la lógica dinámica y el MOS complementario (CMOS) que aún no está disponible.
@jpc: He examinado los esquemas de varios chips NMOS, algunos con gran detalle, incluido el Atari 2600 TIA, que es un verdadero trabajo de genio, la gente todavía está encontrando cosas nuevas que hacer con él tres décadas después. Creo que una ventaja de NMOS versus CMOS desde el punto de vista de la conveniencia del diseño es que el 'disparo' (activación simultánea accidental de la unidad de lado alto y bajo) no es un factor, aunque confesaré cierta curiosidad sobre por qué CMOS no se ejecuta a un voltaje lo suficientemente bajo como para que el punto de cruce en una entrada deje los controladores de lado alto y bajo apagados, en lugar de activar ambos.
@jpc: en NMOS, es posible implementar una puerta XOR con dos transistores y dos resistencias, si las entradas son lo suficientemente "fuertes". Incluso si uno tiene que agregar inversores a ambas entradas, una puerta xor de cuatro transistores y cuatro resistencias sería mejor que muchos otros enfoques. Sin embargo, nunca he visto el enfoque utilizado, aunque diseñé un circuito similar usando BJT alrededor de 1978 (el concepto de diseño funcionaría mejor con MOSFETS, pero no sabía nada sobre ellos).
+1 - Siento que la verdadera joya que mencionaste aquí es que las velocidades de reloj más bajas ahorran energía, pero no tanto como los modos de suspensión que están diseñados específicamente para optimizar el ahorro de energía. Mi instinto me dice que ahorrará más energía al ejecutar un oscilador rápido combinado con un uso juicioso del modo de suspensión, funcionando constantemente a una frecuencia realmente baja.
@JoelB: Eso depende de muchos factores. En muchos procesadores, hay una demora entre encender un reloj rápido y poder usarlo realmente; durante este tiempo, uno desperdiciará energía. Si uno tuviera que despertarse, por ejemplo, 100 veces por segundo, puede ser mejor correr lentamente de forma continua que estar arrancando y parando constantemente. Por otro lado, si uno va a iniciar y detener el reloj rápido, puede ser bueno minimizar la cantidad de tiempo que está funcionando en la medida en que pueda hacerlo sin desperdiciar energía adicional. Por ejemplo...
...si la CPU tiene un "modo de voltaje de núcleo alto" que puede funcionar hasta 16MHz y un "modo de voltaje de núcleo bajo" que puede funcionar hasta 4Mhz, cambiar entre los modos "parada" y "4MHz" podría ser mejor que cambiar entre los modos "stop" y "1MHz" si el primero requiere pasar menos tiempo despierto; incluso si cambiar al modo de 16Mhz reduciría aún más el tiempo de vigilia, probablemente no valdría la pena el costo adicional de energía.
@supercat: depende absolutamente de numerosos factores (algunos no cuantificables). Al final, la energía es el rey y tendría que adaptar su esquema de reloj con el conocimiento de su aplicación/procesador y la cantidad/frecuencia del procesamiento. Solo quería señalar la perspectiva de "bosque para los árboles" que trajo al mencionar el modo de suspensión en esta discusión. Mi instinto me dice que todavía hay mucho código de producción con 'while(1){_nop;}' que los ingenieros bien intencionados piensan que están ahorrando la mayor cantidad de energía al ejecutar a velocidades más lentas en lugar de implementar el modo de suspensión correctamente.
@JoelB: Su comentario me recordó un problema que algunos ingenieros tenían hace algún tiempo: la salida de audio del sistema a veces zumbaba de manera molesta. Resultó que cada vez que el sistema operativo detectaba que la CPU no tenía nada que hacer, la ponía a dormir. Esto redujo el consumo de energía, lo que a su vez permitió que VDD aumentara ligeramente. Cada 10 ms, la CPU se despertaba para ver si había algo más que hacer. El problema se solucionó agregando algo como: "do {} while(audio_powered_on());" antes de la instrucción "dormir ()" en la tarea inactiva ya que, en esa situación, el ahorro de energía no era el rey.
@supercat: parece que esta historia demuestra todo lo contrario. Se debería haber diseñado una fuente de alimentación correctamente especificada/regulada/filtrada/desacoplada para que no tuviera efectos perceptibles en el audio por encima de la carga operativa esperada del procesador. Entonces parece que la energía (o más específicamente el diseño de la fuente de alimentación ) sigue siendo el rey. Gran arreglo por cierto!
¿Qué quieres decir con que el sueño tiene menos potencia que la parada del reloj? En atmel, por ejemplo, lo único diferente entre dormir y correr es qué relojes están detenidos. ¿No hay nada más que un sueño pueda hacer? ¿A menos que sea cortes de energía a las secciones?
@JoelB: El filtrado de la fuente de alimentación tiene tres aspectos: (1) evita que la basura del interior salga; (2) evitar que la basura del exterior entre en el interior; (3) evitar que los cambios en el consumo de corriente cambien el voltaje interno. La optimización para el n.° 1 generalmente tendrá un impacto adverso en el n.° 3. Si el dispositivo hubiera usado suministros completamente separados para el audio y la CPU, eso habría evitado el problema pero requeriría más electrónica de suministro de energía; el problema era que la CPU y los circuitos de audio estaban del mismo lado del mismo filtro.
@SectoKia: La alternativa no era entre detener el reloj y dormir, sino entre dormir cuando estaba inactivo o ejecutar instrucciones inútiles para garantizar un consumo de energía más uniforme. Aunque muchas CPU cortan la energía a secciones significativas en sus modos de suspensión de menor consumo.

Sí, puedes parar el reloj por completo y reiniciarlo más tarde sin consecuencias. Incluso podría reemplazar el reloj por un botón y recorrer su programa literalmente paso a paso (frecuencia: alrededor de 0,1 Hz).

La potencia es casi lineal con la frecuencia: a 10 MHz el microcontrolador consumirá 10 veces más potencia que a 1 MHz. Sin embargo, esto no significa que a 0 Hz el consumo sea completamente cero. Siempre hay disipación estática, pero eso es muy bajo, típicamente 1 uA o menos.

PD: observe que el ADC tiene una frecuencia mínima de funcionamiento. Si la frecuencia es demasiado baja, el condensador sobre el que se mide el voltaje se descargará demasiado y su medición será incorrecta.

¿Presionar el botón? ¿Qué pasa con el rebote?
Se requiere antirrebote.

Llegando tarde a esta pregunta, me recordó un proyecto que vi hace un tiempo.

Es un detector de murciélagos que usa un PIC que funciona a cero Hz la mayor parte del tiempo, y luego es cronometrado por la misma señal que está detectando.

http://www.micro-examples.com/public/microex-navig/doc/077-picobat.html

En este proyecto, la señal es tanto el reloj como la energía del chip . :)