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, ...)
Uživatelský avatar
kiRRow
Příspěvky: 1164
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

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

Příspěvek od kiRRow » 04 bře 2020, 18:13

dostatečně zmateně ...

... ideálně ... hoď sem kód (okomentovaný), schéma zapojení ... a i třeba video stím co to dělá/nedělá není marný ... takhle budem všichni jenom hádat a tipovat.

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 » 04 bře 2020, 18:46

// rel.: 4.3.2020
// vysílač/terč HasTim6

#include <SPI.h>
#include <RH_RF22.h>
#include <avr/interrupt.h>
byte TERC = 4;
volatile bool PreruseniBylo = false;

// Singleton instance of the radio
RH_RF22 rf22;

void setup() {
pinMode (TERC,INPUT);
//sei();
Serial.begin(9600);
if (!rf22.init())
Serial.println("RF22 init failed"); // Defaults after init are 434.0MHz, 0.05MHz AFC pull-in, modulation FSK_Rb2_4Fd36

attachInterrupt (digitalPinToInterrupt(3), TercNasazenShozen, CHANGE);
Serial.println("Start pgm");

}

void loop()
{
if (PreruseniBylo == true) {
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");
}

}
PreruseniBylo = false;
attachInterrupt (digitalPinToInterrupt(3), TercNasazenShozen, CHANGE);
}

void TercNasazenShozen()
{
detachInterrupt(digitalPinToInterrupt(3));
PreruseniBylo = true;
}


Obrázek1.png

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 » 04 bře 2020, 20:34

Nějak nepobírám to zapojení tlačítka. Proč jsou piny 3 a 4 spojené? V tom případě bude transmit generovat přerušení tlačítka. Asi je ale chyba ve schématu.

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 » 04 bře 2020, 21:26

Potřebuji rozlišit, zda je tlačítko sepnuté nebo rozepnuté, proto to dělám přes vstup 4

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 » 04 bře 2020, 22:32

Špatně chápeš definici pinů a v tom případě to máš také špatně zapojené. Ty to připojuješ na fyzické čísla pinů čipu, pro tebe mají platit ty popisy pinů v rámečku desky UNA. Na Rx a Tx piny, neboli pin 0 a pin 1 nic nezapojuj, propojkou ti Tx pin vytváří ten interupt a na definovaném pinu 4 vlastně nemáš to tlačítko vůbec zapojené

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, 08:25

Omlouvám se, ve schematu je chyba, spoje mají být posunuté o dva piny.
V zapojení na desce je to ovšem správně, jinak by nefungovalo nic.

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, 08:26

Obrázek1.png

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 » 05 bře 2020, 11:06

Dovolil jsem si ten kod dát do správného zobrazení

Kód: Vybrat vše

// rel.: 4.3.2020
// vysílač/terč HasTim6

#include <SPI.h>
#include <RH_RF22.h>
#include <avr/interrupt.h>
byte TERC = 4;
volatile bool PreruseniBylo = false;

// Singleton instance of the radio
RH_RF22 rf22;

void setup() { 
pinMode (TERC,INPUT);
//sei();
Serial.begin(9600);
if (!rf22.init())
Serial.println("RF22 init failed"); // Defaults after init are 434.0MHz, 0.05MHz AFC pull-in, modulation FSK_Rb2_4Fd36

attachInterrupt (digitalPinToInterrupt(3), TercNasazenShozen, CHANGE);
Serial.println("Start pgm");

}

void loop()
{
if (PreruseniBylo == true) {
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");
}

}
PreruseniBylo = false;
attachInterrupt (digitalPinToInterrupt(3), TercNasazenShozen, CHANGE); 
}

void TercNasazenShozen() 
{ 
detachInterrupt(digitalPinToInterrupt(3));
PreruseniBylo = true;
}
Jaká je kapacita C2?

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, 18:24

1 mikro, při delších testech chybovost asi 5%.
Vzhledem k tomu, že se jedná o měření času v hasičských soutěžích, je třeba 100% spolehlivost.
Nevím, co by mi hasiči udělali, kdybych jim nezměřil čas.
Zkusím ještě spouštět magnetickým kontaktem, popř. použít KO s 40106

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 » 05 bře 2020, 19:06

Mě se moc nepozdává to zapojení obvodu tlačítka. Při stisku natvrdo zkratuje C2, a ikdyž je to jen 1M, může to být docela problém. Zapojil bych rezistor cca 1k (max 2k) do série s tlačítkem. Časová konstanta při zapnutí bude 1ms (2ms), při vypnutí 10ms.
Nebo udělat opravdu bezzákmitové tlačítko s RS klopným obvodem, ale to pak musí mít přepínací kontakt.

Odpovědět

Kdo je online

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