Estoy intentando que un ATTiny85 funcione con una batería. Lo tengo cronometrado desde un cristal de 16,384 MHz, con el fusible de división por 8 puesto. Vcc es de 3,3 voltios. La figura 22-7 de la hoja de datos dice que en reposo ( set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode();
), debería consumir unos 300 µA. En realidad, veo que consume más bien 850 µA. No puedo entender por qué el consumo de energía es el doble de lo esperado. He apagado todo en PRR excepto el timer0, que he configurado para interrumpir cada 25 ms. Así que debería pasar la mayor parte de su tiempo en estado de reposo, que es lo mejor que puedo hacer dado que todavía quiero que los temporizadores cuenten.
Los fusibles son 0x7f, 0xdf, 0xff.
Este es el código que se ejecuta 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() {}
0 votos
¿Qué está utilizando para medir la corriente? ¿Interrumpes las líneas Vcc directamente a la MCU o hay un regulador de voltaje en medio? ¿A qué están conectadas tus entradas/salidas?
0 votos
Estoy utilizando un µCurrent Gold. Todo esto está en una protoboard, así que es muy directo. No hay entradas. Las dos salidas están conectadas a LEDs por el momento, pero es un punto discutible dado que escribimos LOW (por lo que los LEDs están apagados) y luego dormimos para siempre.
0 votos
Además, si cambio la suspensión a SLEEP_MODE_PWR_DOWN, me hacer ver el nivel de consumo que espero: del orden de 200 nA.
0 votos
¿Qué revisión del chip está utilizando?
0 votos
Es un PDIP. Hay un montón de letras en la parte inferior. De izquierda a derecha, de arriba a abajo: 3W1 160 B1 1P 1328 B3. La parte superior sólo dice 1328 ATTINY85 20PU.
0 votos
¿Has probado con un cristal de 2 MHz en lugar de hacer funcionar el oscilador a 16 MHz y dividirlo dentro del uC?
0 votos
@HannoBinder No. Pero no hacen cristales de bajo valor en la huella que tengo en las tablas que vienen. Si esa es la respuesta final, que así sea, pero no hay nada en la hoja de datos que sugiera que la frecuencia preescalada vaya a suponer un doble consumo de energía. Todo lo contrario.
1 votos
¿Mataste al comparador?
0 votos
@IgnacioVazquez-Abrams Si no está implícito en los 0 bits del código anterior, entonces no. Me puedes dar una referencia del datasheet?
0 votos
Sección del comparador analógico,
ACSR
registro.0 votos
@IgnacioVazquez-Abrams Añadiendo
ACSR = _BV(ACD);
no cambió nada de manera apreciable.1 votos
¿Has echado un vistazo a algunos de los trucos que hizo el chico de jeelabs? Mira aquí (empieza a leer al final): jeelabs.org/tag/lowpower
1 votos
@RJR He echado un vistazo, y por desgracia muchos de sus trucos no funcionan porque sólo puedo usar SLEEP_MODE_IDLE porque necesito mantener el temporizador en funcionamiento. Esta aplicación es un reloj.
0 votos
¿Detector de marrones en funcionamiento?
0 votos
@HannoBinder No. El ajuste de fusible alto de 0xDF lo desactiva.
1 votos
Si se trata de un reloj, ¿puedo sugerir que funcione con el oscilador interno y que utilice un cristal de reloj en el temporizador 2 para disparar la interrupción del perro guardián? A continuación, puede utilizar el sueño profundo. Creo que hay un post en el blog de jeelabs sobre eso en algún lugar también.
1 votos
Todo lo que veo en Google sugiere que están usando un módulo RTC externo. Si tienes un RTC, entonces, sí, puedes usar el watchdog y el oscilador interno porque el reloj de la CPU no es importante. En este caso, sin embargo, quiero la precisión del cristal. Y también, esto es un ATTiny85 - no hay temporizador 2, sólo 0 y 1, y el temporizador 1 consume un orden de magnitud más de energía que el temporizador 0. No sé cómo se puede conectar un cristal a un ATTiny sin ningún componente externo adicional que no sea el reloj del sistema.
1 votos
Ah. He encontrado jeelabs.org/2011/06/28/jeenode-with-a-32-khz-crystal . Eso es lo que estabas hablando, pero eso es un ATMega, no un ATTiny.