Stránka 1 z 1

attiny, prebúdzanie z "power down" watchdogom

Napsal: 20 dub 2011, 11:11
od iginoiii
zdravím, zas sa našiel nejaký voľný čas k programovaniu attiny, tak otravujem :). K aplikácii riadeniu čerpadla potrebujem, aby sa procesor vypol na 15 minút každú polhodinu(kvôly zníženému odberu). Dopracoval som sa zatiaľ k niečomu nasledovnému.

Od kódu som očakával, že na úvod a=0 vypne procesor, po dvoch sekundách ho prebudí watchdog, inkrementuje a=1, a viac už procesor nevypne. Ale poďla behu programu predpokladám, že po watchdog resete sa mi premenna 'a' vždy vynuluje, takže podmienka je splnená vždy, a po každom prebudení procesor opäť zaspí. Nasvedčuje tomu meranie spotreby procesoru. Takže by som chcel požiadať o nasmerovanie. Či riešiť ukladanie premennej 'a' do eeprom, alebo je nejaké elegantnejšie riešenie, resp. som vec úplne zle pochopil.

ps: pre úplnosť, o čo mi vo finále ide: potrebujem, aby procesor spal približne 15 minút, a chcel som to riešiť tak, že pri prebúdzaní každé dve sekundy napočítať 450 watchdog resetov. vďaka, i

Kód: Vybrat vše

#define F_CPU 1E6 // 1 MHZ rychlost uPC

 #include <avr/io.h>
 #include <avr/sleep.h>
 #include <avr/wdt.h>
 #include <avr/delay.h>
 #include <avr/interrupt.h>
 
int a;

/*tato cast neviem presne, ako funguje, len som si ju odniekial vypozical*/
 void reset_wdt(void) \         
    __attribute__((naked)) \
    __attribute__((section(".init3")));
  void reset_wdt(void)
  { MCUSR = 0;
     wdt_disable();
 sleep_disable();
  _delay_ms (1000);
a=a+1; }

 void init_sleep(void)
 { set_sleep_mode(SLEEP_MODE_PWR_DOWN);
        wdt_enable(WDTO_2S);
      sleep_enable();
      sleep_mode();  }

 int main(void)
  {
 if(a==0)
 {init_sleep();
 sleep_disable();}
 else
 {_delay_ms (1000);}
 
  return 0;
  }

Napsal: 20 dub 2011, 11:38
od Andrea
Víš, co se stane, když se ukončí main?

Napsal: 20 dub 2011, 12:04
od hakamusai
Andrea píše:Víš, co se stane, když se ukončí main?


Mě by to zajímalo.
Setkal jsem se se situací,kdy bylo potřeba nastavit výstupy MCU do určitýho stavu a zůstal tak.Zůstane ten MCU ve stavu když opustí hlavní smyčku main ?

Napsal: 20 dub 2011, 12:13
od Andrea
Já to nevím, v C neprogramuju, ale co jsem viděla pár programů v C pro jednočipy bez OS, tak se main nikdy neukončoval. Vždy to běželo v nekonečné smyčce, což mi přijde logické, main nemá nic nad sebou, do čeho by se mohl vrátit.

Napsal: 20 dub 2011, 12:18
od iginoiii
ja som blbec, však to nemám v žiadnom for cykle, ktorý by bežal vkuse dokola a kontroloval premennú a.... ale mám pocit, že som to skúšal všeliako, škoda že to nemôžem hneď vyskúšať. Táto verzia už je zdatne zúfalá, po vyskúšaní všetkého možného...

plus to return 0 netuším čo spraví. vráti 0, ale v tomto prípade asi nemá kam :)

Napsal: 20 dub 2011, 12:27
od Andrea
To nejasné ukončení mainu samozřejmě není jediný problém. Reset znamená reinicializaci proměnných a tudíž ztrátu stavu. Musel by se udělat zásah do inicializace před mainem a v případě resetu od WDT si to zařídit po svém. Možná by bylo lepší použít přerušení od WDT, místo resetu.

Napsal: 20 dub 2011, 12:51
od iginoiii
prerušenie od wdt použiť nemôžem, pretože ako čítam datasheet attiny26, tak tá toto prerušenie nemá(viem, že som tieto veci mal uviesť hneď na úvod, ale musím sa priznať, že som ani netušil o uvedených rozdieloch)..

takže keď to zhrniem, keďže externý signál nemám aký použiť, a na

Musel by se udělat zásah do inicializace před mainem a v případě resetu od WDT si to zařídit po svém.
si určite neverím, lebo by som musel vidieť príklad, podľa ktorého postupovať. Tak výsledne riešenie bude asi najjednoduchšie idle mód a prebúdzanie timerom.

Napsal: 20 dub 2011, 12:59
od Andrea
Ta část programu, co nevíš, jak funguje, je nejspíš zásah do té inicializace před mainem, ale asi je to část, co se vykoná ještě před inicializací proměnných, takže to a++ se neprojeví.

Napsal: 20 dub 2011, 13:19
od iginoiii
vďaka za diskusiu, ušetrilo mi to kopec času, čo by som ďalších 5 hodín ťukal rôzne hlúposti a očakával niečo, čo už hneď od úvodu nejde tak ako by som chcel(a vedel), i

Napsal: 20 dub 2011, 17:39
od AB1
Takto deklarujeme proměnnou "temp", která se nemá změnit při resetu od wdt:

Kód: Vybrat vše

unsigned char temp  __attribute__((section(".noinit")));

Napsal: 20 dub 2011, 20:38
od p32
Pokud chceš řídit čerpadlo a přitom vypnout procesor na 15 minut, tak to udělej po selsku.
Dej tam někde na výstup klopný obvod, který po "příkazu k aktivaci" prostě vypne procesor a za 15 minut zase nastartuje procesor a je to :lol:

Napsal: 20 dub 2011, 22:52
od iginoiii
p32: podobné riešenie ma samozrejme napadlo, ale mám už hotovú DPS, a som lenivý robiť novú :)

AB1: skrátim to: :love:, vďaka moc