查看: 3318|回复: 1

PsoC程序设计示例

[复制链接]
  • TA的每日心情
    开心
    2012-12-13 12:47
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    发表于 2012-9-7 14:16:19 | 显示全部楼层 |阅读模式
    分享到:
    第四章 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]引脚的电压基本上与输入的电压值相等,随输入的电压值的变化而变化。
    回复

    使用道具 举报

    该用户从未签到

    发表于 2012-9-10 10:23:54 | 显示全部楼层
    你也玩psoc
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

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



    手机版|小黑屋|与非网

    GMT+8, 2024-11-22 17:33 , Processed in 0.120749 second(s), 17 queries , MemCache On.

    ICP经营许可证 苏B2-20140176  苏ICP备14012660号-2   苏州灵动帧格网络科技有限公司 版权所有.

    苏公网安备 32059002001037号

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.