Estoy usando MikroC Pro, PIC16F1824 con XTAL 4Mhz.
Básicamente tengo 2 modos de LEDs. Utilizo un cable serie para enviar el modo para jugar.
- Modo 1 = Encendido durante 3 segundos y Apagado durante 3 segundos.
- Modo 2 = Encendido durante 1 segundo y Apagado durante 1 segundo.
Todo funciona bien y uso una interrupción. Pero cuando envío un nuevo modo de jugar, espera hasta que se complete el modo de ejecución actual. No detiene el modo actual inmediatamente.
Preguntas:
- ¿Cómo uso la interrupción para detener el modo actual inmediatamente (delay_ms) y reproducir el nuevo modo?
- Me dijeron que debía usar el contador de bucles. ¿Cómo funciona?
Código:
void OnLed(short nMode){
if (nMode == 1)
{
PWM1_Set_Duty(100);
delay_ms(3000);
PWM1_Set_Duty(0);
delay_ms(3000);
}
else
{
PWM1_Set_Duty(100);
delay_ms(1000);
PWM1_Set_Duty(0);
delay_ms(1000);
}
}
void interrupt()
{
cnt++ ; // Interrupt causes cnt to be incremented by 1
PIR1.TMR1IF = 0; // Reset bit TMR1IF
TMR1H = 0xFC; // TMR1H and TMR1L timer registers are returnesd
TMR1L = 0x18; // their initial values
}
'void main()
{
...
T1CON = 1; // Turn on timer TMR1
PIR1.TMR1IF = 0; // Reset the TMR1IF bit
TMR1H = 0xFC; // TMR1H and TMR1L timer registers are returned
TMR1L = 0x18; // their initial values
PIE1.TMR1IE = 1; // Enable an interrupt on overflow
INTCON = 0xC0; // Enable interrupt (bits GIE and PEIE)
...
UART1_Init(9600);
...
while(1)
{
if (UART1_Data_Ready())
{
sByte = UART1_Read();
if (sByte = '1')
OnLed(1);
else
OnLed(2);
}
}