A megszakítást használó rész, nem reagál "lefagy"
A megszakítást használó rész, nem reagál "lefagy"
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
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
Re: A megszakítást használó rész, nem reagál "lefagy"
Vannak iratlan szabályok a megszakítás kezelésben.
Legyen rövid, és gyors!
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
}
Re: A megszakítást használó rész, nem reagál "lefagy"
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.
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.
Re: A megszakítást használó rész, nem reagál "lefagy"
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.
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.
Re: A megszakítást használó rész, nem reagál "lefagy"
Használj millist, az csak 50 naponta csordúl túl!
Re: A megszakítást használó rész, nem reagál "lefagy"
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();
}
}
Re: A megszakítást használó rész, nem reagál "lefagy"
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!
- 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!