|
3楼
楼主 |
发表于 2009-4-23 20:34:28
|
只看该作者
主要源代码, 目前功能还不够完善
/**---------------------版权 / Copyright (c)----------------------------------------------***
*** 作者 / Author: akin ***
*** 邮件 / E-mail: jenkinyan@163.com ***
*** ***
***---------------------------------------------------------------------------------------***
*** 创 建 人: akin ***
*** 创建日期: ***
*** 创建版本: ***
*** 文件描述: ***
***---------------------------------------------------------------------------------------***
*** 修 订 人: ***
*** 修订日期: ***
*** 修订版本: ***
*** 修订描述: ***
***---------------------------------------------------------------------------------------**/
#include "config.h"
#include <stdio.h>
/********************************************************/
/* */
/* 任务同步的握手信号 和 共享数据 */
/* */
/********************************************************/
/********************************************************/
/* */
/* 任务配置:堆栈大小、优先级别 */
/* */
/********************************************************/
#define TASK_INIT_STKLEN 512
#define TASK_INIT_PRIO 9
OS_STK TaskInitStk [TASK_INIT_STKLEN];
/********************************************************/
/* */
/* 主程序和起始(初始化)任务 */
/* */
/********************************************************/
void TaskInit(void *pdata);
int main (void)
{
OSInit();
OSTaskCreate(TaskInit, (void *)0, &TaskInitStk[TASK_INIT_STKLEN - 1], TASK_INIT_PRIO);
OSStart();
return 0;
}
void SysInit(void)
{
TargetInit(); VBusInit();
VBUS_RST_CLR(); OSTimeDly(OS_TICKS_PER_SEC / 10);
VBUS_RST_SET(); OSTimeDly(OS_TICKS_PER_SEC / 20);
LcdInit();
#if OS_TASK_STAT_EN > 0
OSStatInit();
#endif
}
#define OSC_MAX_SAMPLE_RATE 100000
#define OSC_WINDOW_XMAX 90
static volatile uint8 Wave[OSC_WINDOW_XMAX];
static volatile uint8 Units = 0;
static volatile uint8 SampStart = 0;
static volatile uint8 TrigState = 0;
static volatile uint8 TrigValue = 32;
static volatile int8 TrigMethor = 0;
static volatile uint32 SampleRate = 1000;
static volatile uint8 Multiply = 128;
void AdcInit(uint32 sps)
{
OS_ENTER_CRITICAL();
PCONP |= (1 << 12); // 打开ADC的功率控制位
PINSEL1 &= (~(3U << 28)) | (1 << 28); // P0.30连接到AD0.3
PINSEL1 = 1 << 28;
/* 设置MAT1.0匹配翻转 */
T1MCR = 0x02; // 设置T1MR0匹配后将T1TC复位
T1EMR = 3 << 4; // T1MR0匹配后MAT1.0输出翻转
T1MR0 = Fpclk/(2 * sps); // 输出频率周期控制, 定时0.25s钟MAT1.0翻转一次
T1TCR = 0x03; // 启动并复位T1TC
T1TCR = 0x01;
/* 进行ADC模块设置 */
ADCR = (1 << 3) | // SEL=8,选择通道3
((Fpclk / 4400000 - 1) << 8) | // CLKDIV=Fpclk/1000000-1,转换时钟为1MHz
(0 << 16) | // BURST=0,软件控制转换操作
(0 << 17) | // CLKS=0, 使用11clock转换
(1 << 21) | // PDN=1,正常工作模式
(0 << 22) | // TEST1:0=00,正常工作模式
(6 << 24) | // START=6,当EDGE选择的边沿出现在MAT1.0时启动AD转换
(1 << 27); // MAT1.0上升沿启动转换
OS_EXIT_CRITICAL();
LcdPrintf(OSC_WINDOW_XMAX + 1, 53, "%06d", SampleRate);
}
/*********************************************************************************************************
** 函数名称 :AdcIrqException
** 函数功能 :AD中断服务程序
** 入口参数 :无
** 出口参数 :无
**********************************************************************************************************/
void AdcIrqException(void)
{
static uint8 lval = 0;
uint8 val;
//OS_ENTER_CRITICAL();
val = (ADDR >> 10) & 0x3f;
if(SampStart)
{
if(TrigState) // 已同步
{
Wave[Units] = val;
Units++;
if(Units >= OSC_WINDOW_XMAX)
{
TrigState = 0;
SampStart = 0;
}
}
else // 未同步
{
switch(TrigMethor) // 同步方式选择
{
case -1: // 下降沿同步
if(lval > TrigValue && val <= TrigValue)
{
TrigState = 1;
Units = 0;
Wave[Units] = val;
TrigState = 1;
Units++;
}
break;
case 1: // 上升沿同步
if(lval < TrigValue && val >= TrigValue)
{
TrigState = 1;
Units = 0;
Wave[Units] = val;
TrigState = 1;
Units++;
}
break;
case 0: // 无同步
TrigState = 1;
Units = 0;
Wave[Units] = val;
TrigState = 1;
Units++;
break;
default: break;
}
}
}
else
{
Units = 0;
TrigState = 0;
}
lval = val;
VICVectAddr = 0x00; // 通知VIC中断处理结束
//OS_EXIT_CRITICAL();
}
void DrawWave(void)
{
if(Units >= OSC_WINDOW_XMAX)
{
int x;
int m;
int dir = 0;
if(Multiply < 128)
{
m = 128 - Multiply;
dir = -1;
}
else if(Multiply > 128)
{
m = Multiply - 128;
dir = 1;
}
else
{
m = 0;
dir = 0;
}
for(x=1; x<OSC_WINDOW_XMAX-1; x++)
{
LcdPutYLine(x, 1, 62, 0);
if(dir == 0)
{
LcdPutLine(x-1, (0x3f - (Wave[x-1] & 0x3f)), x, (0x3f - (Wave[x] & 0x3f)), 1);
}
else if(dir == 1)
{
LcdPutLine(x-1, (0x3f - (Wave[x-1] & 0x3f) * m), x, (0x3f - (Wave[x] & 0x3f) * m), 1);
}
else
{
LcdPutLine(x-1, (0x3f - (Wave[x-1] & 0x3f) / m), x, (0x3f - (Wave[x] & 0x3f) / m), 1);
}
// 画表格(4 * 4 表格)
LcdPutPixel(x, 32, 1);
if(x & 0x01)
{
LcdPutPixel(x, 16, 1);
LcdPutPixel(x, 48, 1);
}
if((x == OSC_WINDOW_XMAX * 1 / 4) || (x == OSC_WINDOW_XMAX * 3 / 4))
{
int y;
for(y=0; y<128; y+=2)
{
LcdPutPixel(x, y, 1);
}
}
else if(x == OSC_WINDOW_XMAX * 2 / 4)
{
LcdPutYLine(x, 0, 63, 1);
}
}
}
}
void TaskInit(void *pdata)
{
uint8 Enable = 1;
SysInit();
LcdPutRect(0,0,OSC_WINDOW_XMAX-1,63,1);
LcdPutStr(OSC_WINDOW_XMAX + 1, 0, "t/div");
LcdReverseArea(OSC_WINDOW_XMAX, 0, 127, 11);
LcdPutStr(OSC_WINDOW_XMAX + 1, 24, "V/div");
LcdReverseArea(OSC_WINDOW_XMAX, 24, 127, 35);
for(AdcInit(SampleRate); ; )
{
switch(OSGetKey(1))
{
case KEY_RIGHT:
if((SampleRate * 1.25) <= OSC_MAX_SAMPLE_RATE)
{
SampleRate *= 1.25;
AdcInit(SampleRate);
}
break;
case KEY_LEFT:
if((SampleRate * 0.8) >= 10)
{
SampleRate *= 0.8;
AdcInit(SampleRate);
}
break;
case KEY_UP:
if(Multiply < 128 + 32) Multiply++;
break;
case KEY_DOWN:
if(Multiply > 128 - 32) Multiply--;
break;
case KEY_ENTER:
switch(TrigMethor)
{
case 1: TrigMethor = 0; break;
case 0: TrigMethor = -1; break;
case -1: TrigMethor = 1; break;
default: break;
}
break;
case KEY_CANCEL:
if(Enable) Enable = 0;
else Enable = 1;
break;
default:break;
}
if(Enable && SampStart == 0)
{
SampStart = 1;
}
DrawWave();
}
}
/********************************************************************************************
*** 文件结束 ***
********************************************************************************************/ |
|