Funpack 第七期 8位PIC®MCU开发板DM164137初玩
从Digikey购买的这款编号为DM164137的开发板,由Microchip出品,支持自家的8、14、和20引脚8位PIC®MCU(随机自带PIC16F18446-P 微控制器)。这款开发板全称为Curiosity Low Pin Count (LPC),直译过来就是“好奇号低引脚数”开发板,说白了就是专为初学者设计的开发板。
貌似初级,不过开发板还是有不少特点的:连接灵活,既有传统的全引脚双排扩展接口引出,还有专用的Mikrobus™插座,非常方便连线测试和扩展板扩展;资源丰富,搭配有mTouch按钮,电位器、按键开关以及用户LED灯等常用外设,还预留RN4020蓝牙模块接口;调试方便,带有USB接口的集成编程器/调试器,通过PICkit™板载调试器(PKOB),无需使用外部编程/调试工具;开发便捷,与MPLAB X IDE和MCC代码配置器无缝集成,且官网有丰富例程和示例代码,非常适合初学者入门。
既然是PIC®MCU开发板,也要了解下板载的PIC16F18446-P微控制器,它是RISC架构微控制器,8位内核,主频达32MHz;28Kbyte 程序Flash存储,2KB数据SRAM存储,256B EEPROMDIP20封装,最大18个可用IO;支持计时器、比较器、PWM、UART、I2C、SPI接口;12位带计算功能ADC,5位DAC;集成温度传感器模块;同时支持内存访问分区,可保护代码安全;支持3.3V和5V供电;支持超低功耗,睡眠状态最低500nA电流,多种省电工作模式等。不过从Digikey上采购单价需要15元,还是挺贵的。
发现Funpack第七期活动延期了,算算有时间折腾,PIC单片机也没有玩过,就赶紧入手了。习惯性选一个保底任务开干吧。
一、功能实现 此次任务是:通过按键扩展功能,分为按键点击(快速点击),短按(大于1秒),长按(大于5秒)用来控制板上LED显示。同时外接串口模块打印信息(包括按键信息,电位计信息)。
根据任务描述,主要涉及以下外设资源:按键、LED灯、UART口(TX输出)、电位计,具体见图(箭头标示位)。
结合电路图分析,可设计实现如下功能:按键(S1)按下瞬间D4灯亮起,松开时熄灭;按键(S1)按下大于1秒后再松开同时D5灯亮起;长按大于5秒后再松开同时D6灯亮起。在LED灯亮起同时,外接串口模块的PC端串口调试助手上打印按键状态信息和电位计数(0-255)信息。 为了体验MPLAB X IDE方便快捷的开发环境(偷懒),此次使用MCC代码配置器功能直接生成并使用其基础代码和功能函数(的确好用)。具体引脚及配置见下图。
二、主要代码片段 代码实现,主要是参考官网的代码示例,主要代码片段及功能注释见下:
#include "mcc_generated_files/mcc.h"
uint8_t btnState = 0;
uint16_t Count = 0;
static uint8_t adcResult;
void checkButtonS1(void);
// 主函数
void main(void)
{
// initialize the device
SYSTEM_Initialize();
__delay_ms(100);
printf("Welcome to Curiosity!\r\n");
while (1)
{
// 检测按键状态
checkButtonS1();
if (btnState == 1) {
D4_RA5_SetHigh(); // 如果按键按下D4点亮
Count++;
continue; //循环计数
} else if (btnState == 0 && Count > 1){ //如果按键释放
D4_RA5_SetLow(); //D4熄灭
printf("---- ");
if (Count > 500) {
printf("Long_PRESSED! "); //长按输出按键信息
D6_RA2_SetHigh(); //D6点亮
} else if (Count > 50){
printf("Short_PRESSED! "); //短按输出按键信息
D5_RA1_SetHigh(); //D5点亮
}else {
printf("Click! "); //点按输出按键信息
}
// 输出电位计信息
adcResult = ADCC_GetSingleConversion(POT1_ANC0) >> 12;
printf("ADC Result: %d\n\r", ADRES >> 4);
Count = 0;
}
}
}
// 检测按键按下或释放状态并去抖动
void checkButtonS1(void) {
if (S1_RC4_GetValue() == LOW) {
__delay_ms(10);
if (S1_RC4_GetValue() == LOW) {
btnState = 1;
} else if (S1_RC4_GetValue() == HIGH) {
__delay_ms(10);
if (S1_RC4_GetValue() == HIGH) {
btnState = 0;
}
}
}
}
三、心得体会
用MCC配置初始代码非常方便,配置好外设资源后就可以自动生成初始化函数,生成的功能函数直接使用就行,因为功能简单也没有发现内存使用问题。
不过即使初步实现了任务功能,但是还是有些问题没有很好的解决,比如初始上电时在第一行输出信息中会出现乱码(复位没有乱码),即使加了延迟也不能完全解决,不知道有没有其他解决办法。电位器ADC转换我是直接使用例程中的代码改的,具体功能原理并没有搞明白,比如代码中的ADRES是如何实现的还没搞清楚。
任务中主要是基本的按键、点灯和ADC功能的使用,还有mTouch按钮没有用起来,比较器、PWM、UART、I2C、SPI接口,5位DAC、温度传感器、代码安全保护、超低功耗等功能都没有来得及测试,Mikrobus™100多种扩展板可玩性应该还是很高的(同时搭购了一个携带VEML3328色彩传感器的Color 10 Click),后面有时间再测试吧。8位MCU能够实现如此之多的功能,如果价格能够亲民些,还是有很大市场前景的。
最后还是要感谢硬禾团队提供此次学习的机会!