Vyber tlmivky 10uH pre odrusenie AD prevodnika

Teraz som testoval rezim POWER_DOWN a POWER_SAVE a vypada to tak, ze v POWER_SAVE zobudi CPU z TimerX len Timer2. Ked bol v rezime POWER_SAVE aktivovany len Timer0 a Timer1, tak CPU som dokazal zobudit len cez INT0, INT1. Ked som aktivoval Timer2, tak sa uz CPU standartne neuspal. Musel som doplnit do nekonecnej slucky programu podmienku, aby sa vzdy uspal, kym neodpocita postupne cas na nulu, urobi prepocet ADC, nastavi zase cas na odpocitavanie pre Timer2 a uspi sa.

Konečne mi dorazili tlmivky a podarilo sa mi poskúšať AD prevodník. Tak ako ste písal, pri zapojení CPU cez step up DC-DC neviem dosiahnuť presné napätie. Lieta mi to daleko viac ako len pár bitov. Keď som dal napájanie pre CPU zvlášť zo stabilizovaného zdroja, dostal som sa na reálnejšie napätie a kolísalo to cca 1-2 bit - musím ešte presne určiť úroveň jedného bitu (xxxV / 1000 ADC). Takže musím zvlášť napájať CPU a zvlášť LED pás. A tu by som sa chcel s Vami poradiť, ak budete mať ešte čas.

LED pás bude napájaný z batérií cez step up DC-DC poprípade zo zdroja 5V.

Napájanie CPU:
Varianta 1. - Napájať ho priamo z batérií, čo neviem, či je úplne dobrý nápad, nakoľko napätie nebude stabilné cca v rozpätí 3,3 ÷ 4V. Pri 3,3V by som chcel začať batérie dobíjať. Ďalší problém by bola frekvencia, nakoľko mám kryštál 14,7456MHz a ak som to dobre prepočítal, minimálne napätie pre túto frekvenciu by malo byť 3,5V. Ďalší problém je, že LED pás podľa datasheet očakáva minimálne napätie log 1 na úrovni 0,7 násobku napájacieho napätie, t.j. 3,5V, čo asi nedosiahnem, keď bude napätie batérii pod 3,5V.

Varianta 2. - Pridať jeden malý CPU, ktorý bude mať na starosti len AD prevody napätia batérii a jasu v miestnosti. Napájaný by mohol byť na 1,8V cez napäťový regulátor priamo z batérii (vedeli by ste mi prosím poradiť nejaký vhodný aj do kontaktného poľa?). Tento CPU by riešil:

  • každú pol hodinu sa zobudí
  • vykoná prevod oboch vstupov
  • vyhodnotí, či treba nabíjať batérie. Ak áno, dá do log 1 výstup č. 1 ak nie, dá ho do log 0
  • vyhodnotí, či treba zapnúť nočný režim. Ak áno, dá do log 1 výstup č. 2 ak nie, dá ho do log 0
  • ak sa zmenila hodnota výstupu č. 1 alebo výstupu č. 2, nastaví výstup č. 3 na log 1 po dobu cca 1 sekundu?
  • nastaví výstup č. 3 na log 0
  • uspí sa

Výstupy č. 1 až 3 by boli pripojené na vstupy č. 1 až 3 hlavného CPU. Výstupom č. 3 by sa hlavný CPU zobudil, skontroloval by vstup č. 1 a 2 a na základe ich hodnôt by zapol/vypol adaptér, alebo zapol/vypol nočný režim.

Len teraz som si uvedomil, že zase bude problém s napájaním 1,8V malého CPU, kvôli vyhodnoteniu úrovni log 1 na hlavnom CPU. Ak by som malý CPU mohol napájať priamo z batérii, tak by bolo napätie minimálne 3,3V a to by hlavný CPU mal správne vyhodnotiť log 1.

Čo som pozeral CPU, tak stačil by mi ATtiny13A. Dúfam, že z programovacieho hľadiska je rovnaký ako ATtiny13, ktorý by mi mal podporovať programátor, aby som do neho nahral program.

Ďakujem za Vaše rady.

Ahoj.

  1. Frekvence - pokud nutně potřebuješ těch 14,7456MHz, tak bys měl mít napájení 4,5-5,5V. Na 3,3-4V to chodit může, ale nemusí. Jsi mimo napětí, uvedené v datasheetu a musel bys to vyzkoušet, jestli to pojede i na těch 3,3V. Některé hodnoty v datasheetu je možné za určitých okolností a pouze pro domácí použití za orientační, protože výrobce tam bude mít určitou rezervu. Uvaž jen, jestli opravdu potřebuješ ta vysoký kmitočet. Třeba by stačil 8,192MHz.

  2. Na co cpát do takhle jednoduchý úlohy další procesor ? Použij převodník logických úrovní. S úspěchem ho už celkem dlouho používám při komunikaci mezi AVR a RaspberryPi nebo AVR a 3V periferiema.

Dakujem velmi pekne za reakciu.

  1. Ohladne urcenia frekvencii. Pravdupovediac neviem, ako urcit, aka najmensia frekvencia by mi mohla stacit. Ak by ste mi vedeli poradit, tak hlavne vypocty su tieto:

if (LEDpas_zmena) { LEDpas_zmena = 0; // Zmena efektu switch (LEDpas_efekt) { case 12 : { for (i=0; i < pocet_LED; i++) { LED_new[0]* = 255 * Jas(LEDpas_jas) * SelectLED(LEDpas_select_LED, i); LED_new[1]* = 255 * Jas(LEDpas_jas) * SelectLED(LEDpas_select_LED, i); LED_new[2]* = 255 * Jas(LEDpas_jas) * SelectLED(LEDpas_select_LED, i); LED_new[3]* = 255 * Jas(LEDpas_jas) * SelectLED(LEDpas_select_LED, i); } break; } } //Uloženie pôvodných hodnôt for (i=0; i < pocet_LED; i++) { LED_old[0]* = LED[0]*; LED_old[1]* = LED[1]*; LED_old[2]* = LED[2]*; LED_old[3]* = LED[3]*; } time = 1; while (time < dlzka_prechodu) { if (time != time_old) { for (i=0; i < pocet_LED; i++) { LED[0]* = LED_old[0]* + ( (( LED_new[0]* - LED_old[0]* ) / dlzka_prechodu) * time); LED[1]* = LED_old[1]* + ( (( LED_new[1]* - LED_old[1]* ) / dlzka_prechodu) * time); LED[2]* = LED_old[2]* + ( (( LED_new[2]* - LED_old[2]* ) / dlzka_prechodu) * time); LED[3]* = LED_old[3]* + ( (( LED_new[3]* - LED_old[3]* ) / dlzka_prechodu) * time); } // 0,x - GREEN; 1,x - RED; 2,x - BLUE; 3,x - WHITE cli(); for (i=0; i < pocet_LED; i++) { WS2812BWriteByte(LED[0]*); //green WS2812BWriteByte(LED[1]*); //red WS2812BWriteByte(LED[2]*); //blue WS2812BWriteByte(LED[3]*); //white } WS2812BWriteBit(2); //reset sei(); time_old = time; } if ((LEDpas_zmena) && (pohybovy_senzor_noc_enable)) break; if ((LEDpas_zmena) && (pohybovy_senzor_max_enable)) break; } if (LEDpas_zmena == 0) { cli(); for (i=0; i < pocet_LED; i++) { WS2812BWriteByte(LED_new[0]*); //green WS2812BWriteByte(LED_new[1]*); //red WS2812BWriteByte(LED_new[2]*); //blue WS2812BWriteByte(LED_new[3]*); //white } WS2812BWriteBit(2); //reset sei(); } }

  1. Suhlasim, rusim tuto variantu.

  2. Este mi napadla tretia varianta a ta ma suvis s tym, co ste mi tiez radil. A to je, pouzit nastavitelny step up DC-DC prevodnik a 7805-ku. Na DC-DC by som dal asi 7V (minimalne napatie podla datasheet), popripade skusil by som 6V ako ste mi radili Vy a stabilizoval to 7805. Ak by to slo a stacilo by to na odrusenie AD prevodnika, tak by som bol mozno za tuto variantu, ak teda by som nemohol ist nizsie frekvenciou. LED pas a vsetko ostatne by som napajal az po 7805 z napatia 5V. Dva step up DC-DC prevodniky (jeden 5V pre LED pas a druhy 6-7V pre CPU) by bolo asi zbytocne pouzit.

//EDIT
Este taka uvaha. Ak by som isiel dolu s napajanim CPU a frekvenciou, tak by som docielil mensiu spotrebu. Len potom neviem, ci CPU napajat priamo z baterii, kde bude napatie medzi 3,3 az 4V alebo ho napojit za step up prevodnikom a zrazit napr. s LF33CV na 3,3V? Vadi CPU kolisanie napatia? A tiez, ci je nutne pouzit externy krystal, alebo pouzit internych 8MHz, ale interny asi nie je presny.************************************

Ahoj.

Nějak jsem “vypadnul z tempa”…

  1. Frekvence procesoru je důležitá pro procesy, které musí trvat nějakou přesně danou dobu. Vše ostatní je podružné. To znamená podle datasheetu zjistit, kolik máš času na posílání jednotlivých bitů, kolik máš k dispozici času mezi bity/byty a jaké jsou tolerance těchto časů. Jinými slovy - důležité je, jak efektivně máš napsané odesílání dat do LED pásu. A opravdu se mi nechce studovat, jak efektivně sis komunikaci napsal. Doba na ostatní výpočty efektu = přípravu dat pro odeslání není až tak kritická a lze ji přizpůsobit. A ani výpočty se mi nechce procházet, abych zjišťoval, co to vlastně má dělat.

  2. Psal jsem Ti sice o použití měniče + lineárního stabilizátoru, že by tak snad šlo odrušit měnič, ale nepsal jsem, že to mám vyzkoušené. Byl to jenom nápad. Dva step-upy jsou asi zbytečné. Mělo by fungovat to, že bys použil step-up na 6,5V nebo 7,2V a pro MCU pak 7805 a pro LED pás 2 nebo 3 diody v sérii. Jedna dioda má 0,7V úbytek. Problém je trochu v tom, že úbytek na diodách poměrně dost kolísá s proudem, který diodou protéká. Místo diod bys mohl použít i lineární stabilizátor s výkonovým tranzistorem, ale musíš počítat s tím, že bude potřeba poměrně dobré chlazení. Skoro 3A, cca 2V úbytku = s rezervou být schopen uchladit minimálně 10W. Totéž samozřejmě platí i o těch diodách, kde máš cca 2W na jedné diodě. Je potřeba použít diody, které alespoň ty 2W (raději více) zvládnou uchladit.

Dakujem za reakciu. Za ten cas som sa s LED pasom “hral” a…

  • ostal som na frekvencii 14,7456 MHz
  • procesor napajam priamo z baterii. CPU az pri napajani pod 3,0V zacne “blbnut” - teda displej napajany z 5V steep up prevodnika prekresloval spravne, ale LED pasu uz asi nestaci komunikacny signal uroven log 1. Ale kedze chcem zacat nabijat baterie pri poklese pod 3,3V, tak je to v pohode, pri nich funguje vsetko v poriadku.
  • AD prevodnik mam rieseny internem ref. napajanim 1V s tym, ze uroven napatia baterii riesim cez odporovy delic a uroven jasu riesim fototranzistorom zapojeny tak, aby pri zvysovani jasu bolo mensie napatie a tak mi staci reagovat na hodnoty pod 1,1V. Co sa tyka kolisania prevodu AD prevodnika, docital som sa, ze to sposobuje aj kontaktne pole, tak snad po dokonceni LED pasu a osadeni do plosaku to nebude az tak kolisat.

Uz mi to celkom dobre funguje, ale stale je tam cosi na opravu a co doplnat, ale tak pomalinky ked je cas, tak postupujem dalej. Kazdopadne dakujem velmi pekne za pomoc a ak narazim na problem, tak napisema aj budete mat este cas a chut tak sa potesim nejakej tej rade. Budem musiet riesit este spinanie 230VAC adaptera, mam polovodicove rele Finder 34.81.7.005.8240 ktory ma vstup 5VDC 12mA takze akurat pre CPU vystup a vystup ma 2A pre 230VAC a je spinany pri prechode napatia nulou. Ale zial, vystup je len 2A, takze ked budem mat vacsi zdroj, tak uz to nebude zvladat.

Držím palce, ať se Ti daří. Kontaktní pole není úplně ideální nejenom pro AD převodník, ale obecně pro vyšší frekvence. Pokud máš něco jen pospojovanýho, tak tam špatný kontakt relativně lehce odhalíš, jakmile tudy běží nějaká komunikace, hledá se problém hůře. Co se děliče napětí týká, to jsi postupoval správně, je třeba si jenom ohlídat, jestli máš dostatečně velké odpory, abys zbytečně proudově nezatěžoval baterku. Například místo 100+270 Ohmů je dobré použít 100k+270k (klidně třeba i 1M+2M7) - poměr zůstává zachovaný, ale proudově jsi na tom mnohem lépe. Když pak ještě přidáš třeba 10n kondík, tak máš vstup i relativně vyhlazený a zbavený nechtěných špiček.

Tak se drž a doufám, že se podělíš i s úspěchem.

Tak po dlhsom case sa opat ozyvam. Trvalo to, ale tak robil som to vo volnom case, obcas cakal na zasielky z aliexpressu. LED pas uz je v ostrej prevadzke cez 3 tyzdne a zatial funguje spolahlivo, bez potrebneho resetu CPU. Este som potreboval cas na skreslenie schemy zapojenia, ktoru prikladam. Chcem vas skusenejsich poprosit, ci by ste ju pozreli a popripade mi ju skusili vylepsit, ak najdete nieco, co by bolo lepsie zapojit.

Vsetko je aktualne zapojene na univerzalnej doske plosnych spojov. Hlavna cast (CPU, baterky, zdroj a pod.) je docastne umiestnene v pevnej krabici od topanok, ale to len kvoli prachu. Okrem teda zdroja, a rele. Tie su mimo DPS. Tlacidla su tiez na univerzalnej doske plosnych spojov. Pre ne som vytvaral krabicku z hlinikoveho plechu, ktora sa podarila na druhy pokus. Je tam sice otvor pre pohybovy senzor vacsi, ale tak usiel vrtak. V bytovych podmienkach, sa to tazko robilo, hlavne ohybanie plechu bola “radost” na malom zveraciku, ktory je otocny :smiley: Pohlad na vnutro krabicky s tlacidlami odfotene nemam, ale prikladam vykres z AutoCADu, pre nazornost.

Prepoj medzi tlacidlami a CPU je ethernetovym kablom 5e, nakolko ten bol po ruke. Potreboval som sice na prepoj 9 zil (5x tlacidlo, jas, pohybovy senzor, napajanie 5VDC pre pohyb. senzor a GND) a tak pre GND som pouzil vodic tienenia.

Jediny problem, ktory som si vsimol este pri testovani s LCD displejom bol, ze ked som zapol napr. svetlo, alebo nieco, tak nabehlo par preruseni pre INT0 a INT1 (tlacidlo 1 a pohyb. senzor). Neviem, ci dat pre kazde tlacidlo este 100nF kondik? Ako pre nanajanie CPU.

Druha vec, ktora sa mi nepodarila vyriesit: Chcel som, aby, ked LED pas robi zmenu – kazdy efekt trva 2 sekundy, dokazal reagovat na stlacenie nejakeho tlacidla. Programovo som to vedel urobit, ale problem bol ten, ze zvykol casto LED pas prebliknut. Proste aj male prerusenie komunikacie s LED pasom chybne vyhodnotil a nastal posun a kratke bliknutie inych farieb, vacsieho jasu a podobne. Jednoducho to rozhadzalo. Tak som to musel zrusit a tlacidla reaguje len vtedy, ked neprebieha komunikacia s LED pasom (ak sa dobre trafi, tak zareaguje aj cez tie 2 sekundy efektu). Neviem, ci sa tu da nieco vymysliet, hlavne, ak ma prerusenie vyhodnotit, ktore tlacidlo (2, 3, 4 a 5) sa stlacilo. Tlacidlo 1 je cez prerusenie INT0.

Nabijanie baterii funguje dobre. Signalizaciu o nabiti a nabijani baterii beriem kradnutim signalu z dosticky pre nabijanie z LED. Zapojene su cez tranzistory. Zistovanie aktualneho napatia na baretiach uz teraz funguje spolahlivo, pomohlo, ze je vsetko pevne zletovane. Este som si vsimol, ze to trosku ovplyvnuje priezer vodica, cez ktory ide aj napajanie LED pasu z baterii. Ked odoberal vacsi prud, tak vznikal ubytok na kabloch a preto CPU nameral mensie napatie. V scheme kvoli tomu uvazujem, ze odporovy delic pre zistenie napatia bude napojeny priamo z baterii vlastnym plosnym spojom. Baterie sa nabijaju hned, ako sa zapne zdroj 230VAC/5VDC. Ten sa zapina pri rozsvieteni celeho LED pasu (t.j. mino nocneho rezimu) a vypina sa 1,5 hod po prijati signalizacie nabitia baterii alebo 1,5 hod po vypnuti LED pasu. V pripade, ze by sa LED pas nepouzil dlhsie, tak CPU pri poklese napatia baterii pod 3,3V sam zapne zdroj pre nabitie baterii. Z tychto baterii som uz zapojil aj bezdotykove mydlo v kuchyni, takze sa nemusim starat o ich nabijanie. Kontrolu napatia a jasu v miestnosti kontroluje CPU kazdu minutu.

CPU zistuje uroven jasu v miestnosti cez fototranzistor umiestneny vedla tlacidla 1. Kontrola je ako som uz pisal kazdu minutu. Fototranzistor je zapojeny tak, aby pri znizovani jasu sa znizovalo napatie. Kvoli tomu nebolo potrebne pre uroven jasu riesit odporovy delic. Pri poklese jasu sa aktivuje nocny rezim a rozsvecuju sa 3 LED v zltej farbe (cervena a zelena farba LED). To uplne staci pre orientaciu sa v kuchyni. Po cca 14 sekundach (cca 7s na pohyb. senzore + 7s v CPU) bez pohybu sa vypnu 2 LED (krajne) a po dalsich 7 sekundach aj ta tretia LED. To je osetrenie, aby osoba vedela, ze ju senzor nezachytava, resp. sa nehybe a musi sa pohybat, aby neostala po tme. Hysterezia pre zapnutie a vypnutie nocneho rezimu z urovne jasu je 200 z ADC hodnoty, co uplne postacuje. Ak si niekto pocas aktivovaneho nocneho rezimu zapne riadne svetlo v kuchymi na strope, tak do minuty sa nocny rezim vypne (musi prebehnut ADC prevod urovne jasu).

Zmenu som urobil ohladne funkcii tlacidiel:

Tlacidlo 1 funguje ako povodne. 1. stlacenie zapne LED pas a len biele LED. 2. stlacenie zapne vsetky farby LED pre maximalny jas. 3. stlacenie vypne LED pas. V podstate toto tlacidlo pouzivame len na zapnutie LED pasu, popripade este to druhe stlacenie pre maximalny jas. LED pas vypiname vacsinou tlacidlom 5, nakolko vacsinou LED pas ide len na bielych farbach LED a tak stlacenim tlacidla 5 obideme rozsvietenie max. jasu. Zapne sa sice nocny rezim, ale ten uz vacsinou aj tak treba, kedze sa LED pas pouziva, ked je tma. A ak by bol dostatocny jas, tak CPU do minuty nocny rezim vypne.

Tlacidlo 2. Tu je zmena a toto tlacidlo je zlucenie povodne tlacidla 2 a 3. T.j. po stlacani tlacidla postupne znizuje jas o 20% a postupne znizuje pocet rozsvietenych LED. Casom som prisiel na to, ze nikomu sa nechce stukat s dvoma tlacidlami, aby znizil jas a aj pocet LED a vzdy sa pouzilo len jedno tlacidlo. Vyhodu to ma aj v tom, ze dalsia funkcia LED pasu je taka, ktora pri plnom rozsvieteni LED pasu a pri necinnosti pohyb. senzora kazde 3 minuty znizuje jas a vypina LED diody. Preto bolo dobre riesenie toto zlucit s tlacidlom 2. Urovne maju rovnake a ak napriklad bol jas LED pasu znizeny tlacidlom 2 a odideme z kuchyne, tak CPU bude postupne vypinat LED pas az od urovne nastavenej tlacidlom 2, kym ho postupne nevypne. A po prichode do kuchyne ho rozsvieti na uroven jasu nastavenu tlacidlom 2 a nie na maximum.
Urovne jasu a poctu LED (kazdy riadok znamena jedno stlacenie tlacidla 2, alebo ubehnutie 3 minut pri neaktívnom pohyb. senzore):

Tlacidlo 3. Kedze sa uvolnilo, nasiel som mu novu funkciu. LED pas uz mam pod celou linkou, je zbytocne, aby vzdy svietil cely. Preto som ho rozdelil na viacej cati, tak ako si mamina povedala. A postupne sa rozsvetcuju stlacenim tlacidla 3.

Tlacidlo 4 funguje teraz ako resetovanie nastaveni tlacidla 1, 2 a 3. Tlacidla 1 preto, ze rusi nastavenie maximalneho jasu na rozsvietenie len bielych LED. Po jeho stlaceni sa rozsvietia vsetky LEDky v bielej farby. Po doprogramovani tlacidla 3 bude nulovat aj jeho zmeny a rozsvieti len cast LED pasu ako na zaciatku.

Tlacidlo 5 je ako povodne. Zapina a vypina nocny rezim. No ale do toho mu uz teraz kecia aj snimac jasu, takze ak ho zapnem cez den, tak ho do minuty CPU vypne a naopak. Ak by som ho v noci vypol, tak si ho CPU do minuty zapne :slight_smile:

Ako CPU som nakoniec pouzil ATmega644PA-PU, nakolko som skusal funkcnost 4m LED pasu a zistil som, ze v ATmega328P-PU mi chyba pamat na premenne.

Tak hadam vsetko. Ak by ste chceli linky na ali vsetkych veci, ktore som k LED pasu objednavat (suciastky a pod.) tak napiste a mozem urobit zoznam. Coto je ale uz v prispevkoch vyssie. Neviem, ci chcete, aby som urobil aj video, ako funfuje LED pas, ale asi si to viete predstavit :slight_smile:

A este to najdolezitejsie :slight_smile: Velke podakovanie patri pre Balů, ktory mi v tejto teme dal vela cennych rad, takze DAKUJEM :wink: Uz len dufam, ze bude mat trpezlivost aj pri dalsich mojich “projektoch”.
LED pas_ovladac.pdf (18.7 KB)
LED pas_hlavna schema.pdf (34.2 KB)

Ahoj.

Pro začátek - stíněný ethernet kabel není 5e, ale 6. Kategorie 5e nemá stínění. Ale to je jenom detail.

Díval jsem se do schématu a externí pull-up odpory u tlačítek jsou zbytečné, pokud zapneš interní pull-up odpory v procesoru. Sice s nima nic nezkazíš, ale zbytečně si komplikuješ DPS. Psal jsi, že máš potíže s tím, že při zapnutí světla Ti proběhla nějaká přerušení INT0 a INT1. Dávat vstupní signály na přerušení (obzvlášť tlačítka) je klasická (v podstatě začátečnická) chyba. Ono je to hezký - stiskneš tlačítko a procesor o tom okamžitě ví. Jenže tlačítka (a nejenom ty) trpí zákmity kontaktů. Jedna varianta je ošetřit zákmity přímo v HW, druhá (a mnohem jednodušší) je řešit zákmity tlačítek pomocí SW. Všechny tlačítka obsluhuj v hlavním programu. Pokud něco z toho používáš k probuzení procesoru, pak tam to přerušení nech, ale použij ho jenom k proobuzení procesoru. V programové smyčce si přečti stav vstupu a pokud je stabilní dostatečně dlouho, považuj tlačítko za stisknuté (nebo obecně - považuj vstup za aktivní).

Druhým problémovým bodem máš komunikaci s LED páskem. Pokud máš předem dané časy ke komunikaci, pak nesmíš připustit jakékoliv zpoždění během procesu odesílání dat - říká se tomu “Time critical section”. Máš dvě možnosti :

  1. Na začátku sekvence zakázat přerušení a po odeslání dat ho zase povolit.
  2. Dát sekvenci odeslání dat do přerušení od časovače - prakticky tak zabiješ dvě mouchy jednou ranou.
  • během přerušení se další nezpracuje, až než se stávající dokončí.
  • Data do pásku odesíláš v přesně daných intervalech a přesně víš, jak často dochází ke změně dat v pásku. Lépe se pak časují veškeré efekty atd.

Pokud nastavíš časovač na 10ms a do hlavní smyčky dáš sleep (standby režim), pak 100x za sekundu odešleš data do pásku a 100x za vteřinu načteš vstupy. 10ms je pro procesor moře času - obzvlášť když používáš krystal 14MHz. Pokud je nějaký vstup aktivní, do proměnné pro něj přičteš 1, pokud není aktivní, danou proměnnou vynuluješ. Přesně tedy víš, že pokud je nějaké tlačítko aktivní 10x po sobě (napočítáš do 10), pak je stisknuto 100ms (= 0,1s) a jeho stav se dá prohlásit za aktivní (v prípadě tlačítka se dá prohlásit za stisknuté).

Tenhle princip používám ve všech svých programech. Na začátku nastavím časovač na nějakou hodnotu (obvykle 1 nebo 10ms, případně na kmitočet, který potřebuju pro refresh LED displeje apod.). V hlavní smyčce pak provedu vše potřebné a procesor uspím. Jakmile odčítá časovač, provede se opět jeden cyklus programu. Vše pak řídím příznaky na základě kterých se provádí činnosti, které se neprovádí každý cyklus. Program musí být napsaný tak, aby vždy vše stihnul provést mezi dvěma přerušeními. Delší činnosti je tak potřeba rozfázovat. Stejně tak na čekání. Na vteřinové čekání taky nedáš _delay_ms(1000), ale nastavíš nějaký odpočet a jakmile se odpočet dokončí, tak víš, že jsi čekal tak dlouho, jak jsi potřeboval. Obecně je nutné se funkci delay vyhybat jako čert kříži. a pokud už musíš dát někam delay, tak ho maximálně v rádu mikrosekund. A pokud by delay trval déle, než je doba mezi přerušeními, pak místo delaye činnost rozfázovat s využitím časovače.

Příklad programu s využitím timeru :
Mám 4-místný multiplexovaný 7-segmentový LED displej, tlačítko, LEDku.
Stiskem tlačítka rozsvítím LEDku a zapnu odpočet, po odpočítání času LEDku zhasnu. Při stisku tlačítka během odpočtu čas vynuluju a LEDku shasnu. Obojí musí reagovat pouze na stisk tlačítka, nikoliv na jeho držení. K tomu příklad nějakého dlouhého procesu, který by trval déle, než je čas mezi přerušeními.

Obsluha přerušení od časovače
{
// displej
  Vypnu napájení segmentovky, na datových pinech nastavím hodnotu další segmentovky a aktivuju ji.
// čas
 Pokud je nastavený příznak pro časování
  {
    Zjistím milisekundy
    milisekundy jsou 0 
    {
      zkontroluju čas
      čas je 0
      {
        zhasnu LED
        zruším příznak pro časování
      }
      čas není 0
      {
         odečtu čas a nastavím milisekundy na 1000.
      }
    }
  }
// dlouhý proces
  zkontrolovat odpočet
  pokud není 0
  {
    odečíst 1 
    pokud jsem dopočítal do 0 nastavit příznak pokračuj
  }
}

Program
{
  Nastavím IO piny procesoru
  Nastavím timer na 1ms (=1000Hz) s přerušením
  Načtu hodnoty vstupů a uložím si je jako aktuální i minulé.
  Vynuluju/nastavím časy a příznaky
  Povolím přerušení

  Hlavní smyčka
  {
    Uspím procesor do standby režimu (probudí se přerušením od časovače - tedy pravidelně každou 1 ms)
    Načtu vstupy
    ošetřím zákmity tlačítka
    zkontroluju aktuální stav tlačítka s minulým
    pokud je teď stisknuté a předtím ne
    {
      zkontroluju příznak časování
      časování aktvní
      {
        vymažu příznak časování
        vynuluju čas a milisekundy
        zhasnu LED
      }
      časování není aktivní
      {
        nastavím čas
        nastavím příznak časování
        rozsvítím LED
      }
    }
    uložím aktuální stav tlačítka jako minulý
    dlouhý proces
    {
      zkontroluj příznak pokračuj
      příznak je nastavený
      {
        vynulovat příznak pokračuj
        nastavit čas mezi kroky - pokud je čas mezi kroky vždy stejný, může být tady
        kroky
        {
          1: část 1
               zvýšit krok o 1
               nastavit čas mezi kroky - pokud jsou časy mezi kroky rozdílné
          2: část 2
               zvýšit krok o 1
               nastavit čas mezi kroky - pokud jsou časy mezi kroky rozdílné
          .
          .
          .
          .
          x: část x
               nastavit krok na 1 - konec procesu
               nastavit čas mezi kroky - pokud jsou časy mezi kroky rozdílné
        }
      }
  }
}

Smyslem tohohle je hlavně návod, jak vyhodit tlačítka z přerušení a dát do přerušení od časovače komunikaci s páskem. V klidu pak můžeš reagovat na tlačítka i během probíhajícího efektu.

Dakujem velmi pekne za dalsie rady…

No tie tlacidla cez externe odpory mi odporucil ten jeden chalan, co ma zaucal do tohto kedysi davno. Ale tak asi su fakt zvytocne…

Tie INT0 a INT1 riesim v podstate tak ako mi pises.

INT0 uplne, len na zobudenie CPU. (Tie premenne pocet som mal len aby som videl, kolko krat prebehne prerusenie)

ISR (INT0_vect) { pocet_int0++; }

A v INT1 (od pohyb. senzora, ktory nema kontakt, ale posiela napatie) som dal nastavenie na rozsvietenie LED pasu.

ISR (INT1_vect) { if (pohybovy_senzor_noc_enable == 1) { LEDpas_efekt = 9; LEDpas_zmena = 1; CPU_ON = 1; } pocet_int1++; }

Tie tlacitka riesim tiez casom, ale robim ich opacne. Ja nastavim cas (hodnota 225, co je 1 sekunda) do premennej pre dane tlacidloa v Timer0 preruseni tuto hodnotu znizujem. A tladidlo vyhodnotim len vtedy, ked je premenna rovna 0. Proste takto som si to sam vymyslel, ale ten tvoj sposob je rozhodne lepsi, lebo vies zistit aj dlzku stlacenia tlacidla, nad ktorou som uz rozmyslal, ako to vymysliet. Pokusim sa to riesit tvojim spôsobom, len to bude celkom zmena v programe.

// Tlačítko 1 - on/off if (tlacitko_1 == 0) { if (Tlacitko(1) == 0) { //zistuje, ci je stlacene tlacidlo tlacitko_1 = tlacitko_cas; //prikazy pre tlacidlo } }

Mne islo len o to, ze preco sa prerusenie vykona viac krat, aj ked sa nestlacilo tlacidlo ani nic. Ze ci netreba nejak hardverovo osetrit dane vstupy, alebo napajanie, alebo co…

No toto je tiez fajn napad, dať posielanie dát do LED pasu do Timeru, ze mi to nejak nenapadlo. Asi preto, ze som sa vzdy snazil prerusenie robit co najkratsie. Ja teraz obnovujem LED pas asi zbytocne vela krat (neviem ako stiha procesor, ale maximalne to moze byt 2 x 225 = 450-krat za dve sekundy. A asi je to uplna hovadina. Pred samotnym odoslanim dat som zakazal prerusenia od Timerov a hned po odoslani som ich opat povolil. Cize toto by som uz nemusel robit. Len musim oddelit pripravu dat od odosielania dat do LED pasu. Priprava musi bezat asi v programe a ked bude hotova, nastavimm premenu, ze su data pripravene a ked prebehne prerusenie Timeru tak ich odosle do LED pasu. Asi tak by to bolo fajn? A takto by som znizil pocet obnoveni na 200x za 2 sekundy, co by mohlo byt u v pohode :slight_smile:

Este pre predstavu, jedno odoslanie dat do LED pasu pre aktualne 138ks LED trva 165600 ns + 80ns reset bit, t.j. 0.16568 ms.

Balů, myslím, že to není pravda. Hádat se nebudu, je to jen detail, ale takto se to prodává i používá, např. tady:
intelek.cz/cat_tree.jsp?dpa … %9Bn%C3%A9
nebo zde na straně 9: kvelektro.cz/wp-content/upl … kabely.pdf
V práci je používáme také. Pravda je, že stínění je jen celkové a ne jednotlivé páry.

PS. Není to žádná výtka. Naopak, je super, že tady někdo pomáhá ostatním. Čtu to tady rád. Člověk se alespoň z programování něco dozví.

Tak nakonec máme pravdu všichni. Kategorie 5e má provedení stíněné i nestíněné …
Mám tady UTP Cat5e, proto jsem si myslel, že stíněná je až Cat6.
Dokonce i Cat6 je stíněná i nestíněná. Až Cat6A a výše je pouze stíněná.

Člověk se pořád učí …

Tady těžko říct, čím by to mohlo být. Prudký nárůst odběru samožřejmě může být důvod, že mohlo zakolísat napětí. Až budu mít trochu času, kouknu do schématu, jak máš řešený napájení a jeho zablokování. Třeba se mi podaří něco z toho vykoukat.

To je celkem v pohodě. Pokud budeš mít periodu přerušení 10ms, klidně se v přerušení můžeš zdržet i několik ms. Záleží na tom, kolik toho má na starosti zbytek programu.

daj tam esterne pullup odpory a k tlacitku kondik 47n, sice to bude troska zataz na tlacita ale to zvladnu.

Ďakujem, snáď niečo vymyslíš…

No toto neviem ako zistiť, koľko trvá cyklus programu. A tiež by ma zaujímalo, či keď trvá dlhšie prerušenie, ako sa správa procesor. Napr. časovače čítajú ďalej? A ak vznikne iné prerušenie, tak keď skončí to aktuálne, vykoná CPU hneď to, čo vzniklo počas prerušenia?

Ďakujem, tiež som rozmýšlal, že tam pridať kondíky, len neviem či k pinu CPU alebo ku tlačidlu?

Když už tam budeš dávat kondík, tak ho dej k pinu a do série s tlačítkem přidej ještě odpor tak cca 100 Ohmů.

Ahojte, tak po dlhšom čase sa opäť pomaly dostávam k LED pásu. Rád by som doriešil zapojenie tých tlačidiel.
Nedávno som si všimol zapojenie tlačidla na mojom zdroji KAZ2 (kvôli oprave). Prikladám jeho zapojenie. Čo si myslíte o tomto zapojení? A hlavne o použití elektrolyt. kondenzátora?
Viem, že Balů písal, že externé odpory sú zbytočné. Ale chcel by som, aby sme sa skúsili pozrieť na opačnú stranu (možno sa mýlim, ale rád by som chcel vedieť, či je moja úvaha správna). Ako je citlivý PIN na CPU, kým nie je nastavený na vstup a nie je zapnutý pull-up odpor? Nie je vtedy náchylnejší na statickú el. (napr. dotyk)? Tieto tlačidla sú pripojené cez kábel a po navrhnutí plošáka, budu pripájané cez konektor. Ja som bral tak, že ak je tam externý rezistor, tak je PIN chránený vždy. Ale môžem sa kľudne mýliť. A neviem, či je to niečo platné, kým nie je pripojené napájanie. A zase, keď sa pripojí napájanie, tak nastavenie vstupného PINu je asi prvá vec, čo CPU urobí.

Tým zapojením v prílohe (z KAZ2) budem musieť naviac pridať ďalší odpor a kondenzátor. Je dobré použiť elektrolyt alebo keramický?
Ďakujem.
Zapojenie tlačidla.jpg

Možno by bolo fajn, keby si ssi poriadne naštudoval katalógový list ATmega328.
Tam by si sa veľmi jednoduchým porovnaním dozvedel, že pri napájaní 3,3V procesor spoľahlivo pracuje iba do 13,333MHz. Ak ho taktuješ vyššie tak tam už nič nie je nemožné :slight_smile:

Budeš sa čudovať, ale študoval som katalógový list. A ja som vychádzal z tohto grafu (viď príloha). Neviem dohľadať ten, čo som si to tam aj vyznačoval, ale sa mi zdá, že, mi to vyšlo nad moju frekvenciu.
Druhá vec, skúšal som CPU testovať a znižoval som mu napájanie a ak si dobre pamätám, pod 3V ešte fungoval, ale už asi nešiel dobre displej.
A po tretie, asi si nepochopil správne schému zapojenia a funkciu programu. Tých 3,3V, je veľmi málo pravdepodobné, že sa k takémuto napätiu tie batérie dostanú. To je v podstate už brané v programe ako kritická úroveň napätia batérii a vtedy CPU zapne zdroj bez ohľadu na to, či je potrebné ho zapnúť kvôli rozsvieteniu LED pásu a začnú sa batérie dobíjať. Tie batérie sa dobíjajú každý deň minimálne raz (večer) a keď je ráno tma a použije sa LED pás aj ráno, tak 2x. Batérie sa dobíjajú do 4,2V, takže po odpojení zdroja tam môže byť okolo 4V. A nočný režim, poprípade zapojené mydlo určite tak veľmi nevybijú batérie, aby sa dostali pod takúto hodnotu. Nemám to nikde zaznamenané, ale myslim si, že pod 3,3V sa ešte nedostali.
ATMEGA_graf frekvencia a napájanie.jpg