Jak bezpečně detekovat vstupy - stav 0/1

Ahoj, potřeboval bych monitorovat cca 20 vstupů s log 1/0 (resp. spojeno/rozpojeno). Procesor bych rád použil ATMega32. Jenže jak na to? MCU bude dělat i jiné věci a může se stát, např., že vstup 1 je v logické “1”, procesor něco začne dělat jiného, V1 se rozpojí, ale vrátí se do log. 1 dříve, než to stihne procesor zaznamenat. Vím, že na pár vstupů bych mohl použít přerušení, ale já bych to potřeboval cca na 2 desítky pinů. Jak na to správně? Díky.

Mega 164/324/644 má 32 externích přerušení.

to zní zajímavě. a dá se to nějak řešit bez těch přerušení?

Bez přerušení se asi neobejdeš. Jde jen o to, jaké to bude.
Pokud by ti stačila nějaká omezená vzorkovací rychlost, můžeš třeba pomocí přerušení timeru každou např. ms očumovat porty, jesli se něco nezměnilo.

měřím tam ještě teplotu na 1wire (DS18B20) atam je to docela časový mazec, vlastně změření může trvat až vteřinu a nemělo by se přerušit. Přemýšlím nad nějakým FIFO bufferem…

nemáte někdo srovnání těchto mcu? nějak to nemohu najít. dík

Všechny jsou stejný (maj stejnej datasheet), rozdíl je jen v pamětech.

dík. snad se mi podaří to nějsk vyřešit spolu s těmi čidly ds18b20

Podobnou věc jsem řešil s pic, potřeboval jsem teploty z několika teplotních čidel, ale hlavní procesor už by to nestíhal(obsluha tlačítek, LCD, výstupy) tak jsem k němu přidal ještě jeden malý, ten zpracovává a počítá teploty a pošle je po sériové lince, což je otázka chvíle.

ano, to je jedna z cest, kterou zvažuji.

To ze meranie trva sekundu predsa neznamena, ze tam mcu cuci na bobku a ten dallas z dialky pozoruje :slight_smile:

Neuc sa pisat soft co robi 100veci v jednej jedinej slucke. Je to cesta do pekiel. A obavam sa, ze prave tie “hotove” kniznice na obsluhu kde akej periferie vedu prave k tomuto.

  1. ako dlho trvajucich zakmitov sa obavas? Je 1ms prilis dlhy cas?

  2. druha vec je ako casto moze prichadzat k zmenam. Chces z toho spravit merac vst. frekvencie, alebo zakmity pridu iba cas od casu?

Ak zakmity trvaju dlhsie ako 1ms, potom si sprav prerusenie 1x za 1ms. V ramci prerusenia najprv odskenuj 20 bin vstupov a vyhodnot ich. Tym mas garantovany presny okamih ich skenu bez ohladu na to, ci cez 1-wire vysielas log. 0 alebo log.1. Potom odkomunikuj prave jeden bit s 18B20.
To sa v pohode stiha.
Nebal by som sa ist aj do 500us casov. Pre 20vstupov nizsie uz asi ani nie.
Pouzivat 32 preruseni je sice pekne, ale ak potrebujes osetrovat zakmity tlacitok, tak je to hovadina. Mat teoreticky vnorenych 32 preruseni do seba musi byt pre menej skuseneho pekna haluz pri odhalovani chyb typu pretecenie zasobnika :slight_smile:

Ak su vstupy naozaj rychle a nepotrebujes poznat fyzicky stav bin vstupu ale iba to ci prisiel impulz alebo nie, tak si na 8b paralelnu zbernicu zaves X obvodov 74HCT393. Jedna sa o dvojity CNT 0-15. Jeden svab Ti poriesi dva vstupy. Svabov mozes mat paralelne prepojenych hafo ak pouzijes medzi ne napr 74HC245-ky. Ak porebujes vediet aj aktualny stav bin vstupu, tak cez 8bit zbernicu si prenes iba najnizsie tri vystupy 393-ky + jej vstup a to cele 2x.

nemusim hovorit, ze plati stav, ktory 2x po sebe nacitas rovnaky. Tym mas istotu, ze si nenacital nieco prave v prechodovom stave. (Jasne, ze max. frekvencia zmeny musi byt nizsia ako je dvojnasobok skenovacieho casu)

Inak ak su tie bin vstupy rychle, tak je to celkom pekna uloha pre nejake CPLD.

Ak Ti vsak ide iba osetrenie zakmitov na kontaktoch , potom je najlepsie riesenie pouzit kondik paralelne s kontaktami a cele to skenovat tak 1x 5 az 10ms. AK potrebujes snimat stavy relatok, tak tie sa mechanicky prepnu v rozmedzi 3-20ms a stykace radovo v casoch 100ms. A to Ta zaujima iba vysledny stav, nie pocet preskokov pri prechode.

Celkovo by bolo vhodne, aby tazatel jasne popisal o co sa jedna a o ake casy sa asi ide. Inak sa velmi ale fakt velmi blbo radi :slight_smile:

Toho se netřeba bát. Je vždy 1 přerušení společné pro 8 vstupů (pin change interrupt) a samozřejmě lze překladači říci, že v tomto případě 3 přerušení bude obsluhovat 1 rutina.
Jaký způsob použít je závislé na povaze sledovaných signálů. Pokud bude změna jednou za čas, tak přerušení. V případě častých změn mnoha pinů bych vzorkoval v pravidelných časových intervalech jesli nemá být aplikace citlivá na hrany.

změna bude jednou za čas, málokdy současně na více pinech.

No ale uved uz konecne ako casto a zakmitov akej povahy sa obavas.

:arrow_right: administrator: příspěvek byl upraven
Předchozí příspěvky se necitují.

změna může být jednou za hodinu, jednou za den, jednou za minutu, jednou za sekundu, asi nejkratší čas mezi změnamy bych odhadoval na 0.5s. Zákmity - jde o to, o jaký vstup by šlo, například jeden ze vstupů je magnetický senzor a tam při spojení mohou vzniknout zákmity - netuším, jak “dlouhé” a kolik…