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