ATmega: Zpracování více přerušení než jedno. Jak na to?

Pokud jsem to správně pochopil, tak při zakázání globálního přerušení nefunguje ani ad převodník apod? A opačně zmínili jste se, že AD převodník používá také přerušení. Jelikož hodlám cyklicky měřit 12 lipol článků, tak díky tomu bude volný čas na další přerušení, když bude globální přerušení povoleno touto funkcí, tsk bude rozsekáno na úseky mězi těmito měřeními? Stihne AT mega alespoň 6 měření zasebou, aby to nepřekročilo únosnou mez? Budu potřebovat změřit napětí mezi článkem 1-2,1-3,1-4,1-5 a 1-6 a z těchto hodnot spočítat aktuální napětí na jednotlivých článcích. V případě, že se tyto měření přeruší, tak se spočítají nesmysly.

Samozrejme ze nebudes robit 6 prevodov za sebou. To je capina :slight_smile:
Casovy predelic na AD si tak ci tak musis nastavit tak, aby si mal maximalne 15ksps. To znamena, ze takych 100us je celkom dobry cas. za Tu dobu spravi mcu cca 1800-900 instrukcii. To tam predsa nebudes cakat :slight_smile:

Dojde prerusenie od AD, nacitas hodnotu, ulozis ju dp RAM, zmenis adresu MUXu a spustis prevod (ak sa nespusta automaticky od casovaca, alebo cyklicky, co je pre tento pripad najjednoduchsie a uplne dostacujuce). Aj s prerusenim tak cca 30-60 instrukcii. No naco tam kysnut tych zvysnych 17930 taktov. Ked sa prevod skonci, spravis prerusenie, ulozis hodnotu do RAM na dalsiu poziciu a tak stale dookola. A za 1730 taktov procesora robis inu uzitocnu cinnost. More a more casu medzi dvoma prevodmi, percentualne cca 96% :slight_smile:

Já to chci programovat v Bascomu.
Takže bych nejspíš udělal takto:


.
.
predešlá část programu
.
.
' Prevovod prvniho akupacku
a = getadc(0)
b = getadc(1)
c = getadc(2)
d = getadc(3)
e = getadc(4)
f = getadc(5)
.
' Vypocty napeti prvniho akupacku
u(1) = a
u(2) = b-a
u(3) = c - u(2)
u(4) = d - u(3)
u(5) = e - u(4)
u(6) = f - u(5)

.
následující část programu
.
.
.

To je omyl. Všechny periferie (i ADC) fungují i bez přerušení.

Osobně je pro mne velikou záhadou proč se má při nabíjení nebo vybíjení baterie měřit napětí každých 100 mikrosekund.
Já jsem při nabíjení NiCd měřil každých 5 minut.
Dobře, LiPol je háklivější na přepětí nebo podpětí, ale i tak musí interval několika vteřin bohatě stačit.

Tvůj poslední kód je v pořádku, nepotřebuje žádné přerušení
a je zbytečné bádat jak dlouho bude trvat.

No ved to :frowning:

Je to spravny predpoklad? BASCOM nepoznam, ale mam obavy z kratkeho “nazretia” na stranky tvorcov, ze ich snahou o co najvacsie zjednodusenie pre prvouzivatela sa zabijaju prirodzene vlastnosti procesora. Mozno cez taketo brutalne obmedzenie existuje cesta, (urcite odpovedia kompetentnejsi a skusenejsi, ci som zamer tvorcov spravne pochopil) ale ak nie, nie je lepsie naucit (aj cez prvopociatocnu [trochu] namahu) sa nieco rozsirenejsie, pouzivanejsie a koncepcnejsie?

Absolutne s Tebou suhlasim. Tiez si nemyslim, ze prepatie/podpatie na 1-10minut LiPol principialne zasadne ublizia.

100us som uvadzal ako extrem z “hornej” strany, ktory je “treba” dodrzat pre 10b stabilny prevod. Ak potrebuje previest 10 kanalov, ku kazdemu sa dostane 1x za 1ms (10x 100us). Ak spocita priebezne 20prevodov a zpriemeruje, jednoducho odfiltruje 50/100/200Hz a dalsie nasobky 50Hz. Pritom som uvadzal, ze podla mna sa tam 50Hz neobjavi ani omylom (vid moj vypocet analogoveho filtra na 1.59Hz). Dalej tvrdim, ze aj ked nastavi AD prevod takto sialene brutalne rychlo, stale bude mat MCU dost casu robit vsetko ostatne. Je to celkovo tak jednoduchucka uloha, ze ju Kolbaba71 zvladne “lavou zadnou”. Len o tom este nevie a kym to zisti, bude mu to trvat tak cca 2-5 mesiacov :slight_smile:

Imho důležité bude, když se včech 6 článků změří v maximálně krátkém čase. Jelikož kromě jednoho, tak napětí neměřím přímo, ale dopočítávám. Pokud bych měřil jeden článek 1x za sekundu, tak mě z posledního výpočtu napětí článku budou vypadávat nesmysly. Pokud bude napětí do 3,5V na článek, není problém měřit pomalu. Ale pod toto napětí bych chtěl zrychlit, abych akupack zbytečně neničil, když jak bylo řečeno, s těma funkcema co jsem si vymyslel, tak se bude stejně mcu flákat.

Můžu se zkusit naučit programovat Atmely třeba v C. Jenže programovat něco co znám velmi povrchně v jazyku, jenž neznám, to mě příjde jako cesta do pekel. Bascom má nevýhodu v tom, že vše zjednodušuje a je proto objemnější a náročnější na zpracování, ale zase je celkem blbuvzdorný a brání se, když je někde něco špatně.

Nemusíš mít obavy. Pokud vše půjde jak by mělo, tak fyzicky tu svítilnu začnu vyrábět tak o letních prázdninách. A to považuju tuto myšlenku za docela optimistickou. :slight_smile:

Nic nebrání tato zjednodušení nepoužívat.
Např. příkaz

 Config Timer1 = Timer,  Prescale = 1024 

bude v C

TCCR1A = 0; TCCR1B = (1<<CS10)|(1<<CS12);
Totéž můžeš použít v Bascomu: TCCR1A = 0; TCCR1B = (2^CS10) OR (2^CS12);
K tak jednoduchým úlohám jaké tu probíráme Bascomu nic nechybí.
A pro kolegu je to jednorázová akce, kvůli které určitě nepřejde na jiný jazyk.

Moze byt, v tom sa uplne nevyznam (ako som uz pisal).

Myslel jsem samozřejmě změřit všechny články, pak 1s pauza atd.

Pokud bude odběr např. 5-10C, tak měř pomalu do 3,5V a pak vypni aku.
Teď si nevzpomínám přesně ale mám dojem že u modelu jsem nastavoval 3,6V pro vypnutí.
Jaký význam má ždímat zbývajících pár procent energie?

Já z těch akupacků chci při max výkonu tahat tak 200W. Měření mě má zabránit zbytečně poškodit akupack tím, že ho příliš vybiju. Zase na druhou stranu nechci tam nechávat zbytečně velkou rezervu. Takže měřit napětí budu “pomalu” při napětí nad 3,4V a když bude hodně blízko, tak zrychlím. Dále možná přidám kontrolu napětí i v okamžiku, kdy zvýším výkon a kdy hrozí klesnutí napětí pod bezpečnou mez.

Odběr bude jen 2C nebo dokonce jen 1C. Podle toho, jak akupacky zapojím. Takže napětí neklesne náhle, jak je to obvyklé u výkonných modelů. Takže když napětí klesne pod bezpečnou mez, tak ochrana musí zareagovat okamžitě. První předstupeň, před odstavením aku bude buď odstavení některých okruhů led, či snížení dosažitelného maximálního výkonu.

Musím se opravit.
Nenastavoval jsem vypínací napětí jednoho článku na 3,6V
ale dvoučlánku na 6,6V.

3,3V na článek považuju za absolutní hranici, pod kterou nechci jít. U akupacku se dvěmi články lze předpokládat, že rozdíl článků může být +/- 0,1V. Avšak u 6 článkového akupacku bych toto neočekával a nedivil bych se, kdyby rozdíl v napětí mezi jednotlivými články dosahoval i 0,2 či dokonce 0,3V. Z tohoto důvodu chci měřit každý žlánek zvlášť, abych zabránil tomu, že sice akupack 6x3,3V = 19,8V, ale nejlepší článek bude mít ještě 3,5V a nejhorší bude mít již 3,1V, kdy již probíhají nevratné změny k horšímu.

LiPoky používam několik let v AEG. Mam to hlidané přec MCU Attiny85 a PWM řízení motoru, konrtrolu napětí na LiPO atd… Vypínání mam udělaný
při 3,2V na článek(3Cell). Mněřim je dohromady. Nikdy jsem nemněl problém že by byl rozdíl 0,1V na Cell. Při provozu AEG dostává baterka záhul. Pří spuštění bere i 60A!!! sice jen asi 0,1s ale to při hře se opakuje do kola. Ty baterky začnou degradovat 2,7-2,5V. Větší důraz dej na nabíjení. Já mam nabíječku Pelikán sice drahá jak prase ale vyplatí se kvalita.

Co je mě známo, tak rychlé vybíjení 10-20C je mnohem lépe hlídatelné, než pomalé, jako je v mém případě 1-2C. Nabíječku už mám je to SkyRC E6680. Nebude to asi žádný zázrak, nicméně ji už vlastním. Zvažuju, že bych Armel využil i na řízení vestavěné nabíječky s balancérem do svítilny, jelikož svítilnu mimo akupacků půjde napájet i 230V.