|
www.elektronik.si Forum o elektrotehniki in računalništvu
|
Poglej prejšnjo temo :: Poglej naslednjo temo |
Avtor |
Sporočilo |
programming Član
Pridružen-a: Sre 09 Jan 2013 19:58 Prispevkov: 33 Aktiv.: 0.24
|
Objavljeno: Ned Feb 28, 2021 5:52 pm Naslov sporočila: Reakcijski čas |
|
|
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č!
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 |
|
|
tlogar Član
Pridružen-a: Pon 23 Mar 2015 16:57 Prispevkov: 189 Aktiv.: 1.71
|
Objavljeno: Ned Feb 28, 2021 8:21 pm Naslov sporočila: |
|
|
Delay lahko nadomestiš s funkcijo millis(). Poglej malo na internetu.
|
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.91 Kraj: Grosuplje
|
Objavljeno: Ned Feb 28, 2021 9:01 pm Naslov sporočila: |
|
|
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 |
|
|
twom Član
Pridružen-a: Ned 26 Okt 2003 0:37 Prispevkov: 868 Aktiv.: 3.90 Kraj: Ljubljana
|
Objavljeno: Pon Mar 01, 2021 5:48 pm Naslov sporočila: |
|
|
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 |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.91 Kraj: Grosuplje
|
Objavljeno: Pon Mar 01, 2021 10:41 pm Naslov sporočila: |
|
|
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 |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14555 Aktiv.: 65.33 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Pon Mar 01, 2021 10:50 pm Naslov sporočila: |
|
|
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 |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.91 Kraj: Grosuplje
|
Objavljeno: Tor Mar 02, 2021 7:42 am Naslov sporočila: |
|
|
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 |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14555 Aktiv.: 65.33 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Mar 02, 2021 10:24 am Naslov sporočila: |
|
|
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 |
|
|
MarkoM Član
Pridružen-a: Tor 12 Sep 2006 15:29 Prispevkov: 2825 Aktiv.: 13.18 Kraj: Lovrenc na P.
|
Objavljeno: Tor Mar 02, 2021 10:51 am Naslov sporočila: |
|
|
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.
Opis: |
|
Velikost datoteke: |
135.44 KB |
Pogledana: |
22 krat |
|
|
|
Nazaj na vrh |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.91 Kraj: Grosuplje
|
Objavljeno: Tor Mar 02, 2021 5:26 pm Naslov sporočila: |
|
|
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 |
|
|
programming Član
Pridružen-a: Sre 09 Jan 2013 19:58 Prispevkov: 33 Aktiv.: 0.24
|
Objavljeno: Tor Mar 02, 2021 6:56 pm Naslov sporočila: |
|
|
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. 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 |
|
|
Silvo Moderator
Pridružen-a: Pon 24 Feb 2003 17:09 Prispevkov: 14555 Aktiv.: 65.33 Kraj: Koroška-okolica Dravograda
|
Objavljeno: Tor Mar 02, 2021 7:32 pm Naslov sporočila: |
|
|
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 |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.91 Kraj: Grosuplje
|
Objavljeno: Tor Mar 02, 2021 10:48 pm Naslov sporočila: |
|
|
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 |
|
|
programming Član
Pridružen-a: Sre 09 Jan 2013 19:58 Prispevkov: 33 Aktiv.: 0.24
|
Objavljeno: Sre Mar 03, 2021 2:21 pm Naslov sporočila: |
|
|
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 |
|
|
Jaka57 Moderator
Pridružen-a: Ned 12 Dec 2004 21:47 Prispevkov: 5773 Aktiv.: 25.91 Kraj: Grosuplje
|
Objavljeno: Sre Mar 03, 2021 9:51 pm Naslov sporočila: |
|
|
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 |
|
|
|
|
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
|