I modified the previous watchdog timer code to test the current draw of ATtiny85 ticking a clock using POWER_DOWN deep sleep.
In summary, the watchdog timer wakes up the ATtiny85 every sec. The tickpin is toggled within a 200ms window using IDLE sleep (via Timer0), then it will go back to deep sleep for 800ms. The current draw as measured is 1.7mA.
If the deep sleep current draw of the D1 Mini can be reduced from 0.8 to 0.1mA by using a barebones ESP8266, then the current draw of the ATtiny85 is only 1mA.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 | #include <avr/io.h> #include <avr/wdt.h> #include <avr/sleep.h> #include <avr/interrupt.h> #include <avr/power.h> #define TIMER0_PRESCALER 1024 #define OCR0A_DEFVAL ((byte)(F_CPU / (float)TIMER0_PRESCALER * 200/1000.0) - 1) #define adc_disable() (ADCSRA &= ~(1<<ADEN)) // disable ADC (before power-off) volatile byte timer0_tickpin = PB3; volatile bool wdtimer = false; void startTimer0() { // Set prescaler to 1024, thereby starting Timer0 TCCR0B = bit(CS02) | bit(CS00); } void stopTimer0() { // Set prescaler to 0, thereby stopping Timer0 TCCR0B = 0; } // Interrupt service routine for Timer0 // The effective outcome is to toggle tickpin high for 100ms, then rest for 200ms ISR(TIMER0_COMPA_vect) { stopTimer0(); digitalWrite(timer0_tickpin, LOW); timer0_tickpin = (timer0_tickpin == PB3 ? PB4: PB3); } ISR(WDT_vect) { wdtimer = true; } void setup() { pinMode(PB3, OUTPUT); digitalWrite(PB3, LOW); pinMode(PB4, OUTPUT); digitalWrite(PB4, LOW); power_adc_disable(); // Reset prescalers for Timer0 and Timer1 GTCCR |= bit(PSR0) | bit(PSR1); // Setup Timer0 (but don't run it yet) TCCR0A = 0; TCCR0B = 0; TCNT0 = 0; TCCR0A = bit(WGM01); // CTC mode OCR0A = OCR0A_DEFVAL; // Interrupt on compare match with OCR0A TIMSK |= bit(OCIE0A); // Set up watchdog timer MCUSR &= ~_BV(WDRF); WDTCR |= (_BV(WDCE) | _BV(WDE)); // Enable the WD Change Bit WDTCR = _BV(WDIE) | // Enable WDT Interrupt _BV(WDP2) | _BV(WDP1); // Set Timeout to ~1 seconds (or something) set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_mode(); } void loop() { if (wdtimer) { wdtimer = false; digitalWrite(timer0_tickpin, HIGH); startTimer0(); set_sleep_mode(SLEEP_MODE_IDLE); sleep_mode(); } else { set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_mode(); } } |
In summary, the watchdog timer wakes up the ATtiny85 every sec. The tickpin is toggled within a 200ms window using IDLE sleep (via Timer0), then it will go back to deep sleep for 800ms. The current draw as measured is 1.7mA.
If the deep sleep current draw of the D1 Mini can be reduced from 0.8 to 0.1mA by using a barebones ESP8266, then the current draw of the ATtiny85 is only 1mA.
Comments
Post a Comment