Je možné v jednom skeči použiť dve preušenia?

Sekcia určená pre Arduino nadšencov

Moderátor: Moderátori

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa peterple » 03 Dec 2021, 18:26

boro napísal:
02 Dec 2021, 18:02
Zdravím,nerozumiem tomu ako je možné SW ošetriť zákmity tlačítka pri prerušení?
boro
Napríklad takto:

Kód: Vybrať všetko

#include <TimerOne.h>
#include <util/atomic.h>

#define TL_PIN 2
#define TL_PIN_AVR 2
#define DEBUG true

volatile uint8_t release;
uint16_t counter=0;
uint8_t ledVal=0;

void setup() {
  pinMode(TL_PIN, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  
  if (DEBUG){
    Serial.begin(9600);
    Serial.println("Startujem hodinky pre tlacitko");
  }
  Timer1.initialize(50000); //pretecenie kazdych 50ms
  Timer1.attachInterrupt(timer1Callback);  
}


void timer1Callback()
{
  static uint8_t lastPin=(1 << TL_PIN_AVR); //globalna privatna premenna 
  uint8_t pin;                    //aktualny stav na pinoch portu
  uint8_t changePin;              //piny ktore sa zmenili od posledneho prerusenia
  
                                  //precita stav pinov kde su tlacitka (teraz jedno)
  pin = PIND & (1 << TL_PIN_AVR); //Plati pre UNO!!! Nie som si isty ci vsetky dosky maju pin 2 na porte D
  
  changePin = lastPin ^ pin;      //vypocita pozicie kde sa hodnota oproti predoslemu stavu zmenila

//ak bola zmena stavu tlacitka a sucasne je pin v HIGH tak bolo uvolnenie stlacenia
  if (changePin && pin){          //pre jedno tlacitko sa to da zjednodusit takto
    release = 1 << TL_PIN_AVR;
  }
  if (DEBUG){
    Serial.print("timer - " ); Serial.print(lastPin);
    Serial.print(" , " ); Serial.print(pin);
    Serial.print(" , " ); Serial.print(changePin);
    Serial.print(" , " ); Serial.println(release);
  }
  lastPin=pin;                    //odpameta sa novy stav
}

void loop() {
  if (release){
    release=0;
    ledVal++;
    digitalWrite(13, ledVal & 1);
    if (DEBUG) {
      ATOMIC_BLOCK(ATOMIC_RESTORESTATE){
        Serial.print("pustil tlacitko " ); Serial.println(ledVal);
      }
    }
  }
}
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1146
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa Atlan » 03 Dec 2021, 19:01

A obsluha toho prerusenia od tlacitka je kde?
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa peterple » 03 Dec 2021, 19:49

Nikde. Zákmity rieši obsluha prerušenia časovača.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1146
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa Atlan » 04 Dec 2021, 07:14

Ale on sa pytal na riesenie tlacitka pripojeneho na interupt pin, proste vsetko sw okecat nejde.
Uz som takych navrhov videl. Vysledkom je dolepeny rc clen na dps.

A ako somnpisal soft ti nepomoze ked cez nejaky vstup ti to rozhace citac co stym vstupom nic nema, alebo nahodne zarusi pwm vystup. To sa potom dobre hlada.

Na druhej strane dnesne uP su na tom lepsie ale nikdy nevies.

Az ti zaiskrenie na stykaci sposobi kolaps uP, tak si SW upravu mozes vies co....
0

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa lucky62 » 04 Dec 2021, 08:50

Atlan napísal:
04 Dec 2021, 07:14
Az ti zaiskrenie na stykaci sposobi kolaps uP, tak si SW upravu mozes vies co....
Samozrejme kompletný návrh záleží od použitia.
Niekde potrebuješ aj ochrany proti napäťovým špičkám... :-)

Ale tu sa nerieši iskrenie stykača, ale zákmity tlačidla.
V mnohých prípadoch je SW riešenie úplne postačujúce.
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2563
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa maskrtnik01 » 04 Dec 2021, 10:50

Súhlasím. Až mi zaiskrenie stykača spôsobí crash celého mcu, nezachráni ma už nič.

Potom je nutné robiť opatrenia, aby stykač nemohol crashnúť mcu.
0

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1146
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa Atlan » 04 Dec 2021, 12:19

Kedze interupt pin sa softom osetrit neda tak tam treba rc clen.
0

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa lucky62 » 04 Dec 2021, 13:02

Atlan napísal:
04 Dec 2021, 12:19
Kedze interupt pin sa softom osetrit neda tak tam treba rc clen.
Ale dá sa...

Povedzme, že interrupt sa vyvolá nábežnou hranou signálu na pine.
V prerušení len zapíšeš čas (millis), kedy k prerušeniu došlo do nejakej premennej a v inej premennej nastavíš flag, že k prerušeniu došlo. Nič viac.

V hlavnej slučke budeš len kontrolovať, či je nastavený flag.
Ak áno skontroluješ, či od času v premennej uplynulo viac ako povedzme 10ms.
(Predpokladáme, že za tú dobu sa signál na pine ustálil.)
Ak áno, skontroluješ stav na pine - ak je HIGH, teda ok, tak vyvoláš potrebnú akciu a zmažeš flag.
Ak stav na pine nie je HIGH, zrejme došlo len k nejakému zákmitu, ktorý odignoruješ tým, že zmažeš flag. Toto môže nastať po uvoľnení tlačidla.

Čas 10ms môžeš skrátiť alebo predĺžiť podľa potreby (podľa kvality tlačítka).

EDIT: Napadlo ma, že opačná polarita bude bežnejší prípad - ak použijeme vnútorný pull-up odpor, teda v kľudovom stave je na pine HIGH, pri stlačení tlačidla LOW. Potom prerušenie sa musí vyvolať zostupnou hranou signálu v ustálenom stave kontrolujeme uroveň LOW...
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

maskrtnik01
Ultimate člen
Ultimate člen
Príspevky: 2563
Dátum registrácie: 20 Júl 2010, 00:00
Bydlisko: okolie KE
Vek: 27

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa maskrtnik01 » 04 Dec 2021, 13:17

Alebo ako to spravil peterple na začiatku tejto strany. V prerušení od timeru kontrolovať vstupný pin...a potom navyše ani nepotrebujeme, aby tento pin podporoval external interrupt.
0

boro
Stály člen
Stály člen
Príspevky: 118
Dátum registrácie: 10 Nov 2010, 00:00
Vek: 80

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa boro » 04 Dec 2021, 17:09

Ďakujem pekne za odpovede.Páči sa mi tá možnosť s Flagom.Už som to aj vyskúšal.Funguje to bezchybne.
Zdraví boro :applause:
0

Atlan
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1146
Dátum registrácie: 01 Feb 2008, 00:00
Bydlisko: Kosice okolie

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa Atlan » 05 Dec 2021, 08:20

Lenze tie vase veci neriesia to ze sa zbytocne vykonava prerusenie. Radsej si pripustite ze SW nieje vzdy riesenie.
0

Používateľov profilový obrázok
lucky62
Zaslúžilý člen
Zaslúžilý člen
Príspevky: 1151
Dátum registrácie: 14 Feb 2012, 20:16
Bydlisko: Liptovský Mikuláš, SK

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa lucky62 » 05 Dec 2021, 08:41

Atlan napísal:
05 Dec 2021, 08:20
Lenze tie vase veci neriesia to ze sa zbytocne vykonava prerusenie.
Otázka je, či to v danej aplikácii vadí. Ak áno, treba iné riešenie. Ak nie, potom je všetko ok.
Atlan napísal:
05 Dec 2021, 08:20
Radsej si pripustite ze SW nieje vzdy riesenie.
Vždy nie, ale častokrát áno.
A že to vždy nie je dobré riešenie, to som už pripustil predtým:
lucky62 napísal:
04 Dec 2021, 08:50
Samozrejme kompletný návrh záleží od použitia.
Niekde potrebuješ aj ochrany proti napäťovým špičkám...
0
....môj bazar....

...Nikdy sa nehádaj s blbcom...

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa peterple » 05 Dec 2021, 23:37

Niekoľko bodov k poslanému riešeniu:
  • obsluha sa robí v prerušení - nie od tlačítka, ale od časovača.
  • rutina má možnosť jednoducho expandovať až na 8 tlačítok. Netreba žiadne ďalšie premenné
  • hlavný program je extrémne jednoduchý, nakoľko mu prichádzajú hotové udalosti typu bolo uvolnené tlačítko. To dovoľuje implementovať obsluhu klávesnice kdekoľvek v hlavnom programe. Niečo ako getchar()
  • môžu sa použiť hocijaké piny. Vstupy INT0 a INT1 sú cennejšie a treba si ich šetriť na veci ako snímanie otáčok, príjem IR, hlásenie výpadku napájania. Než ich vyplýtvať na pripojenie tlačítok (málokedy si vystačíme iba s dvomi)
  • s EMI sa bojuje inými prostriedkami než so zákmitmi - filtrácia napájania, galvanické oddelenie vstupov a výstupov, tienenie zariadenia, feritové perly.
  • procesor žije v trochu inej časovej dimenzii. 50ms prerušenie je pre neho niečo ako keď vám pípne mobil raz za 10 dní že príšla SMS, alebo mail, alebo somarina z FB. Pri takte 16Mhz to znamená že 50ms je 800 tisíc krokov. (pre človeka je deň 86000sek)
  • kód rutiny prerušenia je extrémne krátky odhadujem ho tak na 10 inštrukcií. Teda ho vybaví tak za 2μs.
  • aplikácia zvyčajne potrebuje meranie času aj k iným účelom takže časovač tam aj tak beží. V arduine je to tak tiež. Funkcia millis žije z prerušovania každú 1ms a nikomu to nevadí.
  • nikoho nenútim používať navrhované riešenie ani sa nebránim jeho konštruktívnej kritike. Zatiaľ som si ale žiadnu rozumnú nevšimol.
1
Obrázok 1
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

Používateľov profilový obrázok
budvar10
Pokročilý člen
Pokročilý člen
Príspevky: 983
Dátum registrácie: 15 Dec 2014, 10:55
Bydlisko: Košice

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa budvar10 » 06 Dec 2021, 08:49

Na tlačidlá je možné použiť aj pin change prerušenie, nie INT0, 1. Tie sú dostupné v podstate pre všetky piny ATmegy. Tým nechcem povedať, že tvoje riešenie je zlé. Pozrel som si nejaký svoj starý program a mám to v podstate riešené podobne s opakovaním cca 47ms, ale tri zhodné stavy po sebe, t.j. do 100ms reakcia na tlačidlo. Ak vezmeme do úvahy reakčnú dobu človeka 0,2s, tak to je veľmi rýchle a réžia je naozaj veľmi malá.
Timer sa dá navyše použiť pre obsluhu viacerých opakujúcich sa kritických činností, stačí malá modifikácia.
0

romiadam
Ultimate člen
Ultimate člen
Príspevky: 4417
Dátum registrácie: 09 Apr 2008, 00:00
Bydlisko: Wicklow, Irsko
Vek: 47

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa romiadam » 06 Dec 2021, 15:08

ja to vidim tak, ze pokial sa neprogramuje riadiaca jednotka do raketoplanu, tak pri pouziti SW osetrenia zakmitov sa usetrili dve suciastky. MCU ma pull-up.
Ak sa chcete zbavit prebytocnych odporov a kondenzatorov, tak pouzite HW osetrenie zakmitov.
0
Prepáčte mi za diakritiku a preklepy - väčšinou píšem z mobilu a ENG klavesnice.
(výroky nemenovaného člena fóra:) ...základy elektrotechniky ovládam dokonale, tak napr. taký tyristor neviem ako presne funguje

boro
Stály člen
Stály člen
Príspevky: 118
Dátum registrácie: 10 Nov 2010, 00:00
Vek: 80

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa boro » 06 Dec 2021, 15:37

Ak sa jedná o veľmi jednoduchý program,kde sa prakticky len vykoná niekoľko procedúr na ošetrenie prerušenia,nie je treba prerušenie ani použiť a len sledovať premenný pin v krátkych intervaloch.Mne sa,myslím si,podarilo k mojej plnej spokojnosti, ošetriť pomocou kombinácie HW a SW zákmity pri prerušení.
HW ošetrenie som použil podľa "mclareniak" a SW ošetrenie je možné vidieť v priloženom skeči na odskúšanie zakmitávania.Funguje to prakticky na 100%.Ak som použil len SW,alebo len HW ošetrenie,tak to zakmitávalo.
boro

Kód: Vybrať všetko

[code]

     bool stav;
    void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  pinMode(2,INPUT_PULLUP);
  pinMode(13,OUTPUT);
  attachInterrupt(digitalPinToInterrupt(2),detekcia,CHANGE);

}

void loop() {
  // put your main code here, to run repeatedly:
  digitalWrite(13,HIGH);
  delay(1000);
  digitalWrite(13,LOW);
  delay(1000);
   } 
   void detekcia(){
  static unsigned long last_interrupt_time=0;
  unsigned long interrupt_time=millis();
  if(interrupt_time-last_interrupt_time>300){
     
     stav=digitalRead(2);
      if (stav==HIGH){
        Serial.println("ROZOPNUTE");}
        else Serial.println("ZOPNUTE");
      }
      last_interrupt_time=interrupt_time;
 
    }
  
     
    
    
    
[/code]
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa peterple » 06 Dec 2021, 19:35

SW ošetrenie ktoré si vymyslel je málo robustné. A keďže nefunguje HW samo o sebe hovorí, že ani to asi nie je také 100% ako to tu niektorý tvrdia. Schéma je podľa mňa v poriadku. Prečo to nefunguje neviem posúdiť kedže som to v živote nepoužil.

Prečo je sw riešenie špatne? Podme pekne postupne.
  1. Príde prvá hrana pri stačení tlačítka. Test na čas bude určite viac než 300 tak to vojde do prvého if
  2. teraz sa číta stav pinu tlačítka. Priamočiara úvaha je taká že ak je stav jedna tak to bola nábežná hrana (RISING) a teda tlačítko sa rozoplo. Ak tam je nula tak tam bola dobežná hrana (FALLING) a teda tlačítko sa stislo.
    Lenže volanie millis a aj digitalRead trvá dosť dlhú dobu odhadnime to na 10μs. Čo ak už v tom čase prišiel prvý zákmit? No a ako vieme po svete chodí čert (nielen dnes) a snaží sa urobiť čo najväčšiu škodu. A je rýchly a neunavný. Takže to určite niekedy nastane. Ja som skúsil a nastalo
  3. Nasleduje debugovací výpis na seriák ktorý trvá "šialene" dlho. Jeden znak sa posiela asi tak 1ms. takže to trvá okolo 8ms. Ale to teraz neriešme, ten tam v finále nebude.
  4. Potom si to zapamätá nový čas stisnutia.
  5. Pri ďalšom prerušení ktoré bude rýchlejšie ako 300ms sa to všetko bude ignorovať. To ale nastať môže lebo som schopný stlačiť tlačítko rýchlejšie ako 0,3 sekundy.
  6. tak som 300 zmenil na 100 a debounce už funguje. Na každé stisnutie už dostanem dva výpisy. Lenže dosť často sú chybne určené. Tu je príklad

    Kód: Vybrať všetko

    ROZOPNUTE	stlacenie 1 chyba opacne vyhodnotenie
    ZOPNUTE
    ZOPNUTE		stlacenie 2 OK
    ROZOPNUTE
    ZOPNUTE		stlacenie 3 OK
    ROZOPNUTE
    ROZOPNUTE	stlacenie 4 chyba opacne vyhodnotenie
    ZOPNUTE
    ZOPNUTE		stlacenie 5 OK
    ROZOPNUTE
    ZOPNUTE		stlacenie 6 chyba obe zopnuté
    ZOPNUTE
    
    Je vidno že čert sa snaží ako divý. Tak sa nečudujem že si to musel zatlmiť kondenzátorom.
No a teraz sa ukážte a vyriešte to nejako inak ako som to riešil ja. Som na to hodne zvedavý.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

boro
Stály člen
Stály člen
Príspevky: 118
Dátum registrácie: 10 Nov 2010, 00:00
Vek: 80

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa boro » 07 Dec 2021, 14:43

Ak je interval medzi stlačením tlačítka>300ms,tak to vyzerá takto:
[liZOPNUTE
ROZOPNUTE
ZOPNUTE
ROZOPNUTE
ZOPNUTE
ROZOPNUTE
ZOPNUTE
ROZOPNUTE
ZOPNUTE
ROZOPNUTE
ZOPNUTE
ROZOPNUTE
ZOPNUTE
ROZOPNUTE
st][/list]
boro
0

peterple
Ultimate člen
Ultimate člen
Príspevky: 2328
Dátum registrácie: 25 Jún 2013, 21:06
Bydlisko: Krajné
Vek: 57
Kontaktovať používateľa:

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa peterple » 07 Dec 2021, 19:57

To je s kondenzátorom alebo bez? Ak s kondenzátorom ako to vyzerá bez kondezátora? 300ms je na mňa moc dlhý čas nestíha to sledovať že tlačítko púšťam. Preto som to skrátil na 100ms.
Na test som použil najhoršie tlačítko čo som našiel. Z nejakej starej stolovej kalkulačky. Len dva pliešky. Jeden pevný druhý pohyblivý. A samozrejme pripojené bez kondenzátora.
0
Ukáž múdremu chybu a on sa ti poďakuje. Ukáž chybu hlupákovi a on sa urazí.

boro
Stály člen
Stály člen
Príspevky: 118
Dátum registrácie: 10 Nov 2010, 00:00
Vek: 80

Re: Je možné v jednom skeči použiť dve preušenia?

Príspevok od používateľa boro » 07 Dec 2021, 21:15

Ako som už 6.12.napísal je to s kondenzátorom.Bez kondenzátora dochádza k viacnásobným prerušeniam,resp.chybnému výpisu stavu tlačítka.Samotný kondenzátor tiež nestačí.Musí to byť ošetrené HW aj SW.Vyskúšam ešte skrátenie oneskorenia.
boro
0

Napísať odpoveď
  • Podobné témy
    Odpovedí
    Zobrazení
    Posledný príspevok