test_ports.c - Test the GPIO configuration macros in includepic24_ports_config.hΒΆ

 

To test GPIO macros create some dummy values for testing for the non-existing test port RT.

#define _RT1
#define RT1_RP 100
#define RT1_AN 200
#define RT1_CN 300
#define _CN300PDE
#define _ODCT1

#define _RT2

#define _RT3
#define _ODT3



#include "pic24_all.h"
 

Undefine these, now that macro testing is done, to test them as local variables below.

#undef _CN300PDE
#undef _ODCT1
void test_rt1_low_level() {
  uint16_t _PCFG200 = 0;
  uint16_t _TRIST1 = 0;
  uint16_t _ODCT1 = 0;
  uint16_t _CN300PUE = 0;
  uint16_t _CN300PDE = 0;
  uint16_t _CN300IE = 0;

  ASSERT(RT1_RP == 100);
  ASSERT(RT1_AN == 200);

  ENABLE_RT1_ANALOG();
  ASSERT(_PCFG200 == 1);
  DISABLE_RT1_ANALOG();
  ASSERT(_PCFG200 == 0);


  CONFIG_RT1_AS_INPUT();
  ASSERT(_TRIST1 == 1);
  CONFIG_RT1_AS_OUTPUT();
  ASSERT(_TRIST1 == 0);

  ENABLE_RT1_OPENDRAIN();
  ASSERT(_ODCT1 == 1);
  DISABLE_RT1_OPENDRAIN();
  ASSERT(_ODCT1 == 0);

  ENABLE_RT1_PULLUP();
  ASSERT(_CN300PUE == 1);
  DISABLE_RT1_PULLUP();
  ASSERT(_CN300PUE == 0);

  ENABLE_RT1_PULLDOWN();
  ASSERT(_CN300PDE == 1);
  DISABLE_RT1_PULLDOWN();
  ASSERT(_CN300PDE == 0);

  ENABLE_RT1_CN_INTERRUPT();
  ASSERT(_CN300IE == 1);
  DISABLE_RT1_CN_INTERRUPT();
  ASSERT(_CN300IE == 0);
}


void test_rt1_high_level() {
  uint16_t _PCFG200 = 0;
  uint16_t _TRIST1 = 0;
  uint16_t _ODCT1 = 0;
  uint16_t _CN300PUE = 0;
  uint16_t _CN300PDE = 0;

  CONFIG_RT1_AS_ANALOG();
  ASSERT(_PCFG200 == 1);
  ASSERT(_TRIST1 == 1);
  ASSERT(_ODCT1 == 0);
  ASSERT(_CN300PUE == 0);
  ASSERT(_CN300PDE == 0);

  CONFIG_RT1_AS_DIG_INPUT();
  ASSERT(_PCFG200 == 0);
  ASSERT(_TRIST1 == 1);
  ASSERT(_ODCT1 == 0);
  ASSERT(_CN300PUE == 0);
  ASSERT(_CN300PDE == 0);

  CONFIG_RT1_AS_DIG_OUTPUT();
  ASSERT(_PCFG200 == 0);
  ASSERT(_TRIST1 == 0);
  ASSERT(_ODCT1 == 0);
  ASSERT(_CN300PUE == 0);
  ASSERT(_CN300PDE == 0);
}
 

RT2 should not have most of the enable macros.

#ifdef RT2_REMAPPABLE
# error
#endif

#ifdef RT2_AN_PORT
# error
#endif

#ifdef ENABLE_RT2_ANALOG
# error
#endif

#ifdef ENABLE_RT2_OPENDRAIN
# error
#endif

#ifdef ENABLE_RT2_PULLUP
# error
#endif

#ifdef ENABLE_RT2_PULLDOWN
# error
#endif

#ifdef ENABLE_RT2_CN_INTERRUPT
# error
#endif

void test_rt2_low_level() {
  uint16_t _TRIST2 = 0;

  CONFIG_RT2_AS_INPUT();
  ASSERT(_TRIST2 == 1);
  CONFIG_RT2_AS_OUTPUT();
  ASSERT(_TRIST2 == 0);
 

These should exist, but do nothing.

  DISABLE_RT2_ANALOG();
  DISABLE_RT2_OPENDRAIN();
  DISABLE_RT2_PULLUP();
  DISABLE_RT2_PULLDOWN();
  DISABLE_RT2_CN_INTERRUPT();
}


#ifdef CONFIG_RT2_AS_ANALOG
# error
#endif

void test_rt2_high_level() {
  uint16_t _TRIST2 = 0;

  CONFIG_RT2_AS_DIG_INPUT();
  ASSERT(_TRIST2 == 1);

  CONFIG_RT2_AS_DIG_OUTPUT();
  ASSERT(_TRIST2 == 0);
}

#undef _ODT3
void test_rt3_low_level() {
  uint16_t _ODT3 = 0;

  ENABLE_RT3_OPENDRAIN();
  ASSERT(_ODT3 == 1);
  DISABLE_RT3_OPENDRAIN();
  ASSERT(_ODT3 == 0);
}


void test_rt3_high_level() {
  uint16_t _TRIST3 = 0;
  uint16_t _ODT3 = 1;

  _ODT3 = 1;
  CONFIG_RT3_AS_DIG_INPUT();
  ASSERT(_ODT3 == 0);

  _ODT3 = 1;
  CONFIG_RT3_AS_DIG_OUTPUT();
  ASSERT(_ODT3 == 0);
}

int main(void) {
  configBasic(HELLO_MSG);
  test_rt1_low_level();
  test_rt1_high_level();
  test_rt2_low_level();
  test_rt2_high_level();
  test_rt3_low_level();
  test_rt3_high_level();
  outString("Tests complete.\n");

  return 0;
}