1回答

0收藏

PsoC程序设计示例

英飞凌 英飞凌 3707 人阅读 | 1 人回复 | 2012-09-07

第四章 PsoC程序设计示例4.1 A/D采集与LED显示
实验目的:实现A/D采集和LED显示,即在参考电压为5V的情况下,从外部输入0~5V电压   ,经过芯片处理后使LED逐个点亮。
实验步骤:
1):打开PSOC Designer,进入模块选择界面,选择12位的A/D转换器——ADCINC12,选择4PWM8模块,以及一个PGA模块;
2):进入连接模块界面,将所有的模块安放,并将4PWM8依次连接P20~P23四个I/O口;
3):配置模块参数,以及总资源参数;
4):所有配置及连接图如下所示:            
(图一)总资源配置,其他的都不变只是将VC1VC2VC3 以及VC3Divider配置为图中所示即可;
      
图(二)ADCINC12资源配置;
图(三)PGA_1资源配置;
图(四)PWM8_1资源配置;
PWM8_2,PWM8_3,PWM8_4PWM8_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~2PSoC数字模块资源,这主要取决于要使用的PWM模块的位宽。它具有周期和脉宽编程实时修改的特点,模块的时钟和使能信号具有多个信号源,方便用户使用。
实验目的:通过本实验实现用PWM来控制,使LED闪烁;
实验步骤:
1):打开PSOC Designer,进入模块选择界面,选择四个PWM8模块;
2)::进入连接模块界面,安放模块,并将4PWM8依次连接P20~P23四个I/O口;
3):配置模块参数,以及总资源参数;
4):所有配置及连接图如下所示:
(图一)总资源配置,其他的都不变只是将VC1VC2VC3 以及VC3Divider配置为图中所示即可;
图(二)PWM资源配置;
PWM8_2,PWM8_3,PWM8_4PWM8_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
2INT_CLRx寄存器
该寄存器的作用是使能各个中断源,使其清除已产生的未决中断。本例中将INT_CLR0中的GPIO初始化为1
3PRTxIE寄存器
端口中断使能寄存器,用来使能GPIO模块的中断。本例中将PRT1IEBit4初始化为1
实验步骤:
1)打开PSoc Designer新建一个名为Timer_Keyboard_Int的工程。
2)在Device Editor界面选择并放置一个8位定时器。分别设置Global ResourcesTimer8_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  ADDALED显示实验
实验目的:通过本实验了解CY8C29466的数模和模数功能及其实现方法。
实验中用到的模块及其作用
1)增益可编程放大器PGA,将P0[1]引脚输入的模拟量输出到AD模块的输入端;
212AD模块,将输入的模拟量转换为-2048-2047的数字;
3DA转换模块,将AD转换得出的数字转换为与AD的输入对应的电压值,通过P0[5]引脚输出。
实验步骤:
1)新建一个名为:AD_LED_DA的工程。
2)放置一个PGA、一个12AD模块、一个9DA模块。
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]引脚的电压基本上与输入的电压值相等,随输入的电压值的变化而变化。
分享到:
回复

使用道具 举报

回答|共 1 个

倒序浏览

沙发

噗噗熊

发表于 2012-9-10 10:23:54 | 只看该作者

你也玩psoc
您需要登录后才可以回帖 注册/登录

本版积分规则

关闭

站长推荐上一条 /3 下一条