Zaslal: ne květen 24 2015, 21:16 Předmět: PIC 16f84 - doba stisku tlačitka
Zdravím,potřeboval bych poradit:
řečim konstukci s danýám picem
tlačitko je na pinu RA0
výstup je RB0
je to děláne v Cečku
moje část programu:
citace:
int main(int argc, char** argv) {
TRISA0 = 1; //RA0 jako vstup
TRISB0 = 0; //RB0 jako výstup
RB0 = 0; //výchozí stav
do
{
if(RA0 == 1)
{
__delay_ms(100);
if(RA0 == 1)
{
RB0 = 1; //LED ON
__delay_ms(10000); // aktivní výstup 10sekund
RB0 = 0; //LED OFF
}
}
}while(1);
}
a jde mi o to že bch tam potřeboval dodělat aby se sepnul výstup jen při dlouhém stisku tlačitka cca delším stisku jak 10s.
pokud by byl stisk kratší tak by se nic nestalo.
a nějak na to nemohu v cěcku přijít poradil by někdo prosím
Založen: Oct 30, 2010 Příspěvky: 6661 Bydliště: Praha
Zaslal: ne květen 24 2015, 21:47 Předmět:
Třeba tak, že budeš točit smyčku 1x za sekundu (spíš aspoň 10x za sekundu) a inkrementovat proměnou dokud bude stiské tlačítko, až dojde k puštění tlačítka, smyčka se ukončí a porovná se, do kolika se napočítala ona proměnná.
Založen: May 22, 2013 Příspěvky: 325 Bydliště: Psáry JN79GW
Zaslal: ne květen 24 2015, 22:33 Předmět:
Já jsem si pro tento případ udělal funkci t_on (zpožděné zapnutí). Výhodou je, že program nečeká na uplynutí 10 s ale obsluhuje ostatní periferie a po uplynutí 10 s zapne výstup.
Jestli se ti to povede optimalizovat, napiš, rád si vylepším svůj SW park.
ISR(TIMER0_COMPA_vect) //Preruseni od casovace
{
ton1.cas1--;
ton2.cas1--;
tof1.cas1--;
}
/*Zpozdene zapnuti
vstup: signal - signal, ktery se zpozdene zapina
casovac.stav
B0 - vystupni signal
B1 - minuly stav vstupu signal
B2 - casovac bezi
casovac.cas1 - casovac aktualni cas do zapnuti vystupu
zpozdeni - nastavene zpozdeni v 1 ms
vystup: zpozdeny signal
*/
char t_on(char signal, int zpozdeni, struct casovac *data)
{
char pom_hrana, pom_sig;
Založen: Oct 30, 2010 Příspěvky: 6661 Bydliště: Praha
Zaslal: po květen 25 2015, 6:51 Předmět:
Moje verze se dá slušně (tedy, aby se nečekalo ve smyčce, ale MCU mohl provádět další kód) udělat tak, že se timerem generuje přerušení řekněme každých 10 nebo 100 ms, a v přerušení od timeru se nahazuje příznak. V hlavní smyčce se testuje, zda je příznak nahozen, tím se dá časovat v kódu běžícím jinak plnou rychlostí MCU. Tento základní interval pak není problém programově dále dělit na pomalejší intervaly. Kód pak samozřejmě nesmí nikde na nic čekal, musí být maximálně "propustný", aby se bezpečně stihl protočit rychleji, než je základní interval timeru. Je to obecně platná věc. Takový kód je vždu trochu složitější, než, když se čeká ve smyčkách, ale pokud má být kdykoli zaručená odezva, není jiné cesty.
Založen: Jun 14, 2003 Příspěvky: 2801 Bydliště: Blížejov
Zaslal: po květen 25 2015, 9:01 Předmět:
Musí to být s PICem?
Kdybych to řešil s Arduinem, počkal bych si na stisk tlačítka,
odečetl hodnotu millis, hlídal jak mě millis roste a jestli je pořád stisknuto.
Pokud vydrželo stisknuto tak dlouho, že by se millis zvětšilo o 10000, bylo by "splněno".
Je nutne aby bezela hlavni smycka kdyz drzis tlacitko stiskle? Pokud ne, testuj az u uvolneni tlacitka. Pri stisku spust cekaci smycku 10s ve ktere prubezne testuj uvolneni tlacitka. Pokud dojede na konec, spust danou akci. Pokud dojde k uvolneni driv, udelej to se ma provest pri kratkem stisku.
Usetris si tak timer pro jine pouziti.
Pokud mas ovsem timer volny, neni co resit. Pokud je tlacitko stiskle, v obsluze preruseni vzdy inkrementuj nejakou hodnotu, az dosahne poctu odpovidajici 10 sec, nastav nejaky priznak na jehoz zaklade pak pohodlne v hlavni smycce provedes potrebnou akci.
V čem to píšeš ?
Z mýho úhlu pohledu se to dá řešit několika způsoby (podle situace).Dá se to řešit celý timerem -při přerušení timeru se testuje log. hodnota požadovanýho vstupu.Pokud je tlačítko stisknuto,inkrementuje se couner(globální proměnná).Pokud je log. 0 nastaví se counter na nulu.Pokud má counter hodnotu požadovanou vykoná se požadovaný kód (nastavení výstupu).Naposled je třeba testovat velikost counteru a případně dekrementovat.
Jde to řešit více způsoby.
Založen: Sep 19, 2007 Příspěvky: 3698 Bydliště: Praha
Zaslal: po květen 25 2015, 19:58 Předmět:
Tohle není vždy spolehlivé a záleží na periodě časovače. Pokud například bude časovač 1 s, a v době mezi vypršením časovače se tlačítko krátce uvolní a opět stiskne, mělo by to znamenat restart intervalu 10 s. Popsaným způsobem se to ale může promeškat.
Osobně bych to řešil "dvouvrstvě". Na "úrovni HW" v hlavní smyčce testovat změnu tlačítek s ošetřením zákmitů. Třeba časovačem 5 ms, v nejhorším případě čekací smyčkou, ale na to jsem dost alergický. Na "logické" úrovni při ověřeném stisku tlačítka pak nahodit časovač 10s (nejspíš softwarový), při ověřeném uvolnění tlačítka jej shodit. Vyhodnocení, že tlačítko bylo stisknuto nepřetržitě 10 s je dáno vypršením časovače 10 s.
Založen: Sep 19, 2007 Příspěvky: 3698 Bydliště: Praha
Zaslal: st květen 27 2015, 20:58 Předmět:
budsky napsal(a):
... jde jen o to vyhodnotiti tlačítko jestli bylo stisklé oněch cca 10 vteřin a pokud ano tak sepnout jen výstup nic víc
No, ale předpokládám, že to není jediná akce celé aplikace. Musí se to řešit tak, aby takových a podobných věcí mohlo být z hlediska architektury řešení neomezeně mnoho. Omezení musí být jen výkonem procesoru a dostupnou pamětí. Pokud by to byla skutečně jediná úloha, pak není třeba MCU, kromě toho by periodické mačkání tlačítka zablokovalo MCU na neomezeně dlouhou dobu v čekání na těch 10 s. To asi nebude žádoucí, což?
Nemůžete odesílat nové téma do tohoto fóra. Nemůžete odpovídat na témata v tomto fóru. Nemůžete upravovat své příspěvky v tomto fóru. Nemůžete mazat své příspěvky v tomto fóru. Nemůžete hlasovat v tomto fóru. Nemůžete připojovat soubory k příspěvkům Můžete stahovat a prohlížet přiložené soubory
Informace na portálu Elektro bastlírny jsou prezentovány za účelem vzdělání čtenářů a rozšíření zájmu o elektroniku. Autoři článků na serveru neberou žádnou zodpovědnost za škody vzniklé těmito zapojeními. Rovněž neberou žádnou odpovědnost za případnou újmu na zdraví vzniklou úrazem elektrickým proudem. Autoři a správci těchto stránek nepřejímají záruku za správnost zveřejněných materiálů. Předkládané informace a zapojení jsou zveřejněny bez ohledu na případné patenty třetích osob. Nároky na odškodnění na základě změn, chyb nebo vynechání jsou zásadně vyloučeny. Všechny registrované nebo jiné obchodní známky zde použité jsou majetkem jejich vlastníků. Uvedením nejsou zpochybněna z toho vyplývající vlastnická práva. Použití konstrukcí v rozporu se zákonem je přísně zakázáno. Vzhledem k tomu, že původ předkládaných materiálů nelze žádným způsobem dohledat, nelze je použít pro komerční účely! Tento nekomerční server nemá z uvedených zapojení či konstrukcí žádný zisk. Nezodpovídáme za pravost předkládaných materiálů třetími osobami a jejich původ. V případě, že zjistíte porušení autorského práva či jiné nesrovnalosti, kontaktujte administrátory na diskuzním fóru EB.