fix: isr handler wrong interrupt processing
This commit is contained in:
		@@ -1 +1 @@
 | 
			
		||||
1.3.1
 | 
			
		||||
1.3.2
 | 
			
		||||
@@ -5,6 +5,7 @@ static uint8_t _interrupt_gpio = 0xFF;
 | 
			
		||||
static uint8_t _interrupt_port = 0;
 | 
			
		||||
static SemaphoreHandle_t _interrupt_semaphore = NULL;
 | 
			
		||||
static const uint8_t _gpio_matrix[8] PROGMEM = {AVR_BIT0, AVR_BIT1, AVR_BIT2, AVR_BIT3, AVR_BIT4, AVR_BIT5, AVR_BIT6, AVR_BIT7};
 | 
			
		||||
volatile static bool _interrupt_on = false;
 | 
			
		||||
 | 
			
		||||
static zh_avr_vector_t _vector = {0};
 | 
			
		||||
 | 
			
		||||
@@ -161,21 +162,60 @@ BaseType_t zh_avr_pcf8574_isr_handler(void)
 | 
			
		||||
    switch (_interrupt_port)
 | 
			
		||||
    {
 | 
			
		||||
    case AVR_PORTB:
 | 
			
		||||
        if ((PINB & (1 << _interrupt_gpio)) == (1 << _interrupt_gpio))
 | 
			
		||||
        {
 | 
			
		||||
            if (_interrupt_on == false)
 | 
			
		||||
            {
 | 
			
		||||
                _interrupt_on = true;
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        if ((PINB & (1 << _interrupt_gpio)) == 0)
 | 
			
		||||
        {
 | 
			
		||||
            xSemaphoreGiveFromISR(_interrupt_semaphore, &xHigherPriorityTaskWoken);
 | 
			
		||||
            if (_interrupt_on == true)
 | 
			
		||||
            {
 | 
			
		||||
                _interrupt_on = false;
 | 
			
		||||
                xSemaphoreGiveFromISR(_interrupt_semaphore, &xHigherPriorityTaskWoken);
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    case AVR_PORTC:
 | 
			
		||||
        if ((PINC & (1 << _interrupt_gpio)) == (1 << _interrupt_gpio))
 | 
			
		||||
        {
 | 
			
		||||
            if (_interrupt_on == false)
 | 
			
		||||
            {
 | 
			
		||||
                _interrupt_on = true;
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        if ((PINC & (1 << _interrupt_gpio)) == 0)
 | 
			
		||||
        {
 | 
			
		||||
            xSemaphoreGiveFromISR(_interrupt_semaphore, &xHigherPriorityTaskWoken);
 | 
			
		||||
            if (_interrupt_on == true)
 | 
			
		||||
            {
 | 
			
		||||
                _interrupt_on = false;
 | 
			
		||||
                xSemaphoreGiveFromISR(_interrupt_semaphore, &xHigherPriorityTaskWoken);
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    case AVR_PORTD:
 | 
			
		||||
        if ((PIND & (1 << _interrupt_gpio)) == (1 << _interrupt_gpio))
 | 
			
		||||
        {
 | 
			
		||||
            if (_interrupt_on == false)
 | 
			
		||||
            {
 | 
			
		||||
                _interrupt_on = true;
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        if ((PIND & (1 << _interrupt_gpio)) == 0)
 | 
			
		||||
        {
 | 
			
		||||
            xSemaphoreGiveFromISR(_interrupt_semaphore, &xHigherPriorityTaskWoken);
 | 
			
		||||
            if (_interrupt_on == true)
 | 
			
		||||
            {
 | 
			
		||||
                _interrupt_on = false;
 | 
			
		||||
                xSemaphoreGiveFromISR(_interrupt_semaphore, &xHigherPriorityTaskWoken);
 | 
			
		||||
            }
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        break;
 | 
			
		||||
    default:
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user