Stránka 1 z 1
AVR - jak udělat v Céčku reakci na tlačítko ?
Napsal: 10 úno 2011, 13:26
od odie
Rád bych v C naprogramoval toto (je to sice jednoduché, ale já jsem začátečník takže mi to nějak nejde): zmáčknu tlačítko a zvětší se mi hodnota proměnné o jedničku, při držení tlačítka se bude zvětšovat i dále (třeba i rychleji - po deseti). Stále mi to nejde. Postupuji správně ? Díky za pomoc.
Tlačítko je připojeno k PC0 - pokud není zmáčknuto, je na PC0 zem (spojeno přes odpor), pokud je tlačítko zmáčknuto, je na PC0 +5V.
Kód: Vybrat vše
int t=5;
DDRC = 0x00; // port C bude vstup
while(1) {
if (PORTC == 1) //pokud je zmáčknuté
{t++;
_delay_ms(500);
}
}
Napsal: 10 úno 2011, 13:28
od Andrea
Stav na portu zjistíš z PINC nikoliv z PORTC.
Napsal: 10 úno 2011, 13:31
od odie
nojo, už to funguje, díky
Napsal: 10 úno 2011, 14:21
od odie
teďko ještě zkouším udělat tlačítko dvourychlostně - pokud ťuknu, zvětší se o 1, pokud držím, zvětšuje se po 10.
Takto funguje, ale problém je když držím a pak pustím tlačítko - tak se někdy ještě přičte 1, což nechci. Jde to nějak upravit ?
Kód: Vybrat vše
while(1){
if (PINC == 0b0000001)
{ //pokud se ťukne, přičte se 1
t=t+1;
_delay_ms(300);
if (PINC == 0b0000001)
t=t+9; // pokud se aspoň 300ms přidrží, přičte se navíc 9 = celkem 10
funkce(t); //provede se něco s proměnnou t
_delay_ms(300); //prodleva a celé se opakuje
}
}
Napsal: 10 úno 2011, 14:24
od Andrea
No musíš ošetřit zákmity u toho tlačítka, už se to tu probíralo mnohokrát.
Napsal: 10 úno 2011, 15:30
od mtajovsky
No, dobře, ale v konečném řešení to takhle nedělejte. Takhle procesor skoro pořád jen čeká v _delay_ms() nic dalšího užitečného už nemá kde dělat. Stav tlačítka raději čtěte v době odvozené od přerušení časovače buď přímo v přerušovací rutině nebo odovozeně přes nějaké příznaky vypršení času v hlavní smyčce programu (což si myslím, že je lepší z důvodu kritických sekcí). Andrea už o tom psala v jiném vlákně.
Napsal: 10 úno 2011, 18:32
od Atlan
v niektorych situacia to staci aj takto.... ved ked nie je stlacnee tlacidlo tak v tom delay nebeha... a ked je vecinou sa aj tak vykona nejaka funkcia a potom zivot ide dalej.....
Napsal: 10 úno 2011, 18:59
od mtajovsky
Atlan píše:v niektorych situacia to staci aj takto.... ved ked nie je stlacnee tlacidlo tak v tom delay nebeha... a ked je vecinou sa aj tak vykona nejaka funkcia a potom zivot ide dalej.....
No OK, ale po dobu držení tlačítka je všechno ostatní na popředí každou rundu na 600 ms zastavené, tohle jen pro jednoduché aplikace. Kdyby se mělo reagovat na víc událostí z okolního světa, tak se takhle dostáváme do velikých těžkostí.
Napsal: 10 úno 2011, 20:35
od odie
jo já to nejdříve dělam jednodušeji aby to nějak fungovalo a pak to nějak lépe předělám
Napsal: 11 úno 2011, 14:36
od odie
tak jsem tu toho o zákmitech moc nenašel, ale stvořil jsem toto:
Funguje to, ale občas když se dvakrát šikovně po sobě zmáčkne krátce, tak to přičte rovnou 10 místo dvakrát 1, stejně tak zhruba při každém desátém pokusu to po delším držením a přičítáním po desíti nakonec přičte 1. Jde to ošetřit nějak lépe ?
Díky
Kód: Vybrat vše
if (PINC == 0b0000001) // pokud je stisknuto, počkám 90ms
{
_delay_ms(90);
if (PINC == 0b0000001) // pokud je stale stisknuto prictu 1 a pockam 150ms
{
t=t+1;
_delay_ms(150);
if (PINC == 0b0000001) //pokud je stale stisknuto prictu 9 = 10 celkem
{
t=t+9;
}
funkce(t);
_delay_ms(150); //na zaver pockam 150ms, poté to běží opět od začátku
}
Napsal: 11 úno 2011, 17:36
od odie
tak už jsem to ošetřil - chtělo to tam dát trochu více podmínek za sebe
Napsal: 11 úno 2011, 19:25
od MiloPS3
skus dat kondik paralerne ke tlacitku ,10- 100nF
Napsal: 03 bře 2011, 16:47
od ludvaludva
MiloPS3 píše:skus dat kondik paralerne ke tlacitku ,10- 100nF
skvělá práce, díky