Jump to content

Interrupts for TM4C123GXL

Recommended Posts

I'm trying to read two encoders to know the angular position using interrupts but something is wrong, the code compiles but in serial just prints "0", what can i change?



volatile long Left_Encoder_Ticks = 0;

volatile bool LeftEncoderBSet;

#define Right_Encoder_PinA PC_5
#define Right_Encoder_PinB PC_6
volatile long Right_Encoder_Ticks = 0;

volatile bool RightEncoderBSet;

void setup()

void SetupEncoders()
pinMode(Left_Encoder_PinA, INPUT_PULLUP);
pinMode(Left_Encoder_PinB, INPUT_PULLUP);
attachInterrupt(Left_Encoder_PinA, do_Left_Encoder, RISING);
pinMode(Right_Encoder_PinA, INPUT_PULLUP);
pinMode(Right_Encoder_PinB, INPUT_PULLUP);
attachInterrupt(Right_Encoder_PinA, do_Right_Encoder, RISING);

void loop()

void Update_Encoders()

void do_Left_Encoder()
LeftEncoderBSet = digitalRead(Left_Encoder_PinB);
Left_Encoder_Ticks -= LeftEncoderBSet ? -1 : +1;
void do_Right_Encoder()
RightEncoderBSet = digitalRead(Right_Encoder_PinB);
Right_Encoder_Ticks += RightEncoderBSet ? -1 : +1;

Share this post

Link to post
Share on other sites

Here is my interrupt driven QEI implementation - not a Energia library but may provide some ideas?

The code is not 100% reliable for the MPG_GetPosition() function though - interrupts should be disabled during the memcpy call...


Share this post

Link to post
Share on other sites

I tried another code to prove only one encoder but think I can't use HIGH and LOW for interrupts in Energiai

nt A = PD_1;      //variable A a pin digital 2 (DT en modulo)
int B = PD_2;        //variable B a pin digital 4 (CLK en modulo)

float GRADOS = 0;

int ANTERIOR = 0;    // almacena valor anterior de la variable POSICION

volatile int POSICION = 0; // variable POSICION con valor inicial de 50 y definida
        // como global al ser usada en loop e ISR (encoder)
void setup() {
  pinMode(A, INPUT);    // A como entrada
  pinMode(B, INPUT);    // B como entrada
//  pinMode(23, OUTPUT);
  Serial.begin(9600);   // incializacion de comunicacion serie a 9600 bps

  attachInterrupt(digitalPinToInterrupt(A), encoder, LOW);// interrupcion sobre pin A con
                // funcion ISR encoder y modo LOW
  Serial.println("Listo");  // imprime en monitor serial Listo

void loop() {
//  digitalWrite(23, HIGH);
  if (POSICION != ANTERIOR) { // si el valor de POSICION es distinto de ANTERIOR
    Serial.print(POSICION); // imprime valor de POSICION
    Serial.print("      ");
    ANTERIOR = POSICION ; // asigna a ANTERIOR el valor actualizado de POSICION

void encoder()  {
  static unsigned long ultimaInterrupcion = 0;  // variable static con ultimo valor de
            // tiempo de interrupcion
  unsigned long tiempoInterrupcion = millis();  // variable almacena valor de func. millis

  if (tiempoInterrupcion - ultimaInterrupcion > 0.5) {  // rutina antirebote desestima
              // pulsos menores a 5 mseg.
    if (digitalRead(B) == HIGH)     // si B es HIGH, sentido horario
      POSICION++ ;        // incrementa POSICION en 1
    else {          // si B es LOW, senti anti horario
      POSICION-- ;        // decrementa POSICION en 1

    POSICION = min(2000000, max(-2000000, POSICION));  // establece limite inferior de 0 y
            // superior de 100 para POSICION
    ultimaInterrupcion = tiempoInterrupcion;  // guarda valor actualizado del tiempo
  }           // de la interrupcion en variable static


Share this post

Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

  • Create New...