Hallo!
Ich habe hier gerade eine kleine Schaltung mit einem Tiny44A und den Prozessor muss ich mal in den tiefen Schlaf versetzen.
Ich habe da in meinem main() drei Zustände, im dritten mache ich da zwei LEDs sicher aus und hätte erwartet, dass ich da auf einem minimalen Stromverbrauch komme.
Nun muss ich feststellen, dass ich am Prozessor nie unter einen Strombedarf von ca. 3mA komme.
Hat hier jemand einen Tipp??
CodeBox C
Ich habe hier gerade eine kleine Schaltung mit einem Tiny44A und den Prozessor muss ich mal in den tiefen Schlaf versetzen.
Ich habe da in meinem main() drei Zustände, im dritten mache ich da zwei LEDs sicher aus und hätte erwartet, dass ich da auf einem minimalen Stromverbrauch komme.
Nun muss ich feststellen, dass ich am Prozessor nie unter einen Strombedarf von ca. 3mA komme.
Hat hier jemand einen Tipp??
CodeBox C
#include <avr/io.h> #define F_CPU 8000000 #include <avr/wdt.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/sleep.h> #include <util/delay.h> #include <stdbool.h> #define LED_RED (1<<PORTA7) #define LED_GREEN (1<<PORTA6) #define Buzzer (1<<PORTA3) volatile uint8_t sleep_interval=0; void init_wdt(); void delay(uint16_t ms); void sleep(uint8_t s); void slow_clock(); int main() { DDRA |= LED_GREEN | LED_RED | Buzzer; PORTA |= LED_GREEN | LED_RED; PORTA &= Buzzer| LED_RED; init_wdt(); //slow_clock(); while (1) { sleep(10); PORTA |= LED_RED; PORTA &= ~LED_GREEN; sleep(10); PORTA |= LED_GREEN; PORTA &= ~LED_RED; sleep(10); PORTA &= ~(LED_RED | LED_GREEN); } } void delay(uint16_t ms) { while(ms) { _delay_ms(1); // this function must be called with a compile-time CONST, otherwise it pulls in float-math (huge) ms--; } } // Puts MCU to sleep for specified number of seconds using // WDT to wake every second and track number of seconds void sleep(uint8_t s) { sleep_interval = 0; while (sleep_interval < s) { wdt_reset(); set_sleep_mode(SLEEP_MODE_PWR_DOWN); sleep_mode(); } } // Enable watchdog interrupt, set prescaling to 1 sec void init_wdt() { // Disable interrupts cli(); // Start timed sequence // Set Watchdog Change Enable bit _WD_CONTROL_REG |= (1<<WDCE); // Set new prescaler (1 sec), unset reset enable // enable WDT interrupt _WD_CONTROL_REG = (1<<WDIE)|(1<<WDP2)|(1<<WDP0); sei(); } // Slow clock to 150kHz, assumes 9.6MHz internal osc with clkdiv disabled void slow_clock() { // 150kHz CLKPR = (1<<CLKPCE); CLKPR = (1<<CLKPS2)|(1<<CLKPS1); // scale = /64 } ISR(WATCHDOG_vect) { sleep_interval++; wdt_reset(); // Re-enable WDT interrupt. Normally we wouldn't do that here, // But we're using this routine purely as a timeout; // WDT is never used for reset _WD_CONTROL_REG |= (1<<WDIE); return; }