第四章 PsoC程序设计示例4.1 A/D采集与LED显示 实验目的:实现A/D采集和LED显示,即在参考电压为5V的情况下,从外部输入0~5V电压 ,经过芯片处理后使LED逐个点亮。 实验步骤: 1):打开PSOC Designer,进入模块选择界面,选择12位的A/D转换器——ADCINC12,选择4个PWM8模块,以及一个PGA模块; 2):进入连接模块界面,将所有的模块安放,并将4个PWM8依次连接P20~P23四个I/O口; 3):配置模块参数,以及总资源参数; 4):所有配置及连接图如下所示: (图一)总资源配置,其他的都不变只是将VC1,VC2,VC3 以及VC3Divider配置为图中所示即可; 图(二)ADCINC12资源配置; 图(三)PGA_1资源配置; 图(四)PWM8_1资源配置; PWM8_2,PWM8_3,PWM8_4和PWM8_1的其他配置一样,只有CompareOut输出不同,依次选择Row_0_Output_0, Row_0_Output_1, Row_1_Output_2, Row_1_Output_3; 5):按照上述配置好资源后,即可以编写程序了,进入编写程序界面,输入下面程序: #include <m8c.h> // part specific constants and macros #include "PSoCAPI.h" // PSoC API definitions for all User Modules int iResult,n; // ADC result variable void main() { BYTE b,c; // BarGraph position PGA_1_Start(PGA_1_MEDPOWER); // Turn on PGA power ADCINC12_1_Start(ADCINC12_1_MEDPOWER); // Turn on ADC power ADCINC12_1_GetSamples(0); // Sample forever M8C_EnableGInt; // Enable Global interrupts while (1)// Main loop { if (ADCINC12_1_fIsDataAvailable() != 0) // If ADC sample is ready... { iResult = ADCINC12_1_iGetData(); // Get result, convert to unsigned and clear flag ADCINC12_1_ClearFlag(); n=(int)(iResult/512+2); switch(n) {case 0: PWM8_1_Stop(); //所有的LED都灭 PWM8_2_Stop(); PWM8_3_Stop(); PWM8_4_Stop(); break; case 1: //点亮一个LED PWM8_1_Start(); PWM8_1_EnableInt(); PWM8_2_Stop(); PWM8_3_Stop(); PWM8_4_Stop(); break; case 2: //点亮两个LED PWM8_2_Start(); PWM8_2_EnableInt(); PWM8_3_Stop(); PWM8_4_Stop(); break; case 3: //点亮三个LED PWM8_3_Start(); PWM8_3_EnableInt(); PWM8_4_Stop(); break; case 4: //点亮四个LED PWM8_4_Start(); PWM8_4_EnableInt(); break; } } } } 实验结果: 输入程序后调试好后即可以运行程序;在连接开发板和电脑后需要对软件进行设置:在project里选择setting,选择US B如下图: 在tools里的option里选择如下图: 当旋转电位器时可以看到四个LED将逐个被点亮或者熄灭。 4.2 数字脉宽调制PWM模块实验PSoC器件集成了8位和16位的通用可编程脉宽调制模块,脉宽调制模块通常要占用1~2个PSoC数字模块资源,这主要取决于要使用的PWM模块的位宽。它具有周期和脉宽编程实时修改的特点,模块的时钟和使能信号具有多个信号源,方便用户使用。 实验目的:通过本实验实现用PWM来控制,使LED闪烁; 实验步骤: 1):打开PSOC Designer,进入模块选择界面,选择四个PWM8模块; 2)::进入连接模块界面,安放模块,并将4个PWM8依次连接P20~P23四个I/O口; 3):配置模块参数,以及总资源参数; 4):所有配置及连接图如下所示: (图一)总资源配置,其他的都不变只是将VC1,VC2,VC3 以及VC3Divider配置为图中所示即可; 图(二)PWM资源配置; PWM8_2,PWM8_3,PWM8_4和PWM8_1的其他配置一样,只有CompareOut输出不同,依次选择Row_0_Output_0, Row_0_Output_1, Row_0_Output_2, Row_0_Output_3; 5):按照上述配置好资源后,即可以编写程序了,进入编写程序界面,输入下面程序: #include <m8c.h> // part specific constants and macros #include "PSoCAPI.h" // PSoC API definitions for all User Modules void main() { M8C_EnableGInt ; // Enable Global interrupts while(1){ PWM8_1_Start(); PWM8_2_Start(); PWM8_3_Start(); PWM8_4_Start(); PWM8_1_EnableInt(); PWM8_2_EnableInt(); PWM8_3_EnableInt(); PWM8_4_EnableInt(); } } 实验结果: 输入程序并调试,即可下载到芯片运行,当程序运行时,四个LED将闪烁。 4.3键盘中断和定时器溢出中断实验实验目的:通过本实验了解CY8C29466的键盘中断和定时器溢出中断的实现方法。 实验中用到的寄存器: (1) INT_MSKx寄存器 该寄存器的作用是使能各个中断源,使其能够产生未决中断。本例中要将INT_MSK0中的GPIO位初始化为1。 (2)INT_CLRx寄存器 该寄存器的作用是使能各个中断源,使其清除已产生的未决中断。本例中将INT_CLR0中的GPIO初始化为1。 (3)PRTxIE寄存器 端口中断使能寄存器,用来使能GPIO模块的中断。本例中将PRT1IE的Bit4初始化为1。 实验步骤: (1)打开PSoc Designer新建一个名为Timer_Keyboard_Int的工程。 (2)在Device Editor界面选择并放置一个8位定时器。分别设置Global Resources、Timer8_1和引脚P1[4]、P2[0]、P2[1]、P2[2]、P2[3]的相关参数如下图三个图所示。 (3)点击如下图所示的Generate Application按钮,生成与配置相应的代码。 (4)点击ApplicationEditor按钮,进入如下图所示的界面。打开main.c将下面的程序输入 #include <m8c.h> // part specific constants and macros #include "PSoCAPI.h" // PSoC API definitions for all User Modules #pragma interrupt_handler Timer #pragma interrupt_handler Keyboard int button,second,i,j; void Keyboard() { second=0; button=2; if(j==0) { Timer8_1_Start(); j++; } else { Timer8_1_Stop(); j=0; } } void Timer() { button=1; } void main() { button=0; second=0; j=0; Timer8_1_EnableInt(); INT_MSK0=0X20; PRT1IE = 0x18; INT_CLR0=0x20; M8C_EnableGInt; while(1){ if(button==1) { PRT2DR=0X0f; for(i=0;i<100000000000000;i++); PRT2DR=0X00; for(i=0;i<100000000000000;i++); } if(button==2) PRT2DR=0X00; } } 打开psocgpioint.asm文件,在PSoC_GPIO_ISR:后添加jmp _Keyboard;打开timer8_1int.asm文件,在_Timer8_1_ISR:后添加jmp _Timer。 (5)点击Execute the Program按钮,运行程序。该按钮如下图中的绿色箭头按钮所示。 实验结果: 程序开始运行,按下实验板上的键盘按钮,实验班上与P2[0]、P2[1]、P2[2]、P2[3]引脚相连的四个发光二极管开始闪烁;再按一下键盘按钮,四个发光二级管停止闪烁。 4.4 AD、DA和LED显示实验实验目的:通过本实验了解CY8C29466的数模和模数功能及其实现方法。 实验中用到的模块及其作用: (1)增益可编程放大器PGA,将P0[1]引脚输入的模拟量输出到AD模块的输入端; (2)12位AD模块,将输入的模拟量转换为-2048-2047的数字; (3)DA转换模块,将AD转换得出的数字转换为与AD的输入对应的电压值,通过P0[5]引脚输出。 实验步骤: (1)新建一个名为:AD_LED_DA的工程。 (2)放置一个PGA、一个12位AD模块、一个9位DA模块。 (3)按照下面的几个图设置各个参数。
(4)生成应用程序。 (5)打开main.c输入下面的代码: #include <m8c.h> // part specific constants and macros #include "PSoCAPI.h" // PSoC API definitions for all User Modules int i; void main() { M8C_EnableGInt; // Enable Global Interrupts PGA_1_Start(PGA_1_MEDPOWER); DAC9_1_Start(DAC9_1_FULLPOWER); ADCINC12_1_Start(ADCINC12_1_HIGHPOWER); // Apply power to the SC Block ADCINC12_1_GetSamples(0); // Have ADC run continuously for(;;){ while(ADCINC12_1_fIsDataAvailable() == 0); // Loop until value ready ADCINC12_1_ClearFlag(); // Clear ADC flag i=ADCINC12_1_iGetData(); // Get ADC result PRT2DR=(i+2048)/819.2+0.25; DAC9_1_WriteStall((i+2048)/8); } } (6)运行程序 实验结果: 旋转实验板上的电位计,可以看到实验板上与P2[0]、P2[1]、P2[2]、P2[3]相连的四个发光二极管显示的值会随着输入的电压值变化,用万用表测量P0[5]引脚的电压,会发现P0[5]引脚的电压基本上与输入的电压值相等,随输入的电压值的变化而变化。 |