Skip to content

Commit b5f7a7d

Browse files
committed
MPAE-19441 created and tested mplabx project, working as expected
1 parent 0b85ada commit b5f7a7d

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

55 files changed

+8054
-2
lines changed

README.md

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
<!-- Please do not change this logo with link -->
1+
<!-- MPAE-19441 Please do not change this logo with link -->
22

33
<a target="_blank" href="https://www.microchip.com/" id="top-of-page">
44
<picture>
@@ -8,8 +8,13 @@
88
</picture>
99
</a>
1010

11-
# Update the title for avr128db48-i2c-io-expander2-leds-and-buttons-callbacks-printf here
11+
# AVR128DB48 I2C_Host Example Component for CNano Explorer: I/O Expander 2 LEDs and BUTTONs (Callbacks, Printf)
1212

13+
When running the application, using the MPLAB Data Visualizer, you should see something similar to the following:
14+
![alt text](images/avr128db48-i2c-io-expander2-leds-and-buttons-callbacks-printf.png)
15+
16+
The following is the required MCC Melody configuration.
17+
![alt text](images/avr128db48-i2c-io-expander2-leds-and-buttons-callbacks-printf_configuration.png)
1318
<!-- This is where the introduction to the example goes, including mentioning the peripherals used -->
1419

1520
## Related Documentation
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
#
2+
# There exist several targets which are by default empty and which can be
3+
# used for execution of your targets. These targets are usually executed
4+
# before and after some main targets. They are:
5+
#
6+
# .build-pre: called before 'build' target
7+
# .build-post: called after 'build' target
8+
# .clean-pre: called before 'clean' target
9+
# .clean-post: called after 'clean' target
10+
# .clobber-pre: called before 'clobber' target
11+
# .clobber-post: called after 'clobber' target
12+
# .all-pre: called before 'all' target
13+
# .all-post: called after 'all' target
14+
# .help-pre: called before 'help' target
15+
# .help-post: called after 'help' target
16+
#
17+
# Targets beginning with '.' are not intended to be called on their own.
18+
#
19+
# Main targets can be executed directly, and they are:
20+
#
21+
# build build a specific configuration
22+
# clean remove built files from a configuration
23+
# clobber remove all built files
24+
# all build all configurations
25+
# help print help mesage
26+
#
27+
# Targets .build-impl, .clean-impl, .clobber-impl, .all-impl, and
28+
# .help-impl are implemented in nbproject/makefile-impl.mk.
29+
#
30+
# Available make variables:
31+
#
32+
# CND_BASEDIR base directory for relative paths
33+
# CND_DISTDIR default top distribution directory (build artifacts)
34+
# CND_BUILDDIR default top build directory (object files, ...)
35+
# CONF name of current configuration
36+
# CND_ARTIFACT_DIR_${CONF} directory of build artifact (current configuration)
37+
# CND_ARTIFACT_NAME_${CONF} name of build artifact (current configuration)
38+
# CND_ARTIFACT_PATH_${CONF} path to build artifact (current configuration)
39+
# CND_PACKAGE_DIR_${CONF} directory of package (current configuration)
40+
# CND_PACKAGE_NAME_${CONF} name of package (current configuration)
41+
# CND_PACKAGE_PATH_${CONF} path to package (current configuration)
42+
#
43+
# NOCDDL
44+
45+
46+
# Environment
47+
MKDIR=mkdir
48+
CP=cp
49+
CCADMIN=CCadmin
50+
RANLIB=ranlib
51+
52+
53+
# build
54+
build: .build-post
55+
56+
.build-pre:
57+
# Add your pre 'build' code here...
58+
59+
.build-post: .build-impl
60+
# Add your post 'build' code here...
61+
62+
63+
# clean
64+
clean: .clean-post
65+
66+
.clean-pre:
67+
# Add your pre 'clean' code here...
68+
# WARNING: the IDE does not call this target since it takes a long time to
69+
# simply run make. Instead, the IDE removes the configuration directories
70+
# under build and dist directly without calling make.
71+
# This target is left here so people can do a clean when running a clean
72+
# outside the IDE.
73+
74+
.clean-post: .clean-impl
75+
# Add your post 'clean' code here...
76+
77+
78+
# clobber
79+
clobber: .clobber-post
80+
81+
.clobber-pre:
82+
# Add your pre 'clobber' code here...
83+
84+
.clobber-post: .clobber-impl
85+
# Add your post 'clobber' code here...
86+
87+
88+
# all
89+
all: .all-post
90+
91+
.all-pre:
92+
# Add your pre 'all' code here...
93+
94+
.all-post: .all-impl
95+
# Add your post 'all' code here...
96+
97+
98+
# help
99+
help: .help-post
100+
101+
.help-pre:
102+
# Add your pre 'help' code here...
103+
104+
.help-post: .help-impl
105+
# Add your post 'help' code here...
106+
107+
108+
109+
# include project implementation makefile
110+
include nbproject/Makefile-impl.mk
111+
112+
# include project make variables
113+
include nbproject/Makefile-variables.mk

avr128db48-i2c-io-expander2-leds-and-buttons-callbacks-printf.X/avr128db48-i2c-io-expander2-leds-and-buttons-callbacks-printf.mc3

Lines changed: 284 additions & 0 deletions
Large diffs are not rendered by default.
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
/*
2+
© [2025] Microchip Technology Inc. and its subsidiaries.
3+
4+
Subject to your compliance with these terms, you may use Microchip
5+
software and any derivatives exclusively with Microchip products.
6+
You are responsible for complying with 3rd party license terms
7+
applicable to your use of 3rd party software (including open source
8+
software) that may accompany Microchip software. SOFTWARE IS ?AS IS.?
9+
NO WARRANTIES, WHETHER EXPRESS, IMPLIED OR STATUTORY, APPLY TO THIS
10+
SOFTWARE, INCLUDING ANY IMPLIED WARRANTIES OF NON-INFRINGEMENT,
11+
MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. IN NO EVENT
12+
WILL MICROCHIP BE LIABLE FOR ANY INDIRECT, SPECIAL, PUNITIVE,
13+
INCIDENTAL OR CONSEQUENTIAL LOSS, DAMAGE, COST OR EXPENSE OF ANY
14+
KIND WHATSOEVER RELATED TO THE SOFTWARE, HOWEVER CAUSED, EVEN IF
15+
MICROCHIP HAS BEEN ADVISED OF THE POSSIBILITY OR THE DAMAGES ARE
16+
FORESEEABLE. TO THE FULLEST EXTENT ALLOWED BY LAW, MICROCHIP?S
17+
TOTAL LIABILITY ON ALL CLAIMS RELATED TO THE SOFTWARE WILL NOT
18+
EXCEED AMOUNT OF FEES, IF ANY, YOU PAID DIRECTLY TO MICROCHIP FOR
19+
THIS SOFTWARE.
20+
*/
21+
/**
22+
* I2C_HOST EXAMPLE Generated Driver File
23+
*
24+
* @file i2c_host example.c
25+
*
26+
* @ingroup i2c_host example
27+
*
28+
* @version I2C_HOST EXAMPLE Example Version 1.0.0
29+
*
30+
* @brief Generated file for
31+
* Example: 3. I2C IO Expander 2 - LEDs and Buttons
32+
* Implementation: Interrupts with callbacks
33+
* Visualization: Printf
34+
* MCU Device family: AVR
35+
*/
36+
37+
#include "mcc_generated_files/system/system.h"
38+
#include <util/delay.h>
39+
40+
// Note: MCP23008 - 8-Bit I2C I/O Expander with I2C (& SPI) Serial Interface(s)
41+
// Reference to the MCP23008 data sheet: https://www.microchip.com/DS20001919
42+
// MCP23008 register addresses are in Table 1-2 (page 5) of the data sheet
43+
// The Curiosity Nano Explorer (EV58G97A) has 2 x MCP23008 IO Expanders
44+
45+
#define MCP23008_1_I2C_ADDRESS 0x25
46+
#define MCP23008_2_I2C_ADDRESS 0x24
47+
48+
#define MCP23008_IODIR 0x00
49+
#define MCP23008_IPOL 0x01
50+
#define MCP23008_GPINTEN 0x02 // INTERRUPT-ON-CHANGE CONTROL (GPINTEN) REGISTER, GPINTEN â?? enables the individual inputs
51+
#define MCP23008_DEFVAL 0x03 // DEFAULT COMPARE (DEFVAL) â?? holds the values that are compared against the associated input port values
52+
#define MCP23008_INTCON 0x04 // INTERRUPT CONTROL (INTCON) - Controls if the input values are compared against DEFVAL or the previous values on the portREGISTER:
53+
#define MCP23008_IOCON 0x05 // IOCON (ODR and INPOL) â?? configures the INT pin as push-pull, open-drain and active-level
54+
#define MCP23008_GPPU 0x06
55+
#define MCP23008_INTF 0x07 // INTERRUPT FLAG (INTF) REGISTER: 1 = Pin caused interrupt
56+
#define MCP23008_INTCAP 0X08
57+
#define MCP23008_GPIO 0x09
58+
#define MCP23008_OLAT 0x0A
59+
60+
void MCP23008_InterruptHandler(void);
61+
void IO_ResetHandler(void);
62+
uint8_t MCP23008_Read(uint8_t i2c_address, uint8_t reg, uint8_t* data);
63+
uint8_t MCP23008_Write(uint8_t i2c_address, uint8_t reg, uint8_t data);
64+
void printButtonPressed(int pressedButton);
65+
void button_led_control(void);
66+
67+
static volatile bool interruptFlag = false;
68+
static volatile bool resetFlag = false;
69+
// All joystick pins re-mapped as they are not connected to Curiosity Nano GPIO by default
70+
static const char* buttonLabels[8] = {"J-UP", "J-LEFT", "J-DOWN", "J-RIGHT", "J-PUSH", "SW3", "SW2", "SW1"};
71+
72+
void MCP23008_InterruptHandler(void)
73+
{
74+
interruptFlag = true;
75+
}
76+
77+
void IO_ResetHandler(void)
78+
{
79+
resetFlag = true;
80+
}
81+
82+
uint8_t MCP23008_Read(uint8_t i2c_address, uint8_t reg, uint8_t* data)
83+
{
84+
uint8_t errorState = I2C_ERROR_NONE;
85+
size_t txLength = 1;
86+
size_t rxLength = 1;
87+
uint8_t txBuffer[1] = {0};
88+
txBuffer[0] = reg; // I2C Client register to read from
89+
90+
I2C_Host.WriteRead((uint16_t)(i2c_address), txBuffer, txLength, data, rxLength);
91+
while (I2C_Host.IsBusy())
92+
{
93+
}
94+
errorState = I2C_Host.ErrorGet();
95+
return errorState;
96+
}
97+
98+
99+
uint8_t MCP23008_Write(uint8_t i2c_address, uint8_t reg, uint8_t data)
100+
{
101+
uint8_t errorState = I2C_ERROR_NONE;
102+
size_t txLength = 2;
103+
uint8_t txBuffer[2] = {0};
104+
105+
txBuffer[0] = reg; // I2C Client register to write to
106+
txBuffer[1] = data;
107+
108+
// write data over I2C, txLength specifies amounts of bytes from txBuffer
109+
I2C_Host.Write((uint16_t)i2c_address, txBuffer, txLength);
110+
while (I2C_Host.IsBusy())
111+
{
112+
}
113+
errorState = I2C_Host.ErrorGet();
114+
return errorState;
115+
}
116+
117+
void printButtonPressed(int pressedButton) {
118+
if (pressedButton >= 0 && pressedButton < 8) {
119+
(int) printf("Button pressed: %s\n", buttonLabels[pressedButton]);
120+
} else {
121+
(int) printf("Invalid button pressed\n");
122+
}
123+
}
124+
125+
void button_led_control(void)
126+
{
127+
uint8_t pressedButton = 0;
128+
uint8_t mcp23008_1_LEDs = 0;
129+
uint8_t mcp23008_2_Inputs = 0;
130+
131+
(uint8_t) MCP23008_Write(MCP23008_1_I2C_ADDRESS, MCP23008_IODIR, 0x00);
132+
(uint8_t) MCP23008_Write(MCP23008_1_I2C_ADDRESS, MCP23008_GPIO, 0x00);
133+
(uint8_t) MCP23008_Write(MCP23008_2_I2C_ADDRESS, MCP23008_IODIR, 0xFF); // Set IO-expander 2 pins as inputs
134+
(uint8_t) MCP23008_Write(MCP23008_2_I2C_ADDRESS, MCP23008_GPPU, 0xFF); // Set pull-up for all pins of IO-expander 2
135+
(uint8_t) MCP23008_Write(MCP23008_2_I2C_ADDRESS, MCP23008_INTCON, 0x00); // 0 - Interrupt on change, 1 = If a bit is set, the corresponding I/O pin is compared against the associated bit in the DEFVAL register.
136+
(uint8_t) MCP23008_Write(MCP23008_2_I2C_ADDRESS, MCP23008_GPINTEN, 0xFF); // 1 = Enable GPIO input pin for interrupt-on-change event on all pins
137+
138+
(uint8_t) MCP23008_Read(MCP23008_2_I2C_ADDRESS, MCP23008_INTCAP, &mcp23008_2_Inputs); // Read INTCAP register to clear IO-expander interrupt
139+
interruptFlag = false;
140+
uint8_t GPINTEN_value;
141+
(int) printf("Default inputs: 0x%02X\n", mcp23008_2_Inputs);
142+
143+
while (!resetFlag) // Run until Reset SW is pressed
144+
{
145+
if (interruptFlag) // if an interrupt on the IO Exapander has occurred
146+
{
147+
interruptFlag = false; // Clear interrupt flag
148+
(uint8_t) MCP23008_Read(MCP23008_2_I2C_ADDRESS, MCP23008_INTF, &mcp23008_2_Inputs); // read INTF register to see which button triggered the interrupt
149+
150+
for (uint8_t i = 0U; i < 8U; i++) // find out which bit was set and convert it to a position number (0-7).
151+
{
152+
if ((mcp23008_2_Inputs >> i) && 0x01)
153+
{
154+
pressedButton = i;
155+
}
156+
}
157+
mcp23008_1_LEDs = (mcp23008_1_LEDs | (1U << (pressedButton)));
158+
(uint8_t) MCP23008_Write(MCP23008_1_I2C_ADDRESS, MCP23008_GPIO, mcp23008_1_LEDs); //Set IO-expander 1 pins low
159+
(uint8_t) MCP23008_Read(MCP23008_2_I2C_ADDRESS, MCP23008_GPINTEN, &GPINTEN_value); // Disable Interrupt on pin for pressed button
160+
161+
GPINTEN_value &= ~(1U << pressedButton);
162+
(uint8_t) MCP23008_Write(MCP23008_2_I2C_ADDRESS, MCP23008_GPINTEN, GPINTEN_value);
163+
(uint8_t) MCP23008_Read(MCP23008_2_I2C_ADDRESS, MCP23008_INTCAP, &mcp23008_2_Inputs); // Read INTCAP register to clear IO-expander interrupt
164+
165+
printButtonPressed(pressedButton);
166+
IO_LED_SetHigh(); //Turn off LED when finished.
167+
}
168+
}
169+
}
170+
171+
int main(void)
172+
{
173+
_delay_ms(200); // Prevent program running when programming
174+
SYSTEM_Initialize();
175+
IO_Reset_SetInterruptHandler((void *) IO_ResetHandler);
176+
IO_IOExpander2_IRQ_SetInterruptHandler((void *) MCP23008_InterruptHandler); // BUTTON INT pin is the label for the I/O expander 2 interrupt pin
177+
(int) printf("Example: 3. I2C IO Expander 2 - LEDs and Buttons, Implementation: Interrupts with callbacks, Visualization: Printf \r\n");
178+
(int) printf("MCU Device family: AVR \r\n");
179+
(int) printf("Press Curiosity Nano Explorer touch buttons and use Joystick to turn off all LEDS. Press SW0 on Curiosity Nano to exit. \r\n\r\n");
180+
181+
while (1)
182+
{
183+
IO_LED_SetLow(); // Turn off LED during button_led_control()
184+
button_led_control();
185+
186+
// Check if the reset flag is set
187+
if (resetFlag)
188+
{
189+
resetFlag = false; // Clear the reset flag
190+
(int) printf("Reset flag set, restarting button_led_control() \r\n\r\n");
191+
}
192+
}
193+
return 0;
194+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# This file has been autogenerated by MPLAB Code Configurator. Please do not edit this file.
2+
3+
manifest_file_version: 1.0.0
4+
project: avr128db48-i2c-io-expander2-leds-and-buttons-callbacks-printf
5+
creation_date: 2025-04-12T13:18:55.571+02:00[Europe/Berlin]
6+
operating_system: Windows 11
7+
mcc_mode: IDE
8+
mcc_mode_version: v6.25
9+
device_name: AVR128DB48
10+
compiler: XC8 3.00
11+
mcc_version: 5.5.2
12+
mcc_core_version: 5.7.1
13+
content_manager_version: 5.0.1
14+
is_mcc_offline: false
15+
is_using_prerelease_versions: true
16+
mcc_content_registries: https://registry.npmjs.org/,https://artifacts.microchip.com/artifactory/api/npm/npm/
17+
device_library: {library_class: com.microchip.mcc.melody.Library, name: Melody, version: 2.9.0-feat.24}
18+
packs: {name: AVR-Dx_DFP, version: 2.7.321}
19+
modules:
20+
- {name: '@mchp-mcc/avr-8bit', type: MELODY, version: 4.13.1-dev.4}
21+
- {name: '@mchp-mcc/avr8-configuration-bits-v1', type: MELODY, version: 4.3.0}
22+
- {name: '@mchp-mcc/avr8-pin-manager', type: MELODY, version: 4.6.1}
23+
- {name: '@mchp-mcc/delay-blocking-driver', type: MELODY, version: 3.2.0}
24+
- {name: '@mchp-mcc/example-i2c-host', type: MELODY, version: 1.0.0}
25+
- {name: '@mchp-mcc/i2c-host-driver', type: MELODY, version: 1.1.0-dev.1}
26+
- {name: '@mchp-mcc/main-manager', type: MELODY, version: 3.1.2}
27+
- {name: '@mchp-mcc/pin-content-processor', type: MELODY, version: 3.9.1-feat.6}
28+
- {name: '@mchp-mcc/scf-avr8-clkctrl-v3', type: MELODY, version: 2.1.0-dev.1}
29+
- {name: '@mchp-mcc/scf-avr8-interrupt-v1', type: MELODY, version: 5.0.13-dev.1}
30+
- {name: '@mchp-mcc/scf-avr8-twi-v1', type: MELODY, version: 8.2.0}
31+
- {name: '@mchp-mcc/scf-avr8-usart-v1', type: MELODY, version: 10.2.1}
32+
- {name: '@mchp-mcc/uart-driver', type: MELODY, version: 1.10.2}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
# This file has been autogenerated by MPLAB Code Configurator. Please do not edit this file.
2+
3+
manifest_file_version: 1.0.0
4+
project: avr128db48-i2c-io-expander2-leds-and-buttons-callbacks-printf
5+
creation_date: 2025-04-12T12:37:08.514+02:00[Europe/Berlin]
6+
operating_system: Windows 11
7+
mcc_mode: IDE
8+
mcc_mode_version: v6.25
9+
device_name: AVR128DB48
10+
compiler: XC8 3.00
11+
mcc_version: 5.5.2
12+
mcc_core_version: 5.7.1
13+
content_manager_version: 5.0.1
14+
is_mcc_offline: false
15+
is_using_prerelease_versions: true
16+
mcc_content_registries: https://registry.npmjs.org/,https://artifacts.microchip.com/artifactory/api/npm/npm/
17+
device_library: {library_class: com.microchip.mcc.melody.Library, name: Melody, version: 2.9.0-feat.24}
18+
packs: {name: AVR-Dx_DFP, version: 2.7.321}
19+
modules:
20+
- {name: '@mchp-mcc/avr-8bit', type: MELODY, version: 4.13.1-dev.4}
21+
- {name: '@mchp-mcc/avr8-configuration-bits-v1', type: MELODY, version: 4.3.0}
22+
- {name: '@mchp-mcc/avr8-pin-manager', type: MELODY, version: 4.6.1}
23+
- {name: '@mchp-mcc/delay-blocking-driver', type: MELODY, version: 3.2.0}
24+
- {name: '@mchp-mcc/example-i2c-host', type: MELODY, version: 1.0.0}
25+
- {name: '@mchp-mcc/i2c-host-driver', type: MELODY, version: 1.1.0-dev.1}
26+
- {name: '@mchp-mcc/main-manager', type: MELODY, version: 3.1.2}
27+
- {name: '@mchp-mcc/pin-content-processor', type: MELODY, version: 3.9.1-feat.6}
28+
- {name: '@mchp-mcc/scf-avr8-clkctrl-v3', type: MELODY, version: 2.1.0-dev.1}
29+
- {name: '@mchp-mcc/scf-avr8-interrupt-v1', type: MELODY, version: 5.0.13-dev.1}
30+
- {name: '@mchp-mcc/scf-avr8-twi-v1', type: MELODY, version: 8.2.0}
31+
- {name: '@mchp-mcc/scf-avr8-usart-v1', type: MELODY, version: 10.2.1}
32+
- {name: '@mchp-mcc/uart-driver', type: MELODY, version: 1.10.2}

0 commit comments

Comments
 (0)