0

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);
        }

    }
}
quarks
  • 33,478
  • 73
  • 290
  • 513
mikedanylov
  • 817
  • 11
  • 20
  • It's completely pointless to speak of GPIO interrupts without specifying which MCU you are using. I'm guessing this is something called Cypress PSoC with an ARM Cortex M0? Also, you need to debounce a button, you cannot simply read it like any I/O. And since buttons have signal bounce, you most likely do not want an edge-triggered interrupt to respond to them, or you need to have an external RC filter to take away the bounce. – Lundin Apr 24 '14 at 08:15
  • 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; }` – mikedanylov Apr 24 '14 at 16:19

1 Answers1

0

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;
}
mikedanylov
  • 817
  • 11
  • 20