打印
[PIC®/AVR®/dsPIC®产品]

使用MCC学习PIC单片机 – CLC 可配置逻辑单元

[复制链接]
3068|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 oxygenzz 于 2019-3-29 16:58 编辑

CLC 可配置逻辑单元,在很多PIC单片机中有配备。
例如PIC16F18446中,就有四个CLC模块(CLC1/2/3/4)。它的作用是对内部外部信号提供逻辑操作。

工作原理
我们仍然通过比较MCC软件配置界面与数据手册上的功能模块图,来理解模块的工作原理。

两张图如下,红色的文字给出功能描述和对应的配置,在两张图上是一一对应的。根据数字,可以容易的将它们对应起来。



输入源最多有64种,每个CLC模块最多能选4种,数据源可重复选择。

选择出来的数据源在四输入门控逻辑中进行与/与非//或非(可选择)操作,在MCC界面上,这一过程,表达为输入逻辑选择和门控7”中的4个四输入逻辑门。经门控,出来的结果是lcxg1/2/3/4 四路信号。


这四路信号进入逻辑功能方框。8种逻辑功能,在MCC界面上,由下拉框选择。有组合逻辑,也有时序逻辑。


逻辑功能输出的结果,由使能配置EN来决定其输出是否可以进入后面的电路,进而发挥作用。而且输出的结果的可以正向或负向,由输出极性控制。

CLC输出可产生中断,分别或者同时识别上升沿/下降沿。
模块图中蓝色文字描述的部分,展示了CLC信号除了产生中断之外的其他输出路径:
1.     锁存在D触发器中,供软件寄存器查询当前CLC输出状态(读CLCDATA)
2.     CLCx_out 输出到其他外设,做下一级外设的触发信号,或输入信号,以实现CIP操作

3.     经PPS选控后,经IO口输出,TRIS要将该IO口设置为输出状态



代码解读

按照上图配置,MCC生成代码 , clc1.c 文件在工程的“MCC Generated Files”目录下。

代码很简洁,只有三个函数:
void CLC1_Initialize(void);//初始化
void CLC1_ISR(void);//中断处理程序
bool CLC1_OutputStatusGet(void);//CLC 输出状态查询

初始化代码,已经自动加入到系统初始化函数SYSTEM_Initialize()中,并且在主函数中进行了调用。
CLCx_ISR() 当中断触发时执行。
CLC1_OutputStatusGet() 由用户调用,查询当前输出状态。


void CLC1_Initialize(void)
{
    // Set the CLC1 to theoptions selected in the User Interface
    // LC1G1POL inverted;LC1G2POL not_inverted; LC1G3POL inverted; LC1G4POL not_inverted; LC1POLinverted;
    CLC1POL = 0x85;
    // LC1D1S CLCIN0(CLCIN0PPS);
    CLC1SEL0 = 0x00;
    // LC1D2S HFINTOSC;
    CLC1SEL1 = 0x05;
    // LC1D3S IOCIF setsignal;
    CLC1SEL2 = 0x1E;
    // LC1D4S CLC3_OUT;
    CLC1SEL3 = 0x22;
    // LC1G1D3N disabled;LC1G1D2N disabled; LC1G1D4N disabled; LC1G1D1T enabled; LC1G1D3T disabled;LC1G1D2T disabled; LC1G1D4T enabled; LC1G1D1N disabled;
    CLC1GLS0 = 0x82;
    // LC1G2D2N disabled;LC1G2D1N disabled; LC1G2D4N disabled; LC1G2D3N disabled; LC1G2D2T enabled;LC1G2D1T disabled; LC1G2D4T disabled; LC1G2D3T disabled;
    CLC1GLS1 = 0x08;
    // LC1G3D1N disabled;LC1G3D2N disabled; LC1G3D3N disabled; LC1G3D4N disabled; LC1G3D1T disabled;LC1G3D2T enabled; LC1G3D3T enabled; LC1G3D4T disabled;
    CLC1GLS2 = 0x28;
    // LC1G4D1N disabled;LC1G4D2N disabled; LC1G4D3N disabled; LC1G4D4N disabled; LC1G4D1T disabled;LC1G4D2T disabled; LC1G4D3T enabled; LC1G4D4T enabled;
    CLC1GLS3 = 0xA0;
    // LC1EN enabled; INTNenabled; INTP enabled; MODE 2-input D flip-flop with R;
    CLC1CON = 0x9D;
    // Clear the CLC interruptflag
    PIR5bits.CLC1IF = 0;
    // Enabling CLC1interrupt.
    PIE5bits.CLC1IE = 1;
}
void CLC1_ISR(void)
{
    // Clear the CLC interruptflag
    PIR5bits.CLC1IF = 0;
}
bool CLC1_OutputStatusGet(void)
{
   return(CLC1CONbits.LC1OUT);

}



使用特权

评论回复
沙发
零三翟邢止胃| | 2019-3-30 08:19 | 只看该作者
感谢分享啊! 真是不错啊!真是个好帖子!我要顶住啊! 赞一个啊!

使用特权

评论回复
板凳
talktea| | 2019-3-30 12:49 | 只看该作者
利用MPLAB X IDE的免费插件MCC,可以很大程度上减小CLC模组设计的工作量。推荐~

使用特权

评论回复
地板
CoolSilicon| | 2019-4-2 08:45 | 只看该作者
加油加油!!!还有16个MCC外设模块等着你!

使用特权

评论回复
5
pullyi| | 2022-7-19 12:43 | 只看该作者
谢谢分享,学习了

使用特权

评论回复
6
vivilyly| | 2022-11-6 19:23 | 只看该作者
cLc指令什么时候使用?                 

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

46

主题

190

帖子

11

粉丝