Vítejte na Elektro Bastlírn?
Nuke - Elektro Bastlirna
  Vytvořit účet Hlavní · Fórum · DDump · Profil · Zprávy · Hledat na fóru · Příspěvky na provoz EB

Vlákno na téma KORONAVIRUS - nutná registrace


Nuke - Elektro Bastlirna: Diskuzní fórum

 FAQFAQ   HledatHledat   Uživatelské skupinyUživatelské skupiny   ProfilProfil   Soukromé zprávySoukromé zprávy   PřihlášeníPřihlášení 

PIC 16f84 - doba stisku tlačitka

 
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů
Zobrazit předchozí téma :: Zobrazit následující téma  
Autor Zpráva
budsky



Založen: Aug 06, 2007
Příspěvky: 76

PříspěvekZaslal: ne květen 24 2015, 21:16    Předmět: PIC 16f84 - doba stisku tlačitka Citovat

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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovy WWW stránky
Zaky



Založen: Oct 30, 2010
Příspěvky: 6587
Bydliště: Praha

PříspěvekZaslal: ne květen 24 2015, 21:47    Předmět: Citovat

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á.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
Jirka525



Založen: May 22, 2013
Příspěvky: 325
Bydliště: Psáry JN79GW

PříspěvekZaslal: ne květen 24 2015, 22:33    Předmět: Citovat

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.

struct casovac {
int cas1;
char stav;
} ton1, ton2, tof1;


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;

pom_sig = signal;
pom_hrana = (pom_sig << 1);
if(((pom_hrana ^ data->stav) & 2) || (data->stav & 4) == 0) //je hrana signalu nebo jeste nezacalo casovani
{
data->cas1 = zpozdeni;
data->stav |= 4;
}
if (signal) //zapis minule hodnoty vstupu pro pristi prubeh
{
data->stav |= 2;
}
else
{
data->stav &= 0xfd;
}
if ((signal && (data->cas1 < 1)) || (data->stav & signal & 1))
{
data->stav |= 1;
}
else
{
data->stav &= 0xfe;
}
return data->stav & 1;
}

_________________
Jirka


Naposledy upravil Jirka525 dne po květen 25 2015, 8:07, celkově upraveno 2 krát.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
Zaky



Založen: Oct 30, 2010
Příspěvky: 6587
Bydliště: Praha

PříspěvekZaslal: po květen 25 2015, 6:51    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
monterjirka



Založen: Jun 14, 2003
Příspěvky: 2794
Bydliště: Blížejov

PříspěvekZaslal: po květen 25 2015, 9:01    Předmět: Citovat

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".
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
termit256



Založen: Dec 06, 2007
Příspěvky: 10335

PříspěvekZaslal: po květen 25 2015, 10:05    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
budsky



Založen: Aug 06, 2007
Příspěvky: 76

PříspěvekZaslal: po květen 25 2015, 10:50    Předmět: Citovat

Arduino určitě nepřipadá v uvahu..

citace:
Je nutne aby bezela hlavni smycka kdyz drzis tlacitko stiskle? Pokud ne, testuj az u uvolneni tlacitka


není nutné 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
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovy WWW stránky
hakamusai



Založen: Apr 17, 2007
Příspěvky: 943

PříspěvekZaslal: po květen 25 2015, 15:40    Předmět: Citovat

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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
mtajovsky



Založen: Sep 19, 2007
Příspěvky: 3697
Bydliště: Praha

PříspěvekZaslal: po květen 25 2015, 19:58    Předmět: Citovat

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ý. Smile 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.
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
hakamusai



Založen: Apr 17, 2007
Příspěvky: 943

PříspěvekZaslal: po květen 25 2015, 20:38    Předmět: Citovat

Pochopitelně čas timeru řádově v ms.Hlavně používat při programování selský rozum !
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu
budsky



Založen: Aug 06, 2007
Příspěvky: 76

PříspěvekZaslal: st květen 27 2015, 20:28    Předmět: Citovat

píšu to v mplab X ide a v něm v céčku
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovy WWW stránky
mtajovsky



Založen: Sep 19, 2007
Příspěvky: 3697
Bydliště: Praha

PříspěvekZaslal: st květen 27 2015, 20:58    Předmět: Citovat

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ž?
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail
budsky



Založen: Aug 06, 2007
Příspěvky: 76

PříspěvekZaslal: st květen 27 2015, 21:02    Předmět: Citovat

všem dekuji za rady a řešení bylo celkem jednoduché Smile
Návrat nahoru
Zobrazit informace o autorovi Odeslat soukromou zprávu Odeslat e-mail Zobrazit autorovy WWW stránky
Zobrazit příspěvky z předchozích:   
Přidat nové téma   Zaslat odpověď       Obsah fóra Diskuzní fórum Elektro Bastlírny -> Programování PIC, ATMEL, EEPROM a dalších obvodů Časy uváděny v GMT + 1 hodina
Strana 1 z 1

 
Přejdi na:  
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

Powered by phpBB © 2001, 2005 phpBB Group
Forums ©
Nuke - Elektro Bastlirna

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.


PHP-Nuke Copyright © 2005 by Francisco Burzi. This is free software, and you may redistribute it under the GPL. PHP-Nuke comes with absolutely no warranty, for details, see the license.
Čas potřebný ke zpracování stránky 0.14 sekund