A megszakítást használó rész, nem reagál "lefagy"

Processing/Wiring (illetve C) nyelvű programozási fogások, tippek. (AVR-Duino, Arduino, EthDuino, Diecimila, Severino, Nano, LilyPad)
Avatar
kolozsy
DrótVégénSzéndarab
Hozzászólások: 27
Csatlakozott: 2012. szeptember 6. csütörtök, 6:00

A megszakítást használó rész, nem reagál "lefagy"

HozzászólásSzerző: kolozsy » 2019. április 12. péntek, 7:42

Tiszteletem!
Arduino Mega + tft + keypad + stb. Egy antennaforgatóval játszom.
Arduino 1.8.7 a softwer.
A forgásérzékelő impulzusadót egy enkóder egyik kapcsolója szimulálja. - Működik, minden OK, de esetleg kimaradhat egy-egy impulzus.
Ezért az impulzus adó átkerült megszakításra. Az enkóder prellez ezért az itt található programot használom.
https://www.instructables.com/id/Arduin ... -function/
Továbbra is működik. Gyorsabb lett - de:
Az enkóderre egy idő után nem reagál (fél óra? ha addig nem nyúlok hozzá?, de nem tudom mitől függ)
Részletek:
---------------
attachInterrupt(digitalPinToInterrupt(Beam_Dir_Sign), debounceInterrupt, CHANGE);
---------------
void debounceInterrupt()
{
if((long)(micros() - last_micros) >= debouncing_time * 100)
{
// irany_kezeles();
if(state_forgato == NORMAL){irany_kezeles();}
if(state_forgato == KALIBRAL){kalibracio_szamlalas();}
last_micros = micros();
}
}
---------------
Csak az enkoderre nem reagál, mikor "lefagy". Minden más működik.
Mik lehetnek a lehetséges okai a hibának?
Előre is köszönöm

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3292
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: A megszakítást használó rész, nem reagál "lefagy"

HozzászólásSzerző: kapu48 » 2019. április 12. péntek, 18:35

Vannak iratlan szabályok a megszakítás kezelésben.
Legyen rövid, és gyors!

Kód: Egész kijelölése

// mozgo.ino
unsigned long debouncing_time = 15; //Debouncing Time in Milliseconds
volatile unsigned long last_micros;
byte flag = 0;

void setup() {
  attachInterrupt(0, debounceInterrupt, RISING);
  last_micros = micros()+ debouncing_time * 1000;
}

void loop() {

  if(flag == 1){ //Érzékeli az elfogadot interuptot
    flag = 0; // jelezi, hogy feldolgozta, nem fogja megismételni
    dolgozo(); // meghivja a feldolgozást
  }
}

void debounceInterrupt() {
  if(micros() > last_micros){  // most minden int-nél kevesebbet számolgatunk 
    //Interuptból nem hivunk másik rutint!
    flag = 1; // Jelzi a megszakitás elfogadását
    last_micros = micros()+ debouncing_time * 1000; // a következö késleltetés értéke
  }
}
//
void dolgozo() {
  //Do Something
}


Avatar
kolozsy
DrótVégénSzéndarab
Hozzászólások: 27
Csatlakozott: 2012. szeptember 6. csütörtök, 6:00

Re: A megszakítást használó rész, nem reagál "lefagy"

HozzászólásSzerző: kolozsy » 2019. április 13. szombat, 6:43

Köszönöm a választ!
Este betöltöttem. Működött. Bekapcsolva hagytam - reggelre "lefagyott" - (nem reagált a 13-LED a 19 lábra)
- ez egy másik Arduino 2560 MEGA
- A 19 lábon reggel mérhető volt az 5V illetve lezáráskor a 0V
Csatolom, mert változtatni kellett, hogy látható legyen a működés. - valamit elrontok

[attachment=0]mozgo_kapu48_01.ino[/attachment]

Előre is köszönöm a segítséget.
Nincs meg a kellő jogosultságod a hozzászóláshoz csatolt állományok megtekintéséhez.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3292
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: A megszakítást használó rész, nem reagál "lefagy"

HozzászólásSzerző: kapu48 » 2019. április 13. szombat, 8:23

Most látom, hogy a microst figyeled?
Az nem müködik hosszú távra, mert tulcsordul:
https://www.arduino.cc/reference/en/language/functions/time/micros/
micros()
[Time]
Description
Returns the number of microseconds since the Arduino board began running the current program. This number will overflow (go back to zero), after approximately 70 minutes. On 16 MHz Arduino boards (e.g. Duemilanove and Nano), this function has a resolution of four microseconds (i.e. the value returned is always a multiple of four). On 8 MHz Arduino boards (e.g. the LilyPad), this function has a resolution of eight microseconds.

Használj millist, az csak 5 naponta csordúl túl.

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3292
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: A megszakítást használó rész, nem reagál "lefagy"

HozzászólásSzerző: kapu48 » 2019. április 13. szombat, 8:42

Használj millist, az csak 50 naponta csordúl túl!

Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3292
Csatlakozott: 2008. augusztus 29. péntek, 6:00
Tartózkodási hely: Újkígyós

Re: A megszakítást használó rész, nem reagál "lefagy"

HozzászólásSzerző: kapu48 » 2019. április 13. szombat, 9:38

Vagy figyelheted a tulcsordulást a megszakításban:

Kód: Egész kijelölése

void debounceInterrupt() {
    static uint32_t old_micros = 0;
                        // figyeli a tulcsordulást
  if((micros() > last_micros) || (micros() < old_micros)){   
    flag = 1; // Jelzi a megszakitás elfogadását
    last_micros = micros()+ debouncing_time * 10000;
    old_micros = micros();
  }
 
}

Avatar
kolozsy
DrótVégénSzéndarab
Hozzászólások: 27
Csatlakozott: 2012. szeptember 6. csütörtök, 6:00

Re: A megszakítást használó rész, nem reagál "lefagy"

HozzászólásSzerző: kolozsy » 2019. április 13. szombat, 18:04

Nagyon köszönöm!
- micros - millis csere rendbe hozta.
Ha a gyakorlatban a millis sok lenne, használom a túlcsordulás figyelést.
Még egyszer köszönöm!


Vissza: “Arduino / C-nyelvű programozás (AVR-Duino, EthDuino, Arduino, Diecimila)”

Ki van itt

Jelenlévő fórumozók: nincs regisztrált felhasználó valamint 2 vendég