Funpack 第七期 8位PIC®MCU开发板DM164137初玩
任务:通过按键扩展功能,分为按键点击(快速点击),短按(大于1秒),长按(大于5秒)用来控制板上LED显示。同时外接串口模块打印信息(包括按键信息,电位计信息)。
标签
MCU
都市木头
更新2021-04-20
1169

Funpack  第七期  8位PIC®MCU开发板DM164137初玩

 

 

从Digikey购买的这款编号为DM164137的开发板,由Microchip出品,支持自家的8、14、和20引脚8位PIC®MCU(随机自带PIC16F18446-P 微控制器)。这款开发板全称为Curiosity Low Pin Count (LPC),直译过来就是“好奇号低引脚数”开发板,说白了就是专为初学者设计的开发板。

Fg_NRAKs5-DIYz3DFKFmEI_Qzt6g

貌似初级,不过开发板还是有不少特点的:连接灵活,既有传统的全引脚双排扩展接口引出,还有专用的Mikrobus™插座,非常方便连线测试和扩展板扩展;资源丰富,搭配有mTouch按钮,电位器、按键开关以及用户LED灯等常用外设,还预留RN4020蓝牙模块接口;调试方便,带有USB接口的集成编程器/调试器,通过PICkit™板载调试器(PKOB),无需使用外部编程/调试工具;开发便捷,与MPLAB X IDE和MCC代码配置器无缝集成,且官网有丰富例程和示例代码,非常适合初学者入门。

 

FgUW0flDQHTBpyg58L2trM7O1CFg   既然是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元,还是挺贵的。

 

FkuRqDa2N5C-Z2_4mx628uLC_vCr     发现Funpack第七期活动延期了,算算有时间折腾,PIC单片机也没有玩过,就赶紧入手了。习惯性选一个保底任务开干吧。

 

一、功能实现     此次任务是:通过按键扩展功能,分为按键点击(快速点击),短按(大于1秒),长按(大于5秒)用来控制板上LED显示。同时外接串口模块打印信息(包括按键信息,电位计信息)。

FgRxOZ0o8JHtw4-jVrf3VKCSMyzv

根据任务描述,主要涉及以下外设资源:按键、LED灯、UART口(TX输出)、电位计,具体见图(箭头标示位)。

FkHH_w3cT5BWKvBbpliABcyNCLdf

 

 

结合电路图分析,可设计实现如下功能:按键(S1)按下瞬间D4灯亮起,松开时熄灭;按键(S1)按下大于1秒后再松开同时D5灯亮起;长按大于5秒后再松开同时D6灯亮起。在LED灯亮起同时,外接串口模块的PC端串口调试助手上打印按键状态信息和电位计数(0-255)信息。 为了体验MPLAB X IDE方便快捷的开发环境(偷懒),此次使用MCC代码配置器功能直接生成并使用其基础代码和功能函数(的确好用)。具体引脚及配置见下图。

FkW0t5MQrUvtz7l4qn8rJ48Jcu01FiwVhSEyXPfNjXtCVUpdcHqHvbKUFkGvyqAqfNj38ht3QeTR35wORXEq

 

 

 

      二、主要代码片段   代码实现,主要是参考官网的代码示例,主要代码片段及功能注释见下:

 

#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能够实现如此之多的功能,如果价格能够亲民些,还是有很大市场前景的。

 

最后还是要感谢硬禾团队提供此次学习的机会!

团队介绍
都是木头
评论
0 / 100
查看更多
目录
硬禾服务号
关注最新动态
0512-67862536
info@eetree.cn
江苏省苏州市苏州工业园区新平街388号腾飞创新园A2幢815室
苏州硬禾信息科技有限公司
Copyright © 2024 苏州硬禾信息科技有限公司 All Rights Reserved 苏ICP备19040198号