ERROR undefined reference

hola, buenas tardes,

editado: estoy usando este núcleo: GitHub - earlephilhower/arduino-pico: Raspberry Pi Pico Arduino core, for all RP2040 boards

estoy compilando para RP2040 y me da este error

c:/users/dnpcw/appdata/local/arduino15/packages/rp2040/tools/pqt-gcc/1.5.0-b-c7bab52/bin/../lib/gcc/arm-none-eabi/10.3.0/../../../../arm-none-eabi/bin/ld.exe: C:\Users\dnpcw\AppData\Local\Temp\arduino\sketches\B9630E93340346D7B4C1B21074C83158\sketch\botones_pullup_pulldown.ino.cpp.o: in function loop': C:\Users\dnpcw\GDrive\DSD\en proceso\Tarjetas MIFARE\RPIpico\fuentes Arduino IDE\pruebas\botones_pullup_pulldown/botones_pullup_pulldown.ino:115: undefined reference to _Z27KY040_determinarSentidoGirov'

c:/users/dnpcw/appdata/local/arduino15/packages/rp2040/tools/pqt-gcc/1.5.0-b-c7bab52/bin/../lib/gcc/arm-none-eabi/10.3.0/../../../../arm-none-eabi/bin/ld.exe: C:\Users\dnpcw\GDrive\DSD\en proceso\Tarjetas MIFARE\RPIpico\fuentes Arduino IDE\pruebas\botones_pullup_pulldown/botones_pullup_pulldown.ino:117: undefined reference to `_Z25KY040_IntervaloEntrePasosv'

c:/users/dnpcw/appdata/local/arduino15/packages/rp2040/tools/pqt-gcc/1.5.0-b-c7bab52/bin/../lib/gcc/arm-none-eabi/10.3.0/../../../../arm-none-eabi/bin/ld.exe: C:\Users\dnpcw\GDrive\DSD\en proceso\Tarjetas MIFARE\RPIpico\fuentes Arduino IDE\pruebas\botones_pullup_pulldown/botones_pullup_pulldown.ino:121: undefined reference to `_Z25KY040_IntervaloEntrePasosv'

collect2.exe: error: ld returned 1 exit status

exit status 1

Compilation error: exit status 1

este es el codigo

archivo encoder_ky040.h

#include <stdint.h>
#include <stdbool.h>
#include <Arduino.h>

#define ENC_ROT_SW    2
#define ENC_ROT_CLK   0
#define ENC_ROT_DT    1

#define KY040_TIEMPO_MIN_ENTRE_PULSOS   50

//------------------------------------------------------------------------------

uint8_t KY040_IntervaloEntrePasos(void);

bool KY040_determinarSentidoGiro(void);

//------------------------------------------------------------------------------

archivo encoder_ky040.c

#include "encoder_ky040.h"

//------------------------------------------------------------------------------

unsigned long KY040_TiempoEntrePulsos(void)
{
  static unsigned long mSegAnt = 0, mSegAct = 0;

  mSegAnt = mSegAct;
  mSegAct = millis();
  return (mSegAct - mSegAnt);
}

//------------------------------------------------------------------------------

bool KY040_determinarSentidoGiro(void)
{
  bool ret=false;

  if ( digitalRead(ENC_ROT_DT) == 0 ) ret = true;

  return ret;
}

//------------------------------------------------------------------------------

uint8_t KY040_IntervaloEntrePasos(void)
{
  unsigned long tiempoEntrePulsos = KY040_TiempoEntrePulsos();

  if ( tiempoEntrePulsos < KY040_TIEMPO_MIN_ENTRE_PULSOS )
  {
    return (KY040_TIEMPO_MIN_ENTRE_PULSOS - tiempoEntrePulsos);
  }
  else
  {
    return 1;
  }
}

//------------------------------------------------------------------------------

archivo botones_pullup_pulldown.ino

#include "encoder_ky040.h"

//------------------------------------------------------------------------------

#define __DEBUG__

//------------------------------------------------------------------------------

#define BTN_CREA_TARJ_ADM   13
#define LED_VERDE   14

//------------------------------------------------------------------------------

volatile bool KY040estSwitch = true;
volatile bool KY040estClock  = true;
volatile bool btn_crea_tarj_adm_est=true;

//------------------------------------------------------------------------------

void INT_BTN_CREA_TARJ_ADM(void)
{
  btn_crea_tarj_adm_est = false;
}

void INT_KY040_SWITCH(void)
{
  KY040estSwitch = false;
}

void INT_KY040_CLOCK(void)
{
  KY040estClock = false;
}
//------------------------------------------------------------------------------

void setup() 
{
#ifdef __DEBUG__
  Serial.begin (115200);
  while (!Serial) ;
#endif

  pinMode (BTN_CREA_TARJ_ADM, INPUT_PULLUP);

  pinMode (LED_VERDE, OUTPUT);

  pinMode (ENC_ROT_CLK, INPUT);
  pinMode (ENC_ROT_DT, INPUT);


  attachInterrupt(digitalPinToInterrupt(BTN_CREA_TARJ_ADM), INT_BTN_CREA_TARJ_ADM, FALLING);
  attachInterrupt(digitalPinToInterrupt(ENC_ROT_SW), INT_KY040_SWITCH, FALLING); 
  attachInterrupt(digitalPinToInterrupt(ENC_ROT_CLK), INT_KY040_CLOCK, FALLING);
}

//------------------------------------------------------------------------------

void loop() 
{
  static bool est_led_verde=false;
  static long posEncoder=0;

  /**************** BOTON ****************/
  if ( !btn_crea_tarj_adm_est )
  {
    est_led_verde = !est_led_verde;
    digitalWriteFast(LED_VERDE, est_led_verde);
    btn_crea_tarj_adm_est = true;
  }

  /**************** KY-040 ****************/
  if ( !KY040estSwitch )
  {
    delay(20);

#ifdef __DEBUG__
    Serial.println("Switch presionado");
#endif

    KY040estSwitch = true;
  }
  //-------------------------------------------------------
  if ( !KY040estClock )
  {
    if ( KY040_determinarSentidoGiro() ) 
    {
      posEncoder += KY040_IntervaloEntrePasos();
    }
    else
    {
      posEncoder -= KY040_IntervaloEntrePasos();
    }

#ifdef __DEBUG__
    Serial.println(posEncoder);
#endif

    KY040estClock = true;
  }
}

//------------------------------------------------------------------------------

en el IDE la referencia la sigue hasta la cabecera y de la cabecera al .c

agradezco cualquier ayuda,

saludos

Cambia la extensión del fichero "encoder_ky040.c" de C a CPP.

Explicación: Aunque el compilador acepta ficheros en C, sin el PP, la forma en la que trata la programación es diferente y seguro que no le gusta como se ha declarado ninguna de las funciones.

1 Like

hola,

funcionó, muchísimas gracias,

saludos,

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.