叶帆工作室

嵌入式开发爱好者(十年开发经验,精通C/C++/VC/VB/C#...)

原创 .Net Micro Framework研究—带AD的模拟器收藏

 
继昨天的研究,希望再接再厉把AD模入模出在模拟器上也实现出来,本以为挺简单,其实AD相关功能,与GPIO不同,在模拟器中前者通过GpioPort实现,后者通过SpiDevice实现。幸好有Temperature(温度采集)示例可以参考,否则一时真无法下手。不知道为什么,很简单的代码他们总写的很复杂,让你很难看懂,幸好有以前的相关的经验做底子,用了大半天的时间模入模出都搞定了。
下面就是模拟器中的AD输入输出的相关代码。
    public class SpiADComponent : SpiDevice
    {
        public Int16 AW0 = 0;
        public Int16 QW0 = 0;
        protected override byte[] Write(byte[] data)
        {
            //------------
            try
            {
                QW0 = (Int16)((data[0] << 8) + data[1]);
            }
            catch { }
            //------------
            byte[] bytes = new byte[2];
            bytes[0] = (byte)(AW0 >> 8);
            bytes[1] = (byte)(AW0 & 0xff);
            return bytes;
        }
    }
 注:由于受西门子PLC200的影响比较大,所以把模拟量入和出,定义为AW0和QW0,并且用两个字节的整数表示,根据需要可以进行折算。
我们把昨天的GPIO代码稍加改进,把AD部分测试代码添加进去,代码如下:
static SPI _spi;
    public static void Main()
    {
        OutputPort[] output = new OutputPort[8];
        InputPort[] input = new InputPort[8]; 
       
        //叶帆模拟器GPIO的pin定义
        Cpu.Pin[] pin_I = new Cpu.Pin[8] { (Cpu.Pin)10, (Cpu.Pin)11, (Cpu.Pin)12, (Cpu.Pin)13, (Cpu.Pin)14,(Cpu.Pin)15, (Cpu.Pin)16, (Cpu.Pin)17 };
        Cpu.Pin[] pin_Q = new Cpu.Pin[8] { (Cpu.Pin)20, (Cpu.Pin)21, (Cpu.Pin)22, (Cpu.Pin)23, (Cpu.Pin)24, (Cpu.Pin)25, (Cpu.Pin)26, (Cpu.Pin)27 };
 
        //SPI的pin定义
        _spi=new SPI(new SPI.Configuration((Cpu.Pin)30, true, 0, 0, false, false, 4000, SPI.SPI_module.SPI1));
 
        for (int i = 0; i < 8; i++)
        {
            input[i] = new InputPort(pin_I[i], false, Port.ResistorMode.PullDown);
            output[i] = new OutputPort(pin_Q[i], false);
        }
 
        int intNum = 0;
        while (true)
        {
            output[intNum].Write(!output[intNum].Read());
            Debug.Print(input[0].Read().ToString() + " " + input[1].Read().ToString() + " " + input[2].Read().ToString() + " " + input[3].Read().ToString() + " " + input[4].Read().ToString()+ " " + input[5].Read().ToString() + " " + input[6].Read().ToString() + " " + input[7].Read().ToString());
            Debug.Print(ReadWriteAD((Int16)intNum).ToString() + " " + intNum.ToString());
            if (++intNum > 7) intNum = 0;
            Thread.Sleep(1000);
        }
    }
    public static Int16 ReadWriteAD(Int16 value)
    {
        byte[] bout = new byte[2];
        byte[] bin = new byte[2];
        bout[0] = (byte)(value >> 8);
        bout[1] = (byte)(value & 0xff);
        _spi.WriteRead(bout, bin);
        Int16 aw0=(Int16)((bin[0] << 8) + bin[1]);
        return aw0;
    }
 } 
运行后的界面如下:
从上图可以看出,模拟器已经和测试程序进行交互了,即可以设置AW0的值,也可以获取QW0的值。
 
我又把模拟器改进了一下,可以支持多种IO模拟功能,目前已经完成了GPIO和AD,I2C应该也不难,但是Serial(串口)估计有问题,因为模拟器支持库没有相关函数。
 

发表于 @ 2007年12月31日 13:19:00|评论(loading...)

新一篇: .Net Micro Framework研究—带I2C总线的模拟器 | 旧一篇: .Net Micro Framework研究—带IO的模拟器

用户操作
[即时聊天] [发私信] [加为好友]
叶帆
订阅我的博客
XML聚合  FeedSky
订阅到鲜果
订阅到Google
订阅到抓虾
叶帆的公告
本博客原创文章,作者保留一切权利,需经作者同意后方可转载,转载时 请注明[叶帆工作室]及文章链接。yefan@vip.sina.com
【简介】叶帆[微软MVP]
【文章】叶帆文章列表
【软件】叶帆共享软件列表
文章分类
收藏
    【叶帆软件】
    [01]VB源码之友(V2.1.548)
    [02]API浏览器.net(V5.0)
    [03]叶帆成语词典(V2.0.8)
    [04]叶帆密码库(V1.2.8)
    【叶帆资源】
    DAO 2.0引擎
    叶帆快速通道
    MSDN-MVP
    Windows Embedded 专题
    中文MSDN
    叶帆圈子--工业自动化
    叶帆工作室(博客园)
    叶帆工控--工业自动化
    微软中文技术论坛
    微软硬件创新中心(HIC)
    瑞康社区论坛
    叶帆友情链接
    张欣
    枕善居
    莫依
    葛涵涛
    郑建
    陈辉
    马宁
    马骐
    魏涛序
    黎波
    存档
    Csdn Blog version 3.1a
    Copyright © 叶帆