Atmega8 snímání času

Všetko čo sa týka mikropočítačov + Sekcia Arduino

Moderátori: psichac, Moderátori

Používateľov profilový obrázok
termixnator
Pokročilý člen
Pokročilý člen
Príspevky: 806
Dátum registrácie: 18 Jan 2010, 00:00
Bydlisko: PRAHA
Vek: 31
Kontaktovať používateľa:

Atmega8 snímání času

Príspevok od používateľa termixnator » 06 Máj 2014, 21:06

Ahoj nevím jak to přesně nazvat ale potřeboval bych Atmegou8 snímat jedno dvojité čidlo (vždy je zastíněna jen jedna polovina) a pokud by byla jedna polovina čidla zakrytá déle než 100ms objevil by se na výstupu Atmegy8 300ms pulz.

A teď k problému, nevím jak by se daly zárveň měřit vstupní pulzy na dvou vývodech megy potřeboval bych trochu nakopnout. Ty výstupní pulzy už nebudou problém to bych vyřešil pomocí delay.

Budu rád za všechny poznatky. Ideální by byl příklad v jazyku C ze kterého bych si odvodil funkci. Předem díky všem.
0

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: Atmega8 snímání času

Príspevok od používateľa jaromir » 06 Máj 2014, 21:11

Da sa to urobit trebars tak, ze si nastavis timer na povedzme 10ms a vzdy v preruseni sa pozries na logicku uroven od senzoru. Ak je aktivny, tak k nejakemu pocitadlu pripocitas jednotku, inak ho vynulujes. Ak stav pocitadla prekroci 10, tak vies, ze senzor bol aktivny 100ms v jednom kuse a mozes si nastavit nejaky SW flag, ktory potom vyhodnocujes v hlavnej slucke - tam mozes urobit prislisnu akciu, trebars nastavit vystup.
0

Používateľov profilový obrázok
boraicho
Ultimate člen
Ultimate člen
Príspevky: 12407
Dátum registrácie: 03 Feb 2007, 00:00
Bydlisko: Prešov
Vek: 35
Kontaktovať používateľa:

Re: Atmega8 snímání času

Príspevok od používateľa boraicho » 06 Máj 2014, 21:18

jaromir, ty si osobne nastavuješ tie flagy ako? napr unsigned int alebo volatile int?
0
"Aj nevinne vyzerajúca súčiastka, môže byť príčinou nefunkčnosti zariadenia a tou kondenzator 100% je"
3D REBEL II + PLA + PETG
CNC 1810 na DPS

Hinsi

Re: Atmega8 snímání času

Príspevok od používateľa Hinsi » 06 Máj 2014, 21:19

Flag z přerušení musí být volatile vždy. Do charu se ti na AVR vejde flagů 8, do intu 16.

unsigned/signed značí jak se k proměnné přistupuje při výpočtech. Pokud proměnnou používáš jen jako hrstku flagů, tak signed/unsigned na to nemá žádný vliv.

Jaromírovo řešení je nepraktické především z důvodu nejistoty měření 10ms. Pokud hraješ na přesnost, takhle to nepůjde. Napadlo mě však naprosto čisté řešení, které by bylo schopné odměřit přesně 100ms pro obě čidla, s minimální režií okolo. (Pomocí Timeru 1).
//Nejistota měření mého řešení by byla velikost 1 tiku timeru, co může být docela málo, řád mikrosekund). Využily by se k tomu Output Compare jednotky.

Trochu se rozkoukám (před chvílí sem přišel dom), povečeřím a popíšu jak na to.

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: Atmega8 snímání času

Príspevok od používateľa jaromir » 06 Máj 2014, 21:30

Musi to byt volatile premenna a vzdy pred checkovanim v maine treba prerusenia odstavit, flag skontrolovat, ak je nastaveny, poznacit si ze treba nieco urobit, flag vynulovat a zas spustit prerusenia. Ten casovy usek, kedy su prerusenia vypnute, musi byt kratky a rychly (teda ziadne delaye, printfy a podobne vtakoviny), lebo ak vtedy pride prerusenie, bude oneskorene o dlzku toho odstavenia. V tomto pripade to nemoze vadit - netreba nejako extremne presne casovanie.
0

Hinsi

Re: Atmega8 snímání času

Príspevok od používateľa Hinsi » 06 Máj 2014, 22:22

Pro bys kvůli 8bitové "flag proměnné" stopoval přerušení? Jaký to má smysl?


Popíšu jiný postup, s přesným časováním:

a) nastavit dvě externí přerušení, každé z nich pro jedno čidlo. Budou se aktivovat zastíněním čidla.
b) nastavit Timer 1 do volně běžícího režimu, čítání plných 16bitů, perioda přetečení delší než 100ms. (Stačí jen o málo delší).
c) nastavit dvě přerušení pro compare match na timeru 1, tzn pro oba komparátory, OCIE1A a OCIE1B.

Posup měření:
1) při zatínění čidla se vyvolá jeho příslušný interrupt. Přečte se obsah Timeru1 a spočte se (prostým přičtením), jaký bude obsah timeru za požadovaných 100ms. Tato hodnota se nastaví na příslušný compare match A nebo B (podle toho které čidlo).
2) při vyvolání přerušení od compare matche se otestuje, zda je čidlo pořád zastíněné. Pokud ano, nahodí se příslušný flag "čidloXzastíněno dlouho".
3) v hlavní smyčce programu se pak pouze čichají flagy a po přečtení příslušného flagu se vygeneruje pulz. Způsob generování pulzů nechám na tobě, to si vymysli jak chceš, opět je spousta řešení, přičemž nejblbější z nich (kterému bych se vyhnul) je použití "delay(300ms)", protože to pouze zabrzdí procesor, na druhý flag se v daném čekání poněkud kašle, je to ošklivá humpolárna a neumožní procesoru dělat více úloh najednou. Ke generování pulzů je opět možné s výhodou využít nějakého timeru, při vhodném rozvržení úlohy opět klidně tentýž timer1.

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: Atmega8 snímání času

Príspevok od používateľa jaromir » 06 Máj 2014, 23:19

Pre osembitovu premennu by som stopol prerusenie, pretoze zvyknem flag vynulovat - to su dve samostatne operacie medzi ktormi moze prist prerusenie. Okrem toho, aj ked je to osembitova premenna, nemam inherentne zarucenu atomicitu operacie, ak si to nezariadim inak.
0

Hinsi

Re: Atmega8 snímání času

Príspevok od používateľa Hinsi » 06 Máj 2014, 23:22

Nulování jediného bitu se překládá jako cbr/cbi ... takže co tím chtěl básník říci?
//ekvivalentně set jediného bitu sbr/sbi

A když už se v tom rejem, testování jediného flagbitu je opět jedinou instrukcí, SBIC, SBIS, SBRC, SBRS.
Předpokládá to ale vhodně napsaný program s flagregistrem mimo RAM, pro ryhclejší přístup - to se omlouvám, patrně jsem na to zapomněl upozornit. AVR bohužel musí do ram přes LDS, STS v některých případech takto i do I/O oblasti, kde standardní rozsah adres nestačí.

//Jsem až moc příliš zvyklý na psaní v ASM, kde si můžu dělat co chci a nemusím přemýšlet nad tím, co s tím vyvede kompilátor. :D

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: Atmega8 snímání času

Príspevok od používateľa jaromir » 06 Máj 2014, 23:48

Basnik tym chcel povedat, ze najprv sa najprv pozriem ci je flag nastaveny, ak ano, tak ho potom vynulujem a vykonam akciu. To su minimalne dve instrukcie pracujcue nad tym istym flagom. Nulovanie je treba, aby sa akcia nekonala donekonecna. No a prerusenie (a zmena stavu flagu) moze prist medzi tym pozrenim a skontrolovanim.
To iste sa tyka aj programovania v assembleri a tam to treba osetrit tak isto.
0

Hinsi

Re: Atmega8 snímání času

Príspevok od používateľa Hinsi » 06 Máj 2014, 23:56

Zdá se mi že popisuješ nějakou neexistující situaci.

Když si otestuju flag, rozvětvím program, a pak nuluji flag, jaká asynchronní změna flagregistru mezi tím vyrobí průser? Nikde nepoužívám žádné R-M-W, ak nejdu přes RAM. Maximálně mezi tím se nastaví další flag, to čemu by vadilo? (ničemu, ak nejdu přes RAM).

Používateľov profilový obrázok
jaromir
Power user
Power user
Príspevky: 4538
Dátum registrácie: 08 Júl 2011, 00:00
Vek: 40

Re: Atmega8 snímání času

Príspevok od používateľa jaromir » 07 Máj 2014, 00:14

Nie som si isty, ci ti celkom rozumiem.
Nic to nemeni na tom, ze sme povodnemu taztelovi odpovedali viac nez dostatocne a debatovat na temu bezpecnosti zdielanych premennych u asynchronnych procesov mozeme niekde inde. Napriklad pri pive :)
0

Hinsi

Re: Atmega8 snímání času

Príspevok od používateľa Hinsi » 07 Máj 2014, 00:39

OK, necháme toho, ať mu to tu moc nevytapetujem. Kdyžtak písnu SZ, už jsem vyřešil ku vší spokojenosti problém s resetováním toho HC595, stačilo se kouknout pozorněji do katalogu :D

Používateľov profilový obrázok
termixnator
Pokročilý člen
Pokročilý člen
Príspevky: 806
Dátum registrácie: 18 Jan 2010, 00:00
Bydlisko: PRAHA
Vek: 31
Kontaktovať používateľa:

Re: Atmega8 snímání času

Príspevok od používateľa termixnator » 07 Máj 2014, 16:17

Super neco jsem si zase nastudoval diky :)
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok