Ošetření tlačítka v přerušení
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
-
- Příspěvky: 67
- Registrován: 29 led 2020, 20:15
- Reputation: 0
Re: Ošetření tlačítka v přerušení
Dal jsem do loopu zpoždění delay(100) a stejně to nepomohlo. Z programu vyplývá, že zákmity by neměly mít na funkci vliv.
Když ihned vypnu zpoždění v obsluze přerušení, tak UNO je dostatečně rychlé na to, aby eliminovalo jakékoliv mechanické zákmity.
Nechci zbytečně přidávat další elektronické součástky, protože vysílač bude ve finální verzi napájen z baterií.
Je divné, že nespuštění přerušení je silně nepravidelné. Někdy se projeví hned, někdy až třeba po 10 aktivacích.
Zkusím ještě magnetický kontakt i s doporučeným RS. Pak bude jasné, zda jde o mechanické zákmity či nikoli.
Když ihned vypnu zpoždění v obsluze přerušení, tak UNO je dostatečně rychlé na to, aby eliminovalo jakékoliv mechanické zákmity.
Nechci zbytečně přidávat další elektronické součástky, protože vysílač bude ve finální verzi napájen z baterií.
Je divné, že nespuštění přerušení je silně nepravidelné. Někdy se projeví hned, někdy až třeba po 10 aktivacích.
Zkusím ještě magnetický kontakt i s doporučeným RS. Pak bude jasné, zda jde o mechanické zákmity či nikoli.
Re: Ošetření tlačítka v přerušení
Interupt bych dal do módu LOW. Resistorem máme nastavenou úroveň vstupu pořád v 1 a tlačítkem dáváme do 0
Opětovné zapnutí přerušení bych vyjmul z hlavní smyčky loop() a vložil na konec do if PreruseniBylo == true. Není důvod neustále nastavovat přerušení v loop()
Opětovné zapnutí přerušení bych vyjmul z hlavní smyčky loop() a vložil na konec do if PreruseniBylo == true. Není důvod neustále nastavovat přerušení v loop()
-
- Příspěvky: 67
- Registrován: 29 led 2020, 20:15
- Reputation: 0
Re: Ošetření tlačítka v přerušení
Potřebuji rozlišit, zda tlačítko je sepnuté či rozepnuté, proto musím použít CHANGE.
Když vyjmu přerušení z hlavní smyčky, přestane přerušení fungovat.
Pro spínání jsem použil RS obvod, zákmity se odstranily.
Neodstranil se však problém se spolehlivostí, po několika sepnutí (5, 10 - dle rychlosti spínání) se vynechá jeden stav cyklu zapnuto/vypnuto
Když vyjmu přerušení z hlavní smyčky, přestane přerušení fungovat.
Pro spínání jsem použil RS obvod, zákmity se odstranily.
Neodstranil se však problém se spolehlivostí, po několika sepnutí (5, 10 - dle rychlosti spínání) se vynechá jeden stav cyklu zapnuto/vypnuto
- pavel1tu
- Příspěvky: 2054
- Registrován: 26 říj 2017, 08:28
- Reputation: 0
- Bydliště: Trutnov
- Kontaktovat uživatele:
Re: Ošetření tlačítka v přerušení
zruš ty detach interupt a atachinterupt nech jen v SETUP
ošetři si vstup tlačítka RC článkem - na internetu toho je hodně
od přerušení bych pouštěl jen danou funkci, která vykoná co potřebuješ
nechápu podmínky - jestli bylo přerušení - je to zbytečné skákat sem a tam
to že bude funkce od přerušení vykonávána déle, vyfiltruje teoreticky zákmity
to že se to někdy nespustí - opravdu to přišlo až na vstup Arduina ?
do toho void od přerušení dej
LOOP bude holt prázdný
PS: to CHANGE je dost problém, pokud proběhne opravdu rychle změna 1-0-1 třeba
ošetři si vstup tlačítka RC článkem - na internetu toho je hodně
od přerušení bych pouštěl jen danou funkci, která vykoná co potřebuješ
nechápu podmínky - jestli bylo přerušení - je to zbytečné skákat sem a tam
to že bude funkce od přerušení vykonávána déle, vyfiltruje teoreticky zákmity
to že se to někdy nespustí - opravdu to přišlo až na vstup Arduina ?
do toho void od přerušení dej
LOOP bude holt prázdný
Kód: Vybrat vše
void TercNasazenShozen()
{
if (digitalRead(TERC)==1)
{ //uint8_t data[] = "Terč shozen";
// rf22.send(data, sizeof(data));
Serial.println("Terč shozen");
}
if (digitalRead(TERC)==0)
{ //uint8_t data[] = "Terč nasazen";
// rf22.send(data, sizeof(data));
Serial.println("Terč nasazen");
}
}
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Pavel1TU
"Správně napsaný kod lze číst jako knihu"
Re: Ošetření tlačítka v přerušení
Nebo, pokud tohle blbne, použít třeba timer 2 a periodicky, na pozadí, si stav tlačítka vzorkovat a udělat si vlastní proměnnou, nebo počítadlo stisků tlačítka. To bude opravdu 100procentní.
-
- Příspěvky: 67
- Registrován: 29 led 2020, 20:15
- Reputation: 0
Re: Ošetření tlačítka v přerušení
Nemám problém se zákmity, ty jsem celkem spolehlivě odstranil klopným obvodem RS z obvodů NAND,funguje velmi dobře.
Měřil jsem vstup Arduina, tam 1 a 0 přichází.
Frekvence spínání taky nemá moc vliv na funkci, když přepínám v intervalech cca 1 až 5 vteřin, tak po určitém počtu překlopení (pokaždé různém) stejně dojde k vynechání. Což by jakékoliv zpoždění asi zřejmě neodstranilo.
V těchto testech mi zatím stačí zobrazovat na monitoru: Terč nasazen / shozen. Ve finále bude přerušení měřit čas od výstřelu startovací pistole po shození terče. Teď však potřebuji vyřešit hlavně spolehlivost, což se jaksi moc nedaří.
Ještě zkusím vyměnit Arduino, ale je to záhada.
Pokud máte někdo jakýkoliv nápad, popř. krátký testovací prográmek na vyzkoušení, díky.
Měřil jsem vstup Arduina, tam 1 a 0 přichází.
Frekvence spínání taky nemá moc vliv na funkci, když přepínám v intervalech cca 1 až 5 vteřin, tak po určitém počtu překlopení (pokaždé různém) stejně dojde k vynechání. Což by jakékoliv zpoždění asi zřejmě neodstranilo.
V těchto testech mi zatím stačí zobrazovat na monitoru: Terč nasazen / shozen. Ve finále bude přerušení měřit čas od výstřelu startovací pistole po shození terče. Teď však potřebuji vyřešit hlavně spolehlivost, což se jaksi moc nedaří.
Ještě zkusím vyměnit Arduino, ale je to záhada.
Pokud máte někdo jakýkoliv nápad, popř. krátký testovací prográmek na vyzkoušení, díky.
Re: Ošetření tlačítka v přerušení
Jak rychlá má být reakce na tlačítko a jak dlouho bude zhruba zmáčknuté a nezmáčknuté? Večer bych ti poslal nějaký prográmek, pokud budu mít nějaké volno.
-
- Příspěvky: 67
- Registrován: 29 led 2020, 20:15
- Reputation: 0
Re: Ošetření tlačítka v přerušení
V podstatě jde o stopky. Měří se čas od výstřelu ze startovací pistole po sražení terče. Takže tlačítko ( bude magnet.kontakt) se rozepne- reakce do 10 ms.(co nejrychlejší). Stav sepnutí - terč je nasazen, doba není kritická (s).
Re: Ošetření tlačítka v přerušení
A není tam ten interrupt úplně zbytečný?
V tom kódu níže, se bude na shození reagovat téměř okamžitě. Při nahazování se dá zvolit doba, po kterou nebude reagovat na žádné změny tlačítka. To je dobré na ošetření různých stavů při manipulaci s terčem při jeho nasazování.
V tom kódu níže, se bude na shození reagovat téměř okamžitě. Při nahazování se dá zvolit doba, po kterou nebude reagovat na žádné změny tlačítka. To je dobré na ošetření různých stavů při manipulaci s terčem při jeho nasazování.
Kód: Vybrat vše
#include <SPI.h>
//#include <RH_RF22.h>
byte TERC = 4;
const byte SHOZENO=HIGH;
const byte NAHOZENO=LOW;
bool TercShozen=false;
void setup() {
pinMode(TERC,INPUT_PULLUP);
}
void loop() {
while(true){
if((digitalRead(TERC)==SHOZENO) && (!TercShozen)){
TercShozen=true;
// tady udelam co potrebuji po shozeni udelat
}
if((digitalRead(TERC)==NAHOZENO) && TercShozen){
//tady udelam co potrebuji po nahozeni terce
delay(500); //po nahozeni terce nebudu po tuhle dobu reagovat na nic co se bude s tercen dit (osetreni proti nestabilite pri manipulaci)
TercShozen=false;
}
}
}
Re: Ošetření tlačítka v přerušení
Jak jsem to napsal, tak to předpokládá počáteční stav nahozen. Ještě by to šlo vylepšit takhle
Kód: Vybrat vše
void setup() {
pinMode(TERC,INPUT_PULLUP);
if(digitalRead(TERC)==SHOZENO){
TercShozen=true;
}
}
Kdo je online
Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 4 hosti