Estoy tratando de hacer que un ATTiny85 funcione con batería. Lo tengo cronometrado desde un cristal de 16.384 MHz, con el conjunto de fusibles de división por 8. Vcc es de 3,3 voltios. La Figura 22-7 en la hoja de datos dice que en reposo ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();
), debería consumir alrededor de 300 µA. De hecho, lo veo dibujando más como 850 µA. No puedo entender por qué el consumo de energía es el doble esperado. Apagué todo en PRR excepto el temporizador 0, que configuré para interrumpir cada 25 ms. Por lo tanto, debería pasar la mayor parte de su tiempo en estado inactivo, que es lo mejor que puedo hacer dado que todavía quiero que los temporizadores cuenten.
Los fusibles son 0x7f, 0xdf, 0xff.
Aquí está el código que se está ejecutando para esta prueba:
#include <Arduino.h>
#include <EEPROM.h>
#include <avr/sleep.h>
#include <avr/power.h>
#define P0 0
#define P1 1
#define P_UNUSED 2
ISR(TIMER0_COMPA_vect) {
// do nothing - just wake up
}
void setup() {
power_adc_disable();
power_usi_disable();
power_timer1_disable();
//PRR = _BV(PRADC) | _BV(PRTIM1) | _BV(PRUSI); // everything off but timer 0.
TCCR0A = _BV(WGM01); // mode 2 - CTC
TCCR0B = _BV(CS02) | _BV(CS00); // prescale = 1024
// xtal freq = 16.384 MHz.
// CPU freq = 16.384 MHz / 8 = 2.048 MHz
// count freq = 2.048 MHz / 1024 = 2000 Hz
OCR0A = 50; // 25 msec per irq
TIMSK = _BV(OCIE0A); // OCR0A interrupt only.
set_sleep_mode(SLEEP_MODE_IDLE);
pinMode(P_UNUSED, INPUT_PULLUP);
pinMode(P0, OUTPUT);
pinMode(P1, OUTPUT);
digitalWrite(P0, LOW);
digitalWrite(P1, LOW);
while(1) { sleep_mode(); }
}
void loop() {}
Usted dice que de acuerdo con la Figura 22-7 en la hoja de datos, solo debería consumir 300 µA, pero ese gráfico muestra el consumo de corriente para la operación sin división de reloj. Un oscilador de cristal que funciona a 16 MHz consumirá más corriente que uno que funcione a 2 MHz, y el divisor de 3 etapas agregará un poco más. La pregunta es: ¿cuánto más?
La hoja de datos también sugiere que la corriente inactiva se puede reducir dividiendo el reloj, pero nuevamente no dice cuánto se reducirá. Extrapolar la línea de 3,3 V sugiere que normalmente consumiría alrededor de 1,5 mA a 16,4 MHz, y 850 µA es una reducción significativa, pero ¿debería ser menor?
Si no puede usar un cristal de frecuencia más baja en los tableros que viene, es posible que no haya nada que pueda hacer. Sin embargo, mientras tiene el circuito en una placa de prueba, al menos podría probar un cristal de 2 MHz, para ver si ese es realmente el problema.
Tuve un problema similar con ese chip. El consumo de energía fue un 30% más de lo esperado.
¡Los problemas fueron GPIO sin usar!
Se configuraron como entradas y se dejaron flotando. La falta de un estado de entrada claramente definido hizo que el controlador GPIO consumiera mucho más de lo que se especifica.
La respuesta fue habilitar los pull-ups o configurar pines no utilizados como salidas.
¿Estás seguro de que los pines están colocados correctamente? En su código parece que sí, pero ¿lo comprobó?
pinMode(P_UNUSED, INPUT_PULLUP);
no es suficiente, entonces WTF?pinMode(3, INPUT_PULLUP);
y lo mismo para 4 y 5 no hizo nada.Me gustaría agregar que para un proyecto separado, hice esta pregunta y la respuesta también impactó dramáticamente esta pregunta. la limpieza ADCSRA
redujo el consumo inactivo a lo que se supone que debe tomar la figura 22-6, alrededor de 100 µA a una frecuencia de reloj del sistema dividida de 500 kHz, y esa es la frecuencia de reloj posdividida, no la frecuencia del cristal.
usuario36129
nsayer
nsayer
Ignacio Vázquez-Abrams
nsayer
jimmyb
nsayer
Ignacio Vázquez-Abrams
nsayer
Ignacio Vázquez-Abrams
ACSR
registro.nsayer
ACSR = _BV(ACD);
no cambió nada de manera apreciable.RJR
nsayer
jimmyb
nsayer
RJR
nsayer
nsayer