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