Spotreba ATtiny v pwr-down mode

Lubos Medovarsky lubos.medovarsky@accelera-networks.com
Středa Srpen 5 14:43:28 CEST 2009


Zdravim,

ak som spravne pochopil, ze sam WDT funguje ako casovac tak si myslim,
ze by bolo jednoduchsie urobit to cele so zabudovanym casovacom,
CLK z (interneho) RC oscilatora, vstup cez INT a o minimalne zvyseny
power mod tak, aby zahrnal fungovanie timera - aj tak sa tomu neda
vyhnut a interne obvody sa mi zdaju byt uspornejsie, ale neberte
ma za slovo, ked to nemam z dokumentacie, ale len z hlavy.

Mozno by nebolo odveci prejst init, ci su vsetky nepouzivane periferie
softverovo vypnute (ADC!) a IO v hiZ.


Lubos

Rosko, Peter wrote:
> zdravim,
> 
> mam problem s jednou minimalistickou aplikaciou, attiny13v, jedna LED+R
> a jedno tlacidlo. cele to je vlastne watchdog s blikajucou LED ako
> vystupom. 
> chcem to napajat z baterie, preto sa samozrejme snazim o minimalizovanie
> spotreby. zapinam PWR-down mode a pri napajani cca 3V mam spotrebu nieco
> cez 1mA. meriam to na 30 Ohm odpore v napajani.
> detaily: kontaktne pole, Attiny13V (s attiny13 to iste), nadrotovany
> konektor na ISP, jeden 100n kondik, ledka obycajna na PB0, tlacidlo na
> PB1 voci zemi. cele to funguje ako ma. ako hodiny mam wdt oscilator,
> pokial cas neexpiroval tak sa MCU zobudza kazde 2 sec. fuse su
> vsetky(okrem SPIEN) povypinane
> 
> preco do haja to zerie tolko?    
> 
> podla asm vypisu je vsetko spravne..., tuna je program 
> 
> #include <inttypes.h>
> #include <avr/io.h>
> #include <avr/interrupt.h>
> #include <avr/sleep.h>
> #include <avr/wdt.h>
> 
> volatile uint16_t timer;
> volatile uint8_t timecntr;
> 
> int main(void)
> {
> 	MCUSR = 0;
> 
> 	GIMSK = _BV(PCIE);
> 	PCMSK = _BV(PCINT1);
> 
> 	DDRB = _BV(PB0); //outputs
> 	PORTB = 0xff; //pull up for inputs
>  	
> 	timer = 0;
> 
> 	sei();
> 	
> 	for (;;)
> 	{
> 		if (timer == 0)
> 		{
> 			uint16_t i;
> 
> 			PORTB |= _BV(PB0); //single blink after
> start/button press
> 
> 			for (i = 0; i < 2000; i++ );
> 		}
> 		if (timer >= 100) 
> 		{
> 			//wdt_reset(); //faster period for blinking
> 			WDTCR |= _BV(WDCE);
> 			WDTCR = _BV(WDTIE) | _BV(WDP2);
> 
> 			PORTB &= ~_BV(PB0);
> 
> 			timecntr++;
> 			if (timecntr == 1) PORTB |= _BV(PB0);
> 			if (timecntr == 4) PORTB |= _BV(PB0);
> 			if (timecntr > 30) timecntr = 0;
> 
> 			timer--; //against overflow
> 		}
> 		else 
> 		{
> 			PORTB &= ~_BV(PB0);
> 			//wdt_reset(); //slower period for counting
> 			WDTCR |= _BV(WDCE);
> 			WDTCR = _BV(WDTIE) | _BV(WDP2) | _BV(WDP1) |
> _BV(WDP0);
> 		}
> 			
> 		set_sleep_mode(SLEEP_MODE_PWR_DOWN); //pwrdown
> 		sleep_mode();
> 	}	
> }
> 
> ISR (WDT_vect) //every 2 sec
> {
> 	timer++;
> }
> 
> ISR (PCINT0_vect)
> {
> 	timer = 0;
> }
> 
> ISR(__vector_default)
> {
> // error in interrupt handling
> // allows return to code
> }
> 
> vdaka za nakopnutie, p.rosko
> _______________________________________________
> HW-list mailing list  -  sponsored by www.HW.cz
> Hw-list@list.hw.cz
> http://list.hw.cz/mailman/listinfo/hw-list
> 
> 



Další informace o konferenci Hw-list