Ošetření tlačítka v přerušení

Wiring, C++, C, Java, ...
Pravidla fóra
Toto subfórum slouží k řešení obecných otázek kolem programování (konstrukce, knihovny, alokace paměti, ...)
Dene Elanik
Příspěvky: 67
Registrován: 29 led 2020, 20:15
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od Dene Elanik » 05 bře 2020, 21:26

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.

RomanB
Příspěvky: 90
Registrován: 04 zář 2017, 14:28
Reputation: 0
Bydliště: Havířov

Re: Ošetření tlačítka v přerušení

Příspěvek od RomanB » 05 bře 2020, 21:38

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()

Dene Elanik
Příspěvky: 67
Registrován: 29 led 2020, 20:15
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od Dene Elanik » 12 bře 2020, 08:34

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

Uživatelský avatar
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í

Příspěvek od pavel1tu » 12 bře 2020, 09:15

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ý

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");
    }

}
PS: to CHANGE je dost problém, pokud proběhne opravdu rychle změna 1-0-1 třeba
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od ondraN » 12 bře 2020, 11:14

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í.

Dene Elanik
Příspěvky: 67
Registrován: 29 led 2020, 20:15
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od Dene Elanik » 12 bře 2020, 11:34

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.

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od ondraN » 12 bře 2020, 14:07

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.

Dene Elanik
Příspěvky: 67
Registrován: 29 led 2020, 20:15
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od Dene Elanik » 14 bře 2020, 07:10

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).

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od ondraN » 14 bře 2020, 08:59

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í.

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;
    }
  } 
}

ondraN
Příspěvky: 932
Registrován: 08 srp 2019, 20:01
Reputation: 0

Re: Ošetření tlačítka v přerušení

Příspěvek od ondraN » 14 bře 2020, 09:54

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;
  }
}

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 4 hosti