Delay a Interrupt

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Delay a Interrupt

Příspěvek od Ludek » 22 úno 2022, 21:26

Zdravím,
mám dotaz a nemohu nikde najít vysvětlení.
Příklad : potřebuji jednou za vteřinu zavolat program- např. Generator, který pomocí přerušení po dobu 50ms spočítá impulzy.
pak se vrátí a toto číslo zobrazí. Ale nefunguje delay, kdy chci blikat LED 500/500.
pokud zakomentuju řádek generator(), tak to funguje

Kód: Vybrat vše

//
#define GEN 2                       // vstup pin2 = int0
#define LED 5                       // info LED
int pulse;                          // citac impulzu
//=============================================================================
void setup()  { 
Serial.begin(9600); 
pinMode(LED, OUTPUT);
attachInterrupt(0, count_pulse, FALLING); 
} 
//=============================================================================
void loop() { 
  Serial.print("counter : ");  
  generator(); 
  digitalWrite(LED,HIGH); delay(500);		// tyto dva radky nahrazuji skutecny kod, kde
  digitalWrite(LED,LOW); delay(500);		// je na nekolika mistech pouzito delay()
  Serial.println(pulse);  
}
//=============================================================================
void generator()  {
    pulse=0;
    interrupts();                         // povoli preruseni
    delay(50);                            // doba detekce pulzu 50ms
    noInterrupts();                       // zakaze preruseni
    return pulse;
  }
//=============================================================================
void count_pulse() 
{  pulse++;  } 
//=============================================================================
//=============================================================================

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

Re: Delay a Interrupt

Příspěvek od ondraN » 23 úno 2022, 07:19

Problém je, že před opuštěním funkce generator, zakážeš globálně všechny přerušení. Včetně těch, které slouží pro generování času (millis, delay) i třeba ty pro sériový port.
Proměnná pulse je globální, takže návrat z generator pomocí return pulse; je nesmyslný.
Také je dobré, definovat globální proměnné se kterými se pracuje v přerušení, jako volatile. Překladač pak tyto proměnné neoptimalizuje.

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Delay a Interrupt

Příspěvek od kiRRow » 23 úno 2022, 10:52

Podle toho jaké máš arduino tak určité funkce a knihovny zaberou určité časovače. U Una je timer0 použit pro časové funkce, millis delay atp. Timer1 používá knihovna servo, Timer2 používá knihovna tone().

Pokud chceš používat millis delay atp tak nesmíš zakázat interupt na timer0. Použít jiný timer, nebo nezakazovat interupty vůbec a mít poznamenáno, za při přerušení se má operace provést, nebo ne.

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Delay a Interrupt

Příspěvek od Ludek » 23 úno 2022, 11:02

No tedy... vím, že nic nevím... akorát vím, že to bylo blbě...
Ale jak počítat pulsy v okamžiku, pouze když zavolám ten podprogram a pouze jen 50ms?
:-(

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

Re: Delay a Interrupt

Příspěvek od ondraN » 23 úno 2022, 11:14

Tak pulsy počítej nepřetržitě a v okamžiku, kdy chceš začít měřit, si počítadlo pouze snuluj a pak se stačí jen podívat na jeho hodnotu. Pokud tě trápí, že četnost interruptů snižuje výkon CPU, tak musíš zakázat jen ten jeden interrupt od pinu. Také můžeš po skončení měření provést detachInerrupt() a před dalším měřením zase attachInterrupt(). Řešení závisí na tom, jak často se měří, jaká je frekvence přerušení, co dělá MCU ještě kromě toho a jaká je vyžadovaná minimální latence (čas kdy se zadá attachInterrupt a kdy se přerušení skutečně aktivuje)

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Delay a Interrupt

Příspěvek od kiRRow » 23 úno 2022, 15:43

Počítat pulzy můžeš i pomocí přerušení na vstupu. Na timeru0 ti pojede millis, pomocí millis budeš jednou za 1000ms vteřin vymazávat počet napočítaných pulzů, pak povolíš přerušení na vstupu (každý pulz připočteš) a po dalších 50ms přerušení na vstupu zakážeš. Ideální je to pomocí přímého zápisu do registru, který je nejrychlejší a máš nad ním maximální kontrolu.

Delay je prakticky nepoužitelný v praxi - hodí se fakt tak max do setupu. Jako, když bych měl arduino, které nemusí šetřit energii, jednou za 5minut pošle čtení analogových hodnot do PC přes RS232 ... dám tam delay, nic se neděje - v momentě kdy si tam přimontuji testovací tlačítko, které po stisku pošle aktuální data hned = mám problém

Ludek
Příspěvky: 289
Registrován: 02 pro 2019, 08:14
Reputation: 0
Bydliště: České Budějovice

Re: Delay a Interrupt

Příspěvek od Ludek » 23 úno 2022, 17:01

Dobrá, rozumím... vyhážu z celého kodu všechny delay.
nevěděl jsem, že tím interuptem mrvím Timer.
díky

Uživatelský avatar
kiRRow
Příspěvky: 1152
Registrován: 07 kvě 2019, 07:03
Reputation: 0
Bydliště: Opava

Re: Delay a Interrupt

Příspěvek od kiRRow » 23 úno 2022, 17:17

To si vůbec nevyčítej, tohle je důsledek toho, že mnoho věcí je velmi zjednodušeno a uděláno za tebe bez tvého vědomí, aby tě neodradili z počátku od programování. Delay je použitelné tam, kde doslova a do písmene potřebuješ aby procesor nedělal nic jiného než čekal ... pro začátečníka usnadnění práce, pro ostatní je to ztráta (výpočetního) času.

Co vůbec používáš za Arduino ( jiný procesor jiný možnosti ) ?

peterple
Příspěvky: 156
Registrován: 22 zář 2021, 20:20
Reputation: 0

Re: Delay a Interrupt

Příspěvek od peterple » 23 úno 2022, 17:54

skús v tom tvojom pôvodnom programe vyhodiť tento riadok

Kód: Vybrat vše

 Serial.print("counter : "); 
Malo by to začať blikať aj počítať.

Uživatelský avatar
gilhad
Příspěvky: 779
Registrován: 07 bře 2018, 11:22
Reputation: 0

Re: Delay a Interrupt

Příspěvek od gilhad » 24 úno 2022, 00:16

@perteple: Stejně by mu pak nejely ty delay u blikání, když v generator zakaze přerušení ...

Odpovědět

Kdo je online

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