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)
Válasz küldése
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ás Szerző: kolozsy »

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: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Hozzászólás Szerző: kapu48 »

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ás Szerző: kolozsy »

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: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Hozzászólás Szerző: kapu48 »

Most látom, hogy a microst figyeled?
Az nem müködik hosszú távra, mert tulcsordul:
https://www.arduino.cc/reference/en/lan ... me/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: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Hozzászólás Szerző: kapu48 »

Használj millist, az csak 50 naponta csordúl túl!
Avatar
kapu48
Elektronbűvölő
Hozzászólások: 3375
Csatlakozott: 2008. augusztus 29. péntek, 6:00

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

Hozzászólás Szerző: kapu48 »

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ás Szerző: kolozsy »

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!
Válasz küldése