nemon

【PSoC4】关于电灯泡,关于合体……

0
阅读(2369)
上学时和全班小伙伴去划船,3人一组,结果和我一组的童鞋在船上开始远眺另外一组,然后积极讨论:某某分组时动作慢了点,成电灯泡了,多么尴尬云云。作为一单纯的好学少年,我就是从那时开始学习什么叫“电灯泡”的。记得当时船上的讨论结果是宁可不玩,也不做电灯泡,活受罪。后来我大了点了,在新的学校有了新的认识——宿舍某男Z,看另一男L的中学女同学Q很顺眼,于是在Q回家时借口去L家同坐一辆车,L自知成灯泡一枚,主动和Z换位置,然Z未果。后Z托L多次制造机会、帮助牵线等等。终于,L和Q去修正果去了……可见灯泡也可以华丽丽地逆袭滴。

关于psoc4的官方Example,可以看到,四个里前面两个都是点亮LED的,也就是说——点电灯泡的,而另外2个一个是按键中断、另一个是触摸按键。闲的时候,把这4个拼在一起,做了个调色灯泡——Examples,合体!

先看一下全貌。因为要用Capsense分别调整RGB3个不同LED的亮度,因此增加了一个ControlReg:

下面分开说:

1】按键中断:


psoc里用中断来响应按键,以前月之骑士讨论过2种方式,这里貂尾续狗罗嗦一下:像上图这种方式,需要在中断响应函数里手工调用一下对应Pin的清中断函数,详细的可以看本文末附的代码;如果是把下图中HW Connection选中的话,就可以把isr直接连到pin上,但是在本例中,由于响应的是上升段,所以在加电初始化时触发一次,有利有弊,看应用上的需要了。



2】电容触摸


这个真没什么可说的了,Cypress看家本领,配合Creator使用,不改名字的话几乎不用键盘,像下面直接按一下“Add”的按钮,连参数都是按Kit上的预设的不用改。

3】PWM这里为了配合Capsense,Period配成100,亮一点儿。

4】ControlReg

由于准备用ControlReg来控制LED Pin是否输出,Pin要选上“OutputEnable”:


ControlReg配3输出


看视频吧:

看,顶个华丽丽灯泡的合体——像不像这位?


附代码:


#include <device.h>
#define NO_FINGER 0xFFFFu
#define USER_KEY_FUNCTION userKeyInterrupt
CY_ISR_PROTO(USER_KEY_FUNCTION); 

int button_stat=0;

void main()
{    
	uint16 sliderPosition = NO_FINGER;
    isr_key_Start(); 
    isr_key_SetVector(USER_KEY_FUNCTION); 

    CyGlobalIntEnable;

	PWM_Red_Start();
	PWM_Green_Start();
	PWM_Blue_Start();
    
	Clock_PWM_Start();
    
    CapSense_Start();
    
    CapSense_InitializeAllBaselines();
    
    for(;;)
    {
		CapSense_UpdateEnabledBaselines();
	    CapSense_ScanEnabledWidgets();
		while(CapSense_IsBusy());
		sliderPosition = CapSense_GetCentroidPos(CapSense_LINEARSLIDER0__LS);

        switch(button_stat){
        case 0:
            Control_Reg_color_Write(4+2+1);
            break;
        case 1:
            Control_Reg_color_Write(4+0+0);
    		if(sliderPosition != NO_FINGER)PWM_Blue_WriteCompare(sliderPosition);
            break;
        case 2:
            Control_Reg_color_Write(0+2+0);
    		if(sliderPosition != NO_FINGER)PWM_Green_WriteCompare(sliderPosition);
            break;
        case 3:
            Control_Reg_color_Write(0+0+1);
    		if(sliderPosition != NO_FINGER)PWM_Red_WriteCompare(sliderPosition);
            break;
        default:
            break;
        }
    }
}
CY_ISR(USER_KEY_FUNCTION) 
{ 
  isr_key_Disable();
  KEY_ClearInterrupt();
  button_stat=(button_stat>=3)?0:button_stat+1;
  isr_key_Enable();
}