Hola, José, como siempre el primero en ayudarme, bueno no se si es lo mismo, ,,,, me refiero a las clásicas interrupciones por hardware, que pueden tener varias fuentes por ejemplo el ingreso de un pulso positivo o negativo a un pin, el overloop de un timer, la terminación de una lectura desde el ADC, el cambio de estado de un comparador, etc, etc, dependiendo claro esta del micro. Cuando se define un servicio de interrupción ISR, en un micro por ejemplo para detectar el cambio de estado de un pin, se define el pin propiamente dicho, el nombre de la ISR, y el modo , por ejemplo rising, para indicar que se dispare con un flanco ascendente.
La forma en que la interrupción funciona es la siguiente, cuando se detecta el evento en el pin, del modo especificado, el micro termina con la sentencia que esta ejecutando y carga en un registro la dirección actual del program counter, luego se dirige al puntero de dirección que apunta al label colocado como nombre de ISR, ejecuta el código dentro del ISR, y hace el camino contrario para retornar a la próxima instrucción apuntada por el program counter, asi funciona una interrupción en cualquier micro, un Z80, un Pic, Un Arduino, un ESP9266, etc. pero no se como se implementa en B4A, te pego un trozo de código para leer un sensor PIR escrito en C de Arduino para ESp8266
// Set GPIOs for LED and PIR Motion Sensor
const int led = 12;
const int motionSensor = 14;
// Timer: Auxiliary variables
unsigned long now = millis();
unsigned long lastTrigger = 0;
boolean startTimer = false;
// Checks if motion was detected, sets LED HIGH and starts a timer
ICACHE_RAM_ATTR void detectsMovement() {
Serial.println("MOTION DETECTED!!!");
digitalWrite(led, HIGH);
startTimer = true;
lastTrigger = millis();
}
void setup() {
// Serial port for debugging purposes
Serial.begin(115200);
// PIR Motion Sensor mode INPUT_PULLUP
pinMode(motionSensor, INPUT_PULLUP);
// Set motionSensor pin as interrupt, assign interrupt function and set RISING mode
attachInterrupt(digitalPinToInterrupt(motionSensor), detectsMovement, RISING);
// Set LED to LOW
pinMode(led, OUTPUT);
digitalWrite(led, LOW);
}
void loop() {
// Current time
now = millis();
// Turn off the LED after the number of seconds defined in the timeSeconds variable
if(startTimer && (now - lastTrigger > (timeSeconds*1000))) {
Serial.println("Motion stopped...");
digitalWrite(led, LOW);
startTimer = false;
}
}
Un abrazo y espero tu ayuda, Jorge