AVR - jak udělat v Céčku reakci na tlačítko ?

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
odie
Příspěvky: 39
Registrován: 14 bře 2010, 00:00

AVR - jak udělat v Céčku reakci na tlačítko ?

#1 Příspěvek 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);
}
}
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#2 Příspěvek od Andrea »

Stav na portu zjistíš z PINC nikoliv z PORTC.
Uživatelský avatar
odie
Příspěvky: 39
Registrován: 14 bře 2010, 00:00

#3 Příspěvek od odie »

nojo, už to funguje, díky
Uživatelský avatar
odie
Příspěvky: 39
Registrován: 14 bře 2010, 00:00

#4 Příspěvek 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

}
}
Andrea
Příspěvky: 9340
Registrován: 07 zář 2007, 00:00

#5 Příspěvek od Andrea »

No musíš ošetřit zákmity u toho tlačítka, už se to tu probíralo mnohokrát.
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#6 Příspěvek 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ě.
Uživatelský avatar
Atlan
Příspěvky: 4514
Registrován: 10 kvě 2004, 00:00
Bydliště: Košice

#7 Příspěvek 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.....
Uživatelský avatar
mtajovsky
Příspěvky: 3728
Registrován: 19 zář 2007, 00:00
Bydliště: Praha

#8 Příspěvek 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í.
Uživatelský avatar
odie
Příspěvky: 39
Registrován: 14 bře 2010, 00:00

#9 Příspěvek 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
Uživatelský avatar
odie
Příspěvky: 39
Registrován: 14 bře 2010, 00:00

#10 Příspěvek 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
}
Uživatelský avatar
odie
Příspěvky: 39
Registrován: 14 bře 2010, 00:00

#11 Příspěvek od odie »

tak už jsem to ošetřil - chtělo to tam dát trochu více podmínek za sebe
Uživatelský avatar
MiloPS3
Příspěvky: 279
Registrován: 07 srp 2010, 00:00

#12 Příspěvek od MiloPS3 »

skus dat kondik paralerne ke tlacitku ,10- 100nF
Uživatelský avatar
ludvaludva
Příspěvky: 5
Registrován: 03 bře 2011, 00:00

#13 Příspěvek od ludvaludva »

MiloPS3 píše:skus dat kondik paralerne ke tlacitku ,10- 100nF


skvělá práce, díky
Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“