attiny, prebúdzanie z "power down" watchdogom

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
iginoiii
Příspěvky: 364
Registrován: 01 črc 2010, 00:00
Bydliště: Bratislava

attiny, prebúdzanie z "power down" watchdogom

#1 Příspěvek 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;
  }
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#2 Příspěvek od Andrea »

Víš, co se stane, když se ukončí main?
hakamusai
Příspěvky: 939
Registrován: 17 dub 2007, 00:00

#3 Příspěvek 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 ?
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#4 Příspěvek 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.
Uživatelský avatar
iginoiii
Příspěvky: 364
Registrován: 01 črc 2010, 00:00
Bydliště: Bratislava

#5 Příspěvek 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 :)
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#6 Příspěvek 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.
Uživatelský avatar
iginoiii
Příspěvky: 364
Registrován: 01 črc 2010, 00:00
Bydliště: Bratislava

#7 Příspěvek 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.
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#8 Příspěvek 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í.
Uživatelský avatar
iginoiii
Příspěvky: 364
Registrován: 01 črc 2010, 00:00
Bydliště: Bratislava

#9 Příspěvek 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
Uživatelský avatar
AB1
Příspěvky: 312
Registrován: 23 lis 2009, 00:00

#10 Příspěvek 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")));
p32
Příspěvky: 16427
Registrován: 13 led 2007, 00:00

#11 Příspěvek 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:
Uživatelský avatar
iginoiii
Příspěvky: 364
Registrován: 01 črc 2010, 00:00
Bydliště: Bratislava

#12 Příspěvek 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
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“