Delay a Interrupt

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Delay a Interrupt

Příspěvek od martinius96 » 02 bře 2022, 01:30

Trochu som sa nudil, tak pridávam upravený program, malo by to fungovať, vyskúšaj.
LED blikne každú sekundu (500 ms OFF, 500 ms ON). Každých 1000 ms sa vypíše hodnota počítadla, následne sa počítadlo vynuluje a nastaví sa príznak a nastaví aktuálny čas pre počítanie pulzov po dobu 50 ms. Po ubehnutí 50 ms pri aktívnom príznaku sa príznak nastaví na false a v ISR rutine sa ďalšie pulzy nepripočítajú (po dobu zostávajúcich 950 ms).

Nie som si istý, či by podmienka v ISR rutine s premennou flag fungovala i keby nebola volatile, tak som to tam do istoty nechal...
Tiež ten if, ktorý po 50 ms mení flag na false by mohol ísť aj do ISR rutiny, ak by bola volatile i premenná time3.

Kód: Vybrat vše

//Edit by: martinius96
#define GEN 2   // vstup pin2 = int0
#define LED 5   // info LED
int ledstate = LOW;
volatile unsigned int pulse = 0;      // citac impulzu (max 65535)
volatile bool flag = false;   // priznak (chcem pocitat pulzy ?)
unsigned long time1 = 0; //hodnota millis() pre blikanie LED
unsigned long time2 = 0; //hodnota millis() pre spustenie rutiny pocitadla
unsigned long time3 = 0; //uchovava hodnotu millis() v preruseni
void setup()  {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  attachInterrupt(digitalPinToInterrupt(GEN), count_pulse, FALLING);     // attach interrupt handler to input pin.
  sei();         //Enables interrupts
}

void loop() {
  generator();
  blink_LED();
}
void generator()  {
  if ((millis() - time2) >= 1000 || time2 == 0) { //rutina raz za 1 sekundu
    time2 = millis();
    cli();//Disable interrupts
    Serial.print(F("Counter: "));
    Serial.println(pulse);
    flag = true;
    time3 = millis();
    pulse = 0;
    sei();//Enables interrupts
  }

  if (((millis() - time3) >= 50) && (flag == true)) {
    flag = false;
  }
}

void count_pulse() {
  if (flag) {
    pulse++;
  }
}

void blink_LED()  {
  if (millis() - time1 >= 500) {
    time1 = millis();
    ledstate = !ledstate;
    digitalWrite(LED, ledstate);
  }
}

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 » 29 bře 2022, 09:28

Paráda, jsi borec, šlape to.
díky

Odpovědět

Kdo je online

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