Follow along with the video below to see how to install our site as a web app on your home screen.
Nota: This feature currently requires accessing the site using the built-in Safari browser.
Si se pueden crear banderas (Flags) propias para cualquier evento, es algo muy común.
Nota: Microchip es el nombre de la empresa que fabrica los PIC y actualmente también los ATmega.
Muchos programas contienen banderas definidas por el programador y también los registros las tienen.Gracias por aclarármelo. ¿Tienes algún ejemplo? Ya que he buscado y no encontré ni uno.
cblock 0xXX
bandera
; Más variables.
endc
timer0 equ 0
timer1 equ 1
otra equ 2
; Servicio de interrupciones:
interrupciones
btfss INTCON,T0IF ; ¿Se desbordó el Timer 0?
goto salir_sdi ; No desbordó, ir a "salir_sdi"
bsf bandera,timer0 ; Sí desbordó. (Pongo en 1 la bandera "timer0")
bcf INTCON,T0IF ; Pongo en 0 la bandera T0IF del registro INTCON
salir_sdi
retfie ; Salir del servicio de interrupciones.
; Se regresará al punto en donde se produjo la interrupción.
Bandera_Timer0 Var Bit ; Declarar "Bandera_Timer0" como variable de 1 bit
Servicio_Interrupciones:
Disable ; Desactivar Interrupciones globales.
If INTCON.2 = 1 Then ; ¿Se desbordó el Timer 0?
Bandera_Timer0 = 1 ; Sí desbordó. Pongo en 1 "Bandera_Timer0"
INTCON.2 = 0 ; Pongo en 0 la bandera T0IF del registro INTCON
End If
Resume ; El programa regresará al punto donde se produjo la interrupción.
Enable ; Rehabilitar las interrupciones.
int1 bandera_timer0 = 0;
#INT_TIMER0
void sdi_desborde_timer0 (void)
{
bandera_timer0 = 1;
}
;Banderas de propósito específico
#DEFINE CARL REGBAND,.6 ;Bandera de acarreo en conversión de código binario-BCD
#DEFINE CARR REGBAND,.5 ;Bandera de acarreo en operaciónes matemáticas
#DEFINE SENS REGBAND,.4 ;Interrupción por solicitud del usuario (sensor)
#DEFINE TEMPO REGBAND,.3 ;Interrupción por expiración de tiempo del TMR1
#DEFINE ERRM REGBAND,.2 ;Bandera de error matemático
#DEFINE CARFULL REGBAND,.1 ;Bandera de carga >97%
/*Registro de banderas de propósito general*/
union
{
struct
{
uint8_t BUTTNCHA :1; //Bandera indicadora de boton pendiente por procesar
uint8_t SYSON :1; //Bandera indicadora de sistema encendido
uint8_t ENCO_PRES :1; //Bandera indicadora de botón de encoder presionado
uint8_t ENCO_RIGHT :1; //Bandera indicadora de giro de encoder a la derecha
uint8_t ENCO_LEFT :1; //Bandera indicadora de giro de encoder a la izquierda
};
uint8_t ALL;
}BANDERAS;
Hola, ¿en que lenguaje de programación?
En lo personal, para ASM uso esta sintaxis
Código:;Banderas de propósito específico #DEFINE CARL REGBAND,.6 ;Bandera de acarreo en conversión de código binario-BCD #DEFINE CARR REGBAND,.5 ;Bandera de acarreo en operaciónes matemáticas #DEFINE SENS REGBAND,.4 ;Interrupción por solicitud del usuario (sensor) #DEFINE TEMPO REGBAND,.3 ;Interrupción por expiración de tiempo del TMR1 #DEFINE ERRM REGBAND,.2 ;Bandera de error matemático #DEFINE CARFULL REGBAND,.1 ;Bandera de carga >97%
Previamente tengo definido a REGBAND como una variable en RAM
Ahora, en C me sirvo de la directiva "struct"
Código:/*Registro de banderas de propósito general*/ union { struct { uint8_t BUTTNCHA :1; //Bandera indicadora de boton pendiente por procesar uint8_t SYSON :1; //Bandera indicadora de sistema encendido uint8_t ENCO_PRES :1; //Bandera indicadora de botón de encoder presionado uint8_t ENCO_RIGHT :1; //Bandera indicadora de giro de encoder a la derecha uint8_t ENCO_LEFT :1; //Bandera indicadora de giro de encoder a la izquierda }; uint8_t ALL; }BANDERAS;
Saludos
PD. D@rkbytes comento lo mismo 1 min antes![]()
Espero que también sepas entender lo irrelevante que es crear otra bandera, cuando se trata de interrupciones.Ah, ya entendí.Gracias.
Espero que también sepas entender lo irrelevante que es crear otra bandera, cuando se trata de interrupciones.
A eso es a lo que me refiero.Por poner un ejemplo. Cuando se lee una serie de botones por medio de las interrupciones. El micro se mantiene atendiendo la aplicación principal y cuando es interrumpido por alguna pulsación entra a la ISR y ahí no hago más que establecer una bandera secundaria que le indica al bucle principal o local que se ha pulsado una tecla y entonces que desde ahí (main) llamo a la rutina que se encarga de decodificar el botón pulsado con su respectivo "retardo antirrebote" para después borrar esa bandera secundaria para la siguiente interrupción.
No necesariamente, porque el estado de la bandera activa, como mencioné anteriormente, siempre estará disponible desde cualquier parte del programa.De no hacerlo así, tendría que meter todo el proceso de retardo antirrebote en la misma ISR y eso quitaría valioso tiempo al main.
Por demás que utilizar las mismas banderas de hardware del PIC (caso específico) hace que se haga una re-entrada a la ISR en un lazo interminable.
Me parece que ya lo expliqué, y siempre he pensado qué... Al buen entendedor, pocas palabras.Por ello no creo que sea tan irrelevante![]()