www.elektronik.si Seznam forumov www.elektronik.si
Forum o elektrotehniki in računalništvu
 
 PomočPomoč  IščiIšči  Seznam članovSeznam članov  SkupineSkupine  StatisticsStatistika  AlbumAlbum  DatotekeFilemanager DokumentacijaDocDB LinksPovezave   Registriraj seRegistriraj se 
  PravilaPravila  LinksBolha  PriponkePriponke  KoledarKoledar  ZapiskiZapiski Tvoj profilTvoj profil Prijava za pregled zasebnih sporočilPrijava za pregled zasebnih sporočil PrijavaPrijava 

Reakcijski čas

 
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija
Poglej prejšnjo temo :: Poglej naslednjo temo  
Avtor Sporočilo
programming
Član
Član



Pridružen-a: Sre 09 Jan 2013 19:58
Prispevkov: 33
Aktiv.: 0.24

PrispevekObjavljeno: Ned Feb 28, 2021 5:52 pm    Naslov sporočila:  Reakcijski čas Odgovori s citatom

Zdravo, napisal sem program za merjenje reakcijskega časa v milisekundah in sicer s pritiskom na tipko, ko se prižge LED lučka. Vse deluje brez problema. Sedaj pa bi želel, da bi merilo tudi morebitni prehitri pritisk tipke preden se prižge LED lučka. Poskusil sem vse možne načine ampak žal brez uspeha, mislim da je problem da imam pred prižigom LED lučke delay in med tem časom se program ugasne in ne meri časa? Bi lahko kako nadomestil delay, ki je sicer nujen zaradi naključnega časa čakanja preden se prižge LED lučka. Želim, da izmeri tudi morebitni prehitri pritisk tipke. Hvala za pomoč! Pray

Koda:

   delay(random(500, 4000));                          //čakaj med 0,5s in 4s
   digitalWrite(pinLED, HIGH)                           //prižgi LED lučko (znak za GOO!)
   zacetek = millis();
       while (digitalRead(pinButton) == HIGH)    //Čakaj na pritisk TIPKE
       {
       
       }
      konec = millis();                                        //konec merjenja reakcijskega časa
   digitalWrite(pinLED, LOW);                             //ugasni LED lučko
   int reakcijskicas = konec - zacetek;               //izračun reakcijskega časa
   display.print(reakcijskicas);                          //izpis na OLED zaslonu
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
tlogar
Član
Član



Pridružen-a: Pon 23 Mar 2015 16:57
Prispevkov: 189
Aktiv.: 1.71

PrispevekObjavljeno: Ned Feb 28, 2021 8:21 pm    Naslov sporočila:   Odgovori s citatom

Delay lahko nadomestiš s funkcijo millis(). Poglej malo na internetu.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5773
Aktiv.: 25.91
Kraj: Grosuplje

PrispevekObjavljeno: Ned Feb 28, 2021 9:01 pm    Naslov sporočila:   Odgovori s citatom

Mogoče takole?
Koda:
nakljucna_zakasnitev = random(500,4000);
 zacetek_0 = millis();
 napakaPritiska = false;
 while (millis() < (zacetek_0 + nakljucna_zakasnitev)){     // čakaj dokler ne preteče naključna zakasnitev
 if (digitalRead(pinButton) == HIGH){
  napakaPritiska = true;                          //tipka je bila prekmalu pritisnjena
  break;
 }
 }
 if (!napakaPritiska){                          // če ni napakaPritiska
   digitalWrite(pinLED, HIGH);                           //prižgi LED lučko (znak za GOO!)
   zacetek = millis();
       while (digitalRead(pinButton) == HIGH)    //Čakaj na pritisk TIPKE
       {
       
       }
      konec = millis();                                        //konec merjenja reakcijskega časa
   digitalWrite(pinLED, LOW);                             //ugasni LED lučko
   int reakcijskicas = konec - zacetek;               //izračun reakcijskega časa
   display.print(reakcijskicas);                          //izpis na OLED zaslonu
  }
  else{
    napakaPritiska = false;
    digitalWrite(piskac,HIGH);            //zapiska, če je prekmalu pritisnjena tipka
    delay(2000);
    digitalWrite(piskac,LOW);            //ugasni piskač
}


bool napakaPritiska;
unsigned long nakljucna_zakasnitev, zacetek_0

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
twom
Član
Član



Pridružen-a: Ned 26 Okt 2003 0:37
Prispevkov: 868
Aktiv.: 3.90
Kraj: Ljubljana

PrispevekObjavljeno: Pon Mar 01, 2021 5:48 pm    Naslov sporočila:   Odgovori s citatom

ne poznam arduina, ampak procesorji imajo ponavadi interupte, hardwearske in timerske...

interupt pritisk tipke (hw interupt) je pred/po ledici (sw interupt)...
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5773
Aktiv.: 25.91
Kraj: Grosuplje

PrispevekObjavljeno: Pon Mar 01, 2021 10:41 pm    Naslov sporočila:   Odgovori s citatom

twom je napisal/a:
ne poznam arduina, ampak procesorji imajo ponavadi interupte, hardwearske in timerske...
Ja kaj pa je Arduino?
In seveda lahko tudi tukaj programiraš prekinitve, vendar za takle trivialen problem res ni treba komplicirat, a ne?
In če že predlagaš, lahko daš primer napisan v Cju!

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14555
Aktiv.: 65.33
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Pon Mar 01, 2021 10:50 pm    Naslov sporočila:   Odgovori s citatom

Jaka57 je napisal/a:
twom je napisal/a:
ne poznam arduina, ampak procesorji imajo ponavadi interupte, hardwearske in timerske...
Ja kaj pa je Arduino?
In seveda lahko tudi tukaj programiraš prekinitve, vendar za takle trivialen problem res ni treba komplicirat, a ne?
In če že predlagaš, lahko daš primer napisan v Cju!


In kako boš "lovil" recimo mikrosekunde brez prekinitve?

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5773
Aktiv.: 25.91
Kraj: Grosuplje

PrispevekObjavljeno: Tor Mar 02, 2021 7:42 am    Naslov sporočila:   Odgovori s citatom

Silvo je napisal/a:

In kako boš "lovil" recimo mikrosekunde brez prekinitve?
Očitno je zadovoljen z milisekundami, a ne?
Ne vem, če psihologi merijo mikrosekunde, ko tapkaš po tisti zabli in pritiskaš pedale?

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14555
Aktiv.: 65.33
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Tor Mar 02, 2021 10:24 am    Naslov sporočila:   Odgovori s citatom

Jaka57 je napisal/a:
Silvo je napisal/a:

In kako boš "lovil" recimo mikrosekunde brez prekinitve?
Očitno je zadovoljen z milisekundami, a ne?
Ne vem, če psihologi merijo mikrosekunde, ko tapkaš po tisti zabli in pritiskaš pedale?


Lovljenje oz meritev časa v zanki je vsaj zame zelo slaba praksa. Ok, arduino okolja ne poznam. Če tisti break sproži prekinitev potem je to ok, ker je potem točno znan čas, ki je potekel od pritiska tipke in je vedno enak. V navadni zanki pa je čas odvisen od toka programa, ter koliko kode se izvaja v sami zanki. Če ima arduino kak simulator, naredi test koliko časa se pokuri, da se zanka enkrat obrne.

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
MarkoM
Član
Član



Pridružen-a: Tor 12 Sep 2006 15:29
Prispevkov: 2825
Aktiv.: 13.18
Kraj: Lovrenc na P.

PrispevekObjavljeno: Tor Mar 02, 2021 10:51 am    Naslov sporočila:   Odgovori s citatom

Silvo je napisal/a:
Če ima arduino kak simulator, naredi test koliko časa se pokuri, da se zanka enkrat obrne.


https://www.tinkercad.com/
Arduino simulator.



thinker.PNG
 Opis:
 Velikost datoteke:  135.44 KB
 Pogledana:  22 krat

thinker.PNG


Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5773
Aktiv.: 25.91
Kraj: Grosuplje

PrispevekObjavljeno: Tor Mar 02, 2021 5:26 pm    Naslov sporočila:   Odgovori s citatom

Silvo je napisal/a:
Lovljenje oz meritev časa v zanki je vsaj zame zelo slaba praksa......................V navadni zanki pa je čas odvisen od toka programa, ter koliko kode se izvaja v sami zanki. Če ima arduino kak simulator, naredi test koliko časa se pokuri, da se zanka enkrat obrne.
Ja drži, kar si napisall, toda govorimo o milisekundah, torej, koliko instrukcij se izvrši, če je en cikel 62.5 nanosekunde (16MHz, CKDIV8=0)? Tako na hitro je to 16000 ciklov v 1milisekundi.
Večina instrukcij (govorim o megi328p) se izvrši v enem ciklu ure, nekaj v dveh, treh in štirih.
Tisti break v programu prekine izvajanje zanke, če je pritisnjena tipka preden posveti LED.
V sami zanki, ki šteje čas se pa samo preverja stanje ustreznega PIN registra.

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
programming
Član
Član



Pridružen-a: Sre 09 Jan 2013 19:58
Prispevkov: 33
Aktiv.: 0.24

PrispevekObjavljeno: Tor Mar 02, 2021 6:56 pm    Naslov sporočila:   Odgovori s citatom

Jaka57 je napisal/a:
Mogoče takole?
Koda:
nakljucna_zakasnitev = random(500,4000);
 zacetek_0 = millis();
 napakaPritiska = false;
 while (millis() < (zacetek_0 + nakljucna_zakasnitev)){     // čakaj dokler ne preteče naključna zakasnitev
 if (digitalRead(pinButton) == HIGH){
  napakaPritiska = true;                          //tipka je bila prekmalu pritisnjena
  break;
 }
 }
 if (!napakaPritiska){                          // če ni napakaPritiska
   digitalWrite(pinLED, HIGH);                           //prižgi LED lučko (znak za GOO!)
   zacetek = millis();
       while (digitalRead(pinButton) == HIGH)    //Čakaj na pritisk TIPKE
       {
       
       }
      konec = millis();                                        //konec merjenja reakcijskega časa
   digitalWrite(pinLED, LOW);                             //ugasni LED lučko
   int reakcijskicas = konec - zacetek;               //izračun reakcijskega časa
   display.print(reakcijskicas);                          //izpis na OLED zaslonu
  }
  else{
    napakaPritiska = false;
    digitalWrite(piskac,HIGH);            //zapiska, če je prekmalu pritisnjena tipka
    delay(2000);
    digitalWrite(piskac,LOW);            //ugasni piskač
}


bool napakaPritiska;
unsigned long nakljucna_zakasnitev, zacetek_0


Jaka57 Hvala lepa za pomoč, sem preizkusil in deluje, tudi piskač v tem primeru dobro služi. Applause Sedaj bi ob prehitrem pritisku tipke potreboval le še meritev v milisekundah in sicer od prehitrega pritiska tipke do prižiga LED lučke, ki se sicer v tem primeru ne prižge saj se takoj aktivira piskač. Bi to bilo izvedljivo? Kadar ni prehitrega pritiska se enostavno izračuna čas po naslednji formuli; int reakcijskicas = konec - zacetek; //izračun reakcijskega časa
meritve časa v milisekundah izpisujem na OLED zaslonu.
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Silvo
Moderator
Moderator



Pridružen-a: Pon 24 Feb 2003 17:09
Prispevkov: 14555
Aktiv.: 65.33
Kraj: Koroška-okolica Dravograda

PrispevekObjavljeno: Tor Mar 02, 2021 7:32 pm    Naslov sporočila:   Odgovori s citatom

Citiram:
...Večina instrukcij (govorim o megi328p) se izvrši v enem ciklu ure, nekaj v dveh, treh in štirih. ...


Govor je seveda o assemblerskih instukcijah ne pa o arduino ukazih.

Zakaj sem se "spotaknil" ob tole sporočilo?

Zaradi tega sporočila:

Citiram:
twom je napisal/a:
ne poznam arduina, ampak procesorji imajo ponavadi interupte, hardwearske in timerske...
Ja kaj pa je Arduino?
In seveda lahko tudi tukaj programiraš prekinitve, vendar za takle trivialen problem res ni treba komplicirat, a ne?
In če že predlagaš, lahko daš primer napisan v Cju!


Jaka tvoj odgovor je vsaj meni zvenel dokaj nesramno. Odgovor Twoma je zelo točen. Interupti so namenjeni ravno temu. Raba interuptov je lahko kompliciranje za nekoga, ki jih ne zna uporabljat. Ne vem sicer kake so tvoje reference. Sam sem vsaj kakih 15 let aktivno programiral PIC-e in AVR-je v glavnem v assemblerju. Znam pa spisat program tudi v kakem višjenivojskem jeziku.

_________________
lp
Silvo
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5773
Aktiv.: 25.91
Kraj: Grosuplje

PrispevekObjavljeno: Tor Mar 02, 2021 10:48 pm    Naslov sporočila:   Odgovori s citatom

programming je napisal/a:

Jaka57 Hvala lepa za pomoč, sem preizkusil in deluje, tudi piskač v tem primeru dobro služi.........

To se pravi, da potrebuješ še čas prehitrega pritiska?
Če je temu tako, potem daš vse izračune časov po koncu prve while zanke, s tem, da je začetek=0, prav tako konec, čas od prehitrega pritiska do prižiga ledice pa je enak:
zacetek_0 + nakljucna_zakasnitev - prehiter_zacetek

Ali bi se morala ledica vseeno prižgati po naključni zakasnitvi, kljub prehitremu pritisku?
Če je temu tako, ja potem pa je potrebno uporabiti prekinitev!
Na kateri Arduino plošči delaš to oz. kateri MCU je gor?

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
programming
Član
Član



Pridružen-a: Sre 09 Jan 2013 19:58
Prispevkov: 33
Aktiv.: 0.24

PrispevekObjavljeno: Sre Mar 03, 2021 2:21 pm    Naslov sporočila:   Odgovori s citatom

Jaka57 je napisal/a:
programming je napisal/a:

Jaka57 Hvala lepa za pomoč, sem preizkusil in deluje, tudi piskač v tem primeru dobro služi.........

To se pravi, da potrebuješ še čas prehitrega pritiska?
Če je temu tako, potem daš vse izračune časov po koncu prve while zanke, s tem, da je začetek=0, prav tako konec, čas od prehitrega pritiska do prižiga ledice pa je enak:
zacetek_0 + nakljucna_zakasnitev - prehiter_zacetek

Ali bi se morala ledica vseeno prižgati po naključni zakasnitvi, kljub prehitremu pritisku?
Če je temu tako, ja potem pa je potrebno uporabiti prekinitev!
Na kateri Arduino plošči delaš to oz. kateri MCU je gor?


Tako je, potrebujem še čas prehitrega pritiska. Delam na plošči ARDUINO NANO ATmega328. Ni potrebno da se prižge ledica po naključni zakasnitvi, bolj pomemben je čas prehitrega pritiska, sem pa vseeno dodal utipanje ledice in piskača ob prehitrem pritisku. Za izračun časa prehitrega pritiska do trenutka ko bi se morala sprožit ledica (po naključni zakasnitvi) mi torej manjka določena meritev za prehiter začetek?
Nazaj na vrh
Odsoten Poglej uporabnikov profil Pošlji zasebno sporočilo
Jaka57
Moderator
Moderator



Pridružen-a: Ned 12 Dec 2004 21:47
Prispevkov: 5773
Aktiv.: 25.91
Kraj: Grosuplje

PrispevekObjavljeno: Sre Mar 03, 2021 9:51 pm    Naslov sporočila:   Odgovori s citatom

Mogoče takole, na hitro:
Koda:
nakljucna_zakasnitev = random(500,4000);
 prehiterpritisk=0;
 zacetek_0 = millis();
 napakaPritiska = false;
 while (millis() < (zacetek_0 + nakljucna_zakasnitev)){     // čakaj dokler ne preteče naključna zakasnitev
 if (digitalRead(pinButton) == HIGH){
  prehiterpritisk=millis();
  napakaPritiska = true;                          //tipka je bila prekmalu pritisnjena
  break;
 }
 }
 if (!napakaPritiska){                          // če ni napakaPritiska
   digitalWrite(pinLED, HIGH);                           //prižgi LED lučko (znak za GOO!)
   zacetek = millis();
       while (digitalRead(pinButton) == HIGH)    //Čakaj na pritisk TIPKE
       {
       
       }
      konec = millis();                                        //konec merjenja reakcijskega časa
   digitalWrite(pinLED, LOW);                             //ugasni LED lučko
   int reakcijskicas = konec - zacetek;               //izračun reakcijskega časa
   display.print(reakcijskicas);                          //izpis na OLED zaslonu
  }
  else{
    napakaPritiska = false;
    digitalWrite(piskac,HIGH);            //zapiska, če je prekmalu pritisnjena tipka
    delay(2000);
    digitalWrite(piskac,LOW);            //ugasni piskač
}


Še primer z uporabo prekinitve:
Koda:
const byte ledPin = 13;           //LED na plošči
const byte interruptPin = 2;      //pin na katerega priključiš tipko proti masi(minusu)! Uporabna sta samo pina 2 in 3
long nakljucna_zakasnitev;
unsigned long zacetek, reakcijskicas;
volatile bool pritisk_tipke;
volatile unsigned long konec;

void setup() {
  pinMode(ledPin, OUTPUT);
  pinMode(interruptPin, INPUT_PULLUP);
  attachInterrupt(digitalPinToInterrupt(interruptPin), cas_pritiska, LOW); // namesto LOW lahko tudi CHANGE
}

void loop() {
  pritisk_tipke = false;
  nakljucna_zakasnitev = random(500,4000);
  zacetek = millis();
  while (millis() < (zacetek + nakljucna_zakasnitev)){ //čaka dokler ne preteče naklučna zakasnitev
   if (pritisk_tipke){                                   // če je tipka pritisnjena prej, skoči iz zanke
    break;
   }
  digitalWrite(ledPin, HIGH);           // LED se prižge po naključni zakasnitvi ali če je tipka pritisnjena prej
  while (!pritisk_tipke){}               //čaka na pritisk po naključni zakasnitvi, če je bila tipka pritisnjena prekmalu
  }                                     // je pogoj v while false zato se preskoči


// tukaj pride izračun časov in izpis na display, če je konec - zacetek < naključna_zakasnitev potem je bila tipka pritisnjena
// preden je potekel čas naključne zakasnitve

  reakcijskicas = konec - zacetek;
  display.print(reakcijskicas);

  }

void cas_pritiska() {
  konec = millis();
  pritisk_tipke = true;
}

_________________
Lp, Jaka
Nazaj na vrh
Skrit Poglej uporabnikov profil Pošlji zasebno sporočilo
Pokaži sporočila:   
Objavi novo temo   Odgovori na to temo   Printer-friendly version    www.elektronik.si Seznam forumov -> Arduino sekcija Časovni pas GMT + 2 uri, srednjeevropski - poletni čas
Stran 1 od 1

 
Pojdi na:  
Ne, ne moreš dodajati novih tem v tem forumu
Ne, ne moreš odgovarjati na teme v tem forumu
Ne, ne moreš urejati svojih prispevkov v tem forumu
Ne, ne moreš brisati svojih prispevkov v tem forumu
Ne ne moreš glasovati v anketi v tem forumu
Ne, ne moreš pripeti datotek v tem forumu
Ne, ne moreš povleči datotek v tem forumu

Uptime: 70 dni


Powered by phpBB © 2001, 2005 phpBB Group