Question

I have faced a problem connected with GPIO interrupt. The task is to make a simple UI interface, so I need to use 3 buttons. The problem is that I don't understand how to use GPIO interrupt for different pins and all my buttons work the same way.

here is the code:

#include <m8c.h>        // part specific constants and macros
#include "PSoCAPI.h"    // PSoC API definitions for all User Modules
#include <stdio.h>
#include <stdlib.h>

typedef struct {
    int value; // the actual value which is used in the module
    char string[16]; // string that is printed in LCD for user
} UI_ELEMENT;

#define FIRST_LEVEL 3
#define SECOND_LEVEL 3

#define PWM 0
#define PGA 1
#define ADC 2

#define PWM_STATE 0
#define PWM_PERIOD 1
#define PWM_WIDTH 2

#define PWM_STATE_OFF 0
#define PWM_STATE_ON 1

volatile int buttonRightPressed = 0;

#pragma interrupt_handler buttonRightInt
void buttonRightInt(void){
    // disable button interrupt
    M8C_DisableIntMask(INT_MSK0, INT_MSK0_GPIO);
    buttonRightPressed = 1;
}

void initialize_LCD(void){
    LCD_Position(0,0);
    LCD_PrCString("PWM");
    LCD_Position(1,0);
    LCD_PrCString("<    select    >");
}

void update_LCD(int* lvl1){
    if (*lvl1 == PWM || *lvl1 == 3){
        LCD_Position(0,0);
        LCD_PrCString("PWM");
        *lvl1 = 0;
    }
    else if (*lvl1 == PGA){
        LCD_Position(0,0);
        LCD_PrCString("PGA");
    }
    else if (*lvl1 == ADC){
        LCD_Position(0,0);
        LCD_PrCString("ADC");
    }
}

void main(void)
{
    UI_ELEMENT userInterface[FIRST_LEVEL][SECOND_LEVEL];
    int level_1_steper = PWM;
    int i;

    M8C_EnableGInt ; // Uncomment this line to enable Global Interrupts
    PWM8_EnableInt();
    LCD_Start();
    M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);

    initialize_LCD(); // set 'PWM' for upper row, '< select >' for lower row 

    while (1){
        if (buttonRightPressed == 1){
            for ( i = 0; i < 350; i++);
            level_1_steper++;
            update_LCD(&level_1_steper);
            buttonRightPressed = 0;
            // enable button interrupt again
            M8C_EnableIntMask(INT_MSK0, INT_MSK0_GPIO);
        }

    }
}
Was it helpful?

Solution

Problem resolved! As usually solution is quite simple: use GPIO interrupt but test which button has been pressed. GPIO iterrupt:

void buttonInt(void){ // disable button interrupt 
     M8C_DisableIntMask(INT_MSK0, INT_MSK0_GPIO);
     if (Right_Data_ADDR & Right_MASK) buttonRightPressed = 1;
     if (Left_Data_ADDR & Left_MASK) buttonLeftPressed = 1;
     if (Select_Data_ADDR & Select_MASK) buttonSelectPressed = 1;
}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top