forum.mcontrollers.com - hlavní stránka forum.mcontrollers.com - fórum

 

.: fórum - hlavní stránka :.
Technology Stronghold by Rudolf Vesely
How to build Microsoft System Center hosted cloud series
FAQFAQ HledatHledat Seznam uživatelůSeznam uživatelů Uživatelské skupinyUživatelské skupiny RegistraceRegistrace
ProfilProfil StatistikaStatistika Soukromé zprávySoukromé zprávy PřihlášeníPřihlášení

 
ATtiny25: změna frekvence oscilátoru za běhu programu
Jdi na stránku Předchozí  1, 2, 3  Další
 
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> AVR
 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 730

PříspěvekZaslal: 02 srpen 2016, 7:18    Předmět: Citovat

No vidíš, tak až teprve teďka jsi pořádně popsal, co má ta ATtina přesně dělat. Jinak použití časovače mě taky napadlo. Buď 2x 555 nebo 556 (což jsou 2 555-ky v jednom pouzdru). Jen ta 555-ka se neumí "vypnout" jako ATtina a má odběr trvalý. A s tou výukou Cčka (Arduino NENÍ C++) - pokud používáš k programování prostředí Arduina, pak Cčko používáš, tudíž šlo jenom o to nebýt líný a podívat se do datasheetu ATtiny (co tam konkrétně máš hledat jsem Ti psal). Práce pro začátečníka cca na 2 hodiny a když tady ukážeš snahu, tak není problém poradit a pomoct.

V každým případě Ti přeju hodně úspěchů a nenech se odradit. A hlavně - nespoléhej jenom na to, že na všechno, co potřebuješ najdeš na Internetu knihovny. Postupně začni pracovat také na vlastních řešeních. Věř mi že Ti to dá více a ve finále Ti to zabere daleko méně času, než strávit dlouhé dny hledáním něčeho, co můžeš mít za pár hodin napsané sám. Datasheetům se nevyhneš. Kontrolery programuju už dlouho, ale datasheety k mcu (a nejenom k nim) používám stále. Ne kvůli instrukční sadě. Tu v Cčku nepotřebuješ v podstatě vůbec (i když je dobré vědět, jaké má procesor možnosti a tudíž máš daleko větší šanci napsat program efektivně), ale právě kvůli tomu, abys věděl co nasypat do registrů, když to má dělat, co chceš/potřebuješ. Není důležité si pamatovat, co do kterého registru zapsat. Důležité je vědět, že to jde a kde najdeš, jak to udělat (datasheet). A samozřejmě potřebuješ datasheety k zařízením, které k mcu budeš připojovat (čidla, displeje, převodníky atd.), protože nikdo si nemůže pamatovat všechno. Je důležité vědět, kde se to dá najít. A v tomhle případě to jsou právě datasheety.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
mpcz
Nováček
Nováček


Založen: 3.10.2017
Příspěvky: 9

PříspěvekZaslal: 03 říjen 2017, 7:15    Předmět: Citovat

Zdravím,
po čase se vracím k tomuto tématu. Nároky vzrostly a je nutné použít MP.
Požadavek na spotřebu zůstává, max. 300 microA, raději co nejméně, po zapnutí delay cca 10 sec, pak impuls cca 1 sec na digivýstupu. Požadavky na přesnost minimální. Krásně to šlo na udělat na PIC i bez krystalu, (známý dodal PIC komplet hotový), ale Atmel jsem nezvládl, stále to leze v řádech mA.
Rád bych zůstal u ATTINY85, Arduino IDE, (nyní 1.8.5) a programátoru:
http://www.ispshop.cz/index.php?main_page=advanced_search_result&search_in_description=1&keyword=attiny44
nebráním se ničemu jinému, pokud tato kombinace bude technicky nevyhovující.
Problém působí přepnutí ATTINY85 na 128kHz nebo i méně. ( Z důvodu očekávané menší spotřeby). Pokud se to podaří, (což neumím ověřit), nefunguje delay(), vypadá to, jako by se program na tomto příkazu zasekl a nejde dál. Kompilace a upload probíhá OK. Prodloužení času při dalay() oproti standardnímu CLK jsem si vědom. Mód uspání nelze použít.
Jen pro úplnost podotýkám, že programování není mým hlavním zájmem, ani očekávanou předností, tento miniprojekt je pouze nutným malým doplňkem k něčemu jinému.
Děkuji za případnou radu.
mpcz, 03.oct.2017
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
MilanL
Anonymní





PříspěvekZaslal: 03 říjen 2017, 11:08    Předmět: Citovat

Ahoj,
proč by jako nešlo uspání, pokud to uděláš podle instrukcí Balů, není problém dát za sebe tu 4-5s čekačku ve sleep modu X krát - prostě jen zopakuješ body 2-5, u toho čítače si dokonce můžeš ty časy nastavit celkem přesně klidně třeba 2x 4s + 1x 2s = 10s (nebo 8s + 2s).
Návrat nahoru
 

 
mpcz
Nováček
Nováček


Založen: 3.10.2017
Příspěvky: 9

PříspěvekZaslal: 03 říjen 2017, 15:20    Předmět: Citovat

Děkuji za reakci. V prvé řadě musím začít přepnutím ATMELu HNED po startu do low power módu. To umí jen některé, jak jsem zjistil. Max. odběr nesmí NIKDY překročit cca 300 mikroA. U PICu jsem to dotáhl na 20 mikroA, vše funguje OK.
To se mi u TINY85 nějak nedaří. Zatím jsem na 2-3 mA. Pomohl by osvědčený postup nebo alespoň info, že to vůbec někomu šlo. Vzhledem k mým chabým zkušenostem by bylo ideální .ino, které tím mým programátorem zkompiluji v 1.8.5 s podporou TINY a pošlu do MPU, ten mám zatím na zkušební destičce.
Děkuji za případné info.
mpcz, 03.oct.2017
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 730

PříspěvekZaslal: 04 říjen 2017, 1:20    Předmět: Citovat

Vidím, že jsi se ani za rok příliš s datasheetem nezabýval... No nic - hodím Ti sem kód z AVR Studia. Uino si kvůli Tobě opravdu instalovat nebudu, do uina si to přepiš sám. Předpokládám, že CTRL-Cizí -> CTRL-Vlastní umíš a přežvýkat to tak, aby to uino zkouslo zvládneš. Druhá možnost je nainstalovat si AVR Studio, zkompilovat to v něm a uino použít jenom jako programátor. Kód je odzkoušený pouze v simulátoru AVR Studia, ale šlapat by měl tak, jak jsi psal : Po zapnutí 10s pauza, pak 1s impulz a po něm Power-down sleep až do nového zapnutí. Výstup je na pinu B0 a pull-up nebo pull-down si u něj musíš ošetřit externím odporem. U ostatních jsou aktivované pull-upy - proč to tak je se dočteš v datasheetu. A abys neřek, tak jsem přiložil i zkompilovaný HEX. Můžeš to porovnat s těma "obecnýma" bodama, které jsem Ti psal v předchozích příspěvcích.

kód:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/sleep.h>

ISR(TIM0_COMPA_vect, ISR_NAKED)
{
    reti();
}


int main()
{
// Prepnuti vystupu do neaktivniho rezimu
    PORTB = 0xFE;
    DDRB = 0;

// Prepnuti systemovych hodin na 31,25 kHz
    CLKPR = (1<<CLKPCE);
    CLKPR = (1<<CLKPS3);

// Nastaveni casovace na 5 sekund
    OCR0A = 152;
    TIMSK = (1<<OCIE0A);

// Povolit preruseni
    sei();

// Spustit casovac
    TCCR0A = (1<<WGM01);
    TCCR0B = (1<<CS02)|(1<<CS00);

// Aktivovat IDLE SLEEP MODE
    set_sleep_mode(SLEEP_MODE_IDLE);
    sleep_mode();   // 5 sekund poprve
    sleep_mode();   // 5 sekund podruhe

// Nastaveni casovace na 1 sekundu
    OCR0A = 30;

// Aktivovat vystup na B0
    PORTB |= 0x01;
    DDRB |= 0x01;

// Aktivovat IDLE SLEEP MODE
    sleep_mode();   // 1 sekunda

// Deaktivovat vystupy
    PORTB &= ~0x01;
    DDRB &= ~0x01;

// Zastavit casovac
    TCCR0B = (0<<CS02)|(1<<CS00);
    TCCR0A = (0<<WGM01);

// Zakazat preruseni
    cli();

// Aktivovat POWERDOWN SLEEP MODE
    set_sleep_mode(SLEEP_MODE_PWR_DOWN);
    while (1)
    {
        sleep_mode();   // Sleep az do vypnuti
    }
}


Kompilováno v AVR Studio 4.19 + WinAVR.



mpcz.hex
 Komentář:
Přeložený soubor k nasypání do MCU.

Stáhnout
 Soubor:  mpcz.hex
 Velikost:  500 Bajtů
 Staženo:  17 krát

Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
AB
Profesionál
Profesionál


Založen: 24.2.2010
Příspěvky: 419

PříspěvekZaslal: 04 říjen 2017, 7:06    Předmět: Citovat

Tady je pěkně popsaný postup při snižování odběru:
https://sites.google.com/site/dannychouinard/Home/atmel-avr-stuff/low-power
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
mpcz
Nováček
Nováček


Založen: 3.10.2017
Příspěvky: 9

PříspěvekZaslal: 14 říjen 2017, 10:33    Předmět: Citovat

Zdravím,
to Balů, AB: nějak jsem odpovědi přehléhl, děkuji za detailní popis postupu, určitě zabral kus času a práce.
Část z toho určitě použiji, jen jsem asi málo zdůraznil, že sleep mode nechci / nelze použít, v plánu jsou i další činnosti. Postupem času, po odladění zkusím přejít na "menší a levnější " TINU. Teď nechci bojovat s prostorem.
- Lze snížit frekvenci na minimum, přesnost není postatná.
- Lze povypínat vše nepotřebné, zůstat musí DIGI IN a DIGI OUT.
- Po přepnutí frekvence musí jít TINA znovu programovat, při nějakých pokusech mi pár kusů umřelo a již nejdou naprogramovat, netuším proč, ale zničené dle mého nejsou. (Je nějaký zaručený oživovací proces?).
Stabilizátor 3,3V jsem dostal od kolegů z Číny, je to malý prcek, odebírá 2 microA do země z 12V i při napájení TINY85, takže to slabé místo nebude. Na PICU jsem se dostal poměrně rychle na 15 microA při chodu, všechno funguje, snad se to podaří i na ATMELU osekání žravých modulů.
Ten ATMEL je pro pololaiky velmi dobrý pro možnost programování v ARDUINO IDE, to chci zachovat. HEX exportovaný z IDE už uploadovat není tak velký problém - mám odzkoušený USBASP.
mpcz, 14.oct.2017
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 730

PříspěvekZaslal: 14 říjen 2017, 11:31    Předmět: Citovat

A neodporuješ si tak nějak trochu ?

mpcz napsal:
Zdravím,
potřebuji snížit odběr jednoduchého zapojení ATTINY85 na minimum.
Jaké jsou možnosti snížení SW-rem, používám programování skrze USB a Arduino 1.6.10, kdyby nebylo zbytí, zkusím i něco jiného.
Tiny po zapnutí udělá impuls 1 sec na výstupu a pak se natrvalo uspí do dalšího vypnutí a zapnutí napájení, čili nic složitého.
Jaký je minimální dosažitelný odběr? Pasovalo by mi tak okolo 100 microampér.
Děkuji.
mpcz, 31.07.2016



Pokud potřebuješ co nejnižší spotřebu a k tomu ještě i něco dělat, pak se bez sleep módu neobejdeš. Samozřejmě nelze použít PowerDown, ale musíš použít Idle, aby zůstaly v provozu časovače a pomocí přerušení od časovače, případně od jiných přerušení (nemusí jít jenom o časovač), provádět cyklicky činnost, kterou potřebuješ. Použití delay je cesta do pekel. Sleep mód používám ve všech svých programech, ale při delších operacích (například stiskem tlačítka nahodit hranu, počkat 10ms, shodit) je třeba použít flagy pro jednotlivé části operace.

Například :

Procesor je ve sleep módu a timer ho budí každých 100us.
1. krok - kontrola tlačítka
2. krok - nahodím hranu a nastavím CountDownPuls na 100.
3. krok - Po aktivaci FlagPuls hranu shodím.

Čítač každých 100us udělá následující :
Zkontrolovat, jestli je CountDownPuls > 0
Pokud ano, odečíst 1 od CountDownPuls a pokud jsem právě dočítal na 0, nastavit FlagPuls na TRUE.

Provedení :
kód:

.
.
.

Interrupt Timer/Counter
{
  if (CountDownPuls > 0)
  {
    if (--CountDownPuls == 0) FlagPuls = TRUE;
  }
}

.
.
.
.



main
{
  InicializaceProcesoru;
  NastaveniTimeru;
  .
  .
  .
  set_sleep_mode(SLEEP_MODE_IDLE);
  .
  .
  .
  while(1)
  {
    sleep_mode();
    if ((Tlacitko == AKTIVNI) && (TlacitkoMinule == NEAKTIVNI))
    {
      Vystup = TRUE;
      CountDownPuls = 100;
    }
    if (FlagPuls = TRUE)
    {
      FlagPuls = FALSE;
      Vystup = FALSE;
    }
    TlacitkoMinule = Tlacitko;
  }
}


Když to navíc zkombinuješ s informacema z odkazu, co psal AB výše. Zapomeň na delay, během delay je procesor trvale v plně aktivním režimu.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
mpcz
Nováček
Nováček


Založen: 3.10.2017
Příspěvky: 9

PříspěvekZaslal: 14 říjen 2017, 14:33    Předmět: Citovat

Zdravím,
děkuji za odpověď, cením si její obšírnosti.
Zkusil jsem nahrát vytvořený HEX od kolegy Balů do TINY85, verze sleep, vše proběhlo OK, až na:
TINA85 odebírá 50 microA, což je více, než PIC v "plném" provozu. Zde je asi nějaká chybka, klidně i u mě. Podle odkazu výše by se měla TINA dostat až na cca 7,2 microA (v chodu), pokud jsem to pochopil správně. Ten postup na sražení spotřeby verze 7,2 microA z odkazu
https://sites.google.com/site/dannychouinard/Home/atmel-avr-stuff/low-power
jsem použil, spotřeba byla ovšem okolo 200 microA.
Upload skrzevá AVRdude 5.8 proběhl OK, opakovaný upload se však již nedařil, TINA byla mrtvá. To se naštěstí vyřešilo HV resetem. Možná někdo umí nastavit AVRdude tak, aby uploadoval i do TINY s mini frekvencí, já jsem to nikde nenašel.
mpcz, 14.oct.2017
p.s. možná si v něčem odporuji, (i když si toho vědom nejsem), to bude asi tím delším časovým úsekem, kdy se na spoustu nových vlivů okolí ještě přijde
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 730

PříspěvekZaslal: 14 říjen 2017, 15:08    Předmět: Citovat

Pokud se procesor přepíná na nízkou rychlost hned na začátku, je potřeba před zapnutím aktivovat reset a držet ho aktivní po celou dobu. Jinak se procesor stihne přepnout do nízkého kmitočtu a jestli se nepletu, tak ani reset samotný ho nepřepne do startup hodin. Proto Ti po spuštění programu nejde naprogramovat.

S tím, že si odporuješ je to tak, že 31.7.2016 jsi psal, že Tina udělá 1s impulz a pak se uspí až do dalšího zapnutí (proto PowerDown sleep) a 14.10.2017, že máš v plánu další činnosti (proto jenom Idle sleep).

Co se odběru týká, to by chtělo schéma. Nemáš náhodou nepoužité piny natvrdo připojené na GND ? To by pak odpovídalo, že po aktivaci pull-upů teče přes tyhle nepoužité piny těch 50 mikroampér.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
mpcz
Nováček
Nováček


Založen: 3.10.2017
Příspěvky: 9

PříspěvekZaslal: 14 říjen 2017, 15:32    Předmět: Citovat

Dík, aha, tušil jsem to, vysvětlení jsem již dal, mezitím (víc jak rok) se přišlo na další okolnosti, které mají na funkci vliv a je nutno je korigovat.
A dále, jakmile je problém popsán příliš zeširoka, má mnoho proměnných a diskuze se rozmělní do ztracena.
Proto by asi bylo nejlepší popsat problém takto:
ATTINY85 po zapnutí nedělá nic, jen běží v prázdé smyčce. Všechny nohy visí ve vzduchu. Připojeny jen nohy + a zem a kondíček M1. Frekvence nehraje roli, přesnost nehraje roli. Spotřeba nejlépe do 10 microA (údajně to lze), viz odkaz výše.
Ideální by byl hotový xxxx.hex, upload a měřit. Dá se tak nejlépe vyhnout vlastním chybám nebo špatnému pochopení doporučeného postupu.
To umrtvení je sice nepříjemné, ale HV programátor to řeší. Je to jen zdržení navíc, které vadí pouze při odlaďování.
Držení resetu na zemi nepomáhá. Naprogramovat to nejde.
Děkuji, mpcz, 14.10.2017
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
Balů
Profesionál
Profesionál


Založen: 29.10.2012
Příspěvky: 730

PříspěvekZaslal: 14 říjen 2017, 15:53    Předmět: Citovat

S tím Ti nepomohu, protože žádnou ATtiny nemám k dispozici. Zkus vyjít z toho, co jsem Ti posílal, vynech prozatím přepnutí na 31,25 kHz (aby to šlo přeprogramovávat) a vynech přepnutí sleep režimu na PowerDown (nech tam Idle, ať Ti mcu běží jakoby pracoval). Projdi si odkaz od AB ruku v ruce s datasheetem (abys viděl, co z zoho umí nebo neumí ATtiny85 nebo jestli třeba neumí ještě něco navíc), vyzkoušej si jednotlivé kroky a měř přitom spotřebu. Sice trochu nechápu, proč je tak důležtý každý mikroampér, když kondík udrží i LEDku s několika miliampérama kolem 10 sekund, ale budiž. Držím palce, ať se dobereš k touženému výsledku.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
AB
Profesionál
Profesionál


Založen: 24.2.2010
Příspěvky: 419

PříspěvekZaslal: 14 říjen 2017, 16:53    Předmět: Citovat

citace:
vynech prozatím přepnutí na 31,25 kHz (aby to šlo přeprogramovávat)

Řešil jsem to tak, že před přepnutím do extra nízké frekvence jsem dal pauzu např 2 vteřiny. Programování pak proběhne při základní frekvenci.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
mpcz
Nováček
Nováček


Založen: 3.10.2017
Příspěvky: 9

PříspěvekZaslal: 14 říjen 2017, 17:06    Předmět: Citovat

Zdravím,
to vypadá slibně. Pomůže to hlavně při odlaďování.
Ten zásadní problém ale stále mám - nedaří se snížit spotřebu. Není alespoň nějaký kontrolní prográmek, který potvrdí pracovní frekvenci, ať mám jistotu, že to běží opravdu na 16 nebo 8 kHz?
Děkuji, mpcz, 14.oct.2017
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

 
AB
Profesionál
Profesionál


Založen: 24.2.2010
Příspěvky: 419

PříspěvekZaslal: 14 říjen 2017, 17:16    Předmět: Citovat

citace:
Není alespoň nějaký kontrolní prográmek, který potvrdí pracovní frekvenci, ať mám jistotu, že to běží opravdu na 16 nebo 8 kHz?


Jistěže je.
Na portB dej ledku.
Jestli vteřinu svítí a vteřinu ne, tak kmitočet je 8 kHz.

kód:
#define F_CPU 8000
...
...
while(1)
{
   PORTB = 255;
   _delay_ms(1000);
   PORTB = 0;
   _delay_ms(1000);
}
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
 

Zobrazit příspěvky z předchozích:   
Zobrazit předchozí téma :: Zobrazit následující téma  
Přidat nové téma   Zaslat odpověď    Obsah fóra mcontrollers.com -> AVR Časy uváděny v GMT + 2 hodiny
Jdi na stránku Předchozí  1, 2, 3  Další
 
Strana 2 z 3
Přejdi na:  
Můžete přidat nové téma do tohoto fóra.
Můžete odpovídat na témata v tomto fóru.
Nemůžete upravovat své příspěvky v tomto fóru.
Nemůžete mazat své příspěvky v tomto fóru.
Nemůžete hlasovat v tomto fóru.
Můžete k příspěvkům připojovat soubory
Můžete stahovat a prohlížet přiložené soubory
 



Num Lock Holder - app to hold Numlock
Copyright © 2017 Rudolf Veselý, mcontrollers.com.
Je zakázáno používat části tohoto webu bez souhlasu autora. || Powered by phpBB © 2001, 2002 phpBB Group - with RedSquare DoubleJ(Jan Jaap)