ATtiny25: změna frekvence oscilátoru za běhu programu

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

A neodporuješ si tak nějak trochu ?

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í :

[code]
.
.
.

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;
}
}[/code]

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.

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
sites.google.com/site/dannychou … /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

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.

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

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.

Ř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.

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

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

#define F_CPU 8000 ... ... while(1) { PORTB = 255; _delay_ms(1000); PORTB = 0; _delay_ms(1000); }

Dík,
to bych rád, ale můžu “zpracovat” pouze hotový HEX nebo zkompilovat ino v IDE Arduina.
mpcz, 14.oct.2017

Tak nevím, ale jestli neumíš napsat ani program pro blikání ledky, (což bývá první program začátečníků) tak by asi bylo dobré si něco přečíst, třeba aspoň

svetelektro.com/clanky/kniha-pr … c-557.html

Edit:
nebo
arduino.cz/programujeme-arduino/

Program napsaný v C můžeš zkompilovat v Arduinu, když mu přejmenuješ koncovku na .ino

Ak potrebuješ iba reagovať na stlačnenie tlačítka a na základe toho niečo spraviť a potom “uspať”, riešenie je velice že jednoduché.

V napájaní použi zapojenie odvodené od zapojenia dvojtlačítka. To znamená, že tlačítko privedie napájanie na mcu. MCU hneď po nábehu zopne FET paralelne zapojený k tlačítku (to sú rádovo desiatky mikrosekúnd). Nech mcu spraví čo má a napájací FET nech si následne vypne.
Nižšie so spotrebou už ťažko pôjdeš. Ak by si sa bál spotreby pri príliš dlhom stlačení tlačítka, kľudne to tlačítko môže pripnúť napájanie na mcu cez kondenzátor. Tým si zabezpečíš, že trvale stlačené tlačítko nebude trvalo napájať mcu.

Rozhodovacia úroveň času pre tlačítko (odozva na stlačenie) by nemala presiahnuť 20ms. Pri dlhšom reakčnom čase už má obsluha pocit, že tlačítko “blbne”. Preto je zbytočné skenovať tlačítko 1x za 100us, úplne kľudne stačí 1x za 5ms. Už len na tom znížiš priemerný aktívny prúd 50x.

to AB: je to ta 3. možnost, už jsem to tu psal několikrát. Neumím C a učit se ho nebudu z mnoha důvodů.
Umím jakž takž napsat ino v řeči Arduina, zkompilovat v IDE do HEX a poslat skrze DUDE do Tiny. Zdá se však, že tento kompilát není úplně v pořádku a dělá problémy. Zatím jsem se dostal do stavu, že TINA běží na 8kHz, což je dobrý začátek. Teď provedu metodu “sekáčku” a budu se pokoušet v TINY odpínat vše nepotřebné. Uvidíme, kam se dostanu.
mpcz, 15.oct.2017

Zdravím,
mám trošku problém s děličkou osmi v TINY85. Jak to čtu, možná blbě, dá se zapnout po startu programu SW , to funguje OK. Podle pomůcek pro nastavování pojistek je ale možné děličku nastvavit přímo pojistkami, což by mi pasovalo lépe.
Je možné pojistkami nastavit clock i děličku jednorázově při programování - jednou pro vždy? Funguje to někomu?
Děkuji, mpcz, 15.oct.2017

Pojistka CKDIV8 říká, jestli po startu budeš mít hodiny dělené 8 nebo ne. Nastavit děličku na jakoukoliv jinou hodnotu lze pouze softwarově. Jinak samozřejmě, co nastavíš v pojistkách při naprogramování tam zůstává stejně jako nasypaný program.

Děkuji, no právě. Kde je tedy chybka?:
C:\avrdude-5.8>avrdude -B250 -c usbasp -p t85 -U lfuse:w:0x04:m -U hfuse:w:0xdf:m -U efuse:w:0xff:m …
Toto je dle oficiální kalkulačky AVR a zdá se mi, že k dělení osmi po uploadu nedochází. Pokud přidám do programu SW dělení, tak ano.
mpcz, 16.oct.2017

Zdravím,
tak problém vyřešen. Zdá se, že jak se do toho procesu zapojí kompilace v Arduino IDE, jsou problémy.
Je tu tedy otázka: je vůbec možné přepnout pojistky při uploadu a používat hex vytvořený v Arduino IDE? Mám pocit, že to stejné napsané v C++ a v Arduinu je v HEXu dost odlišné a hlavně jsou tam přidané věci, které vadí. Snažím se vyhnout učení C++, na jsem již starý a také se to pro těch pár případů neoplatí.
Děkuji, mpcz, 17.oct.2017

Ano, jedině pomocí programátoru jde změnit pojistky.
Kromě pojistky CKDIV8. Ta se dá změnit i v programu přes CLKPR.

Myslím, že ten příkaz pro Avrdude máš dobře.
Můžeš potom ještě dalším příkazem pojistky přečíst, abys viděl jestli se změnily.

Jistě, pokud chci použít ISP programátor např. USBASP tak použiju hex z Arduina.

Porovnávat hex soubory nemá žádný význam.
Tentýž program, napsaný v různých jazycích, nebo zkompilovaný různými překladači vytvoří rozdílné hex soubory.

Zdravím, dík za odpověď. No ne že bych chtěl porovnávat HEXy, i mě je jasné, že každý bude jiný. Podstatné pro výsledek je, že stejný program (třeba jen prázdný nebo blikající ledka), zkompilovaný systémem:

  1. psáno v ARDUINU, kompilace v IDE 1.8.5 hex vypálený AVRdude 5.8 a odesláno do tiny USBASP
  2. to stejné psáno C++, kompilováno v ATMELstudio 7
    má rozdíl spotřeby 20-ti násobný.
    Osciloskop na noze 3 potvrzuje odpovídající snížení frekvence. To zpočátku trošku mátlo, vypadalo to, že frekvence se nesnížila, ale oscilokop to vyvrátil.
    Je docela možné, že dělám při kompilaci v Arduinu dělám nějakou chybu, zatím jsem na ni nepřišel. Horší by bylo, kdyby to z principu nešlo v Arduinu programovat.
    mpcz, 18.oct.2017

No ja si myslím, že pre programovanie takého AVR-ka práve C++ nepotrebuješ, tam ti stačí úplne C-ko. A ak sa s procesorom zahráš čo i len 5 krát do roka, myslím, že nie je na škodu sa to C-ko naučiť.

Nepoznám tvoj vek, ale aj tak si myslím, že naučiť sa niečo nie je nikdy na škodu, a pri hraní sa s elektronikou a hlavne s procesormi už vôbec nie, a na druhej strane to C-ko časom môžeš využiť aj pri komunikácií procesora s PC, kde si napíšeš nejaký jednoduchý program na komunikáciu či ovládanie - tam jazyk Arduina nevyužiješ.

A nie je to vôbec ťažké a pre procesor viac prijateľnejšie :slight_smile:.