Shrink vmdk(ubuntu)

2013年6月6日 1,520 views 评论已被关闭

在VMWare使用过程中,磁盘vmdk文件只增加不减少。最终达到MAXSIZE,占用较多磁盘空间,即使删除虚拟的ubuntu系统下的文件,依旧不能减少。
解决方法:
1.cd到需要Shrink的磁盘
2.cat /dev/zero > zero.del;sync;rm -f zero.del
3.关闭虚拟机,在windows下,cd 到VMware Tool目录
4.执行vmware-vdiskmanager.exe -k “E:\Virtual Machines\Ubuntu\Ubuntu-0.vmdk”

分类: 未分类 标签:

MyCommTool v1.2

2011年11月9日 3,412 views 评论已被关闭

MyCommTool 更新到v1.2
1,增加发送文件功能,支持发送进度提示;
2,增加自动加载新加串口的功能,不用重启软件;
3,串口波特率增加230400,460800,921600(需要硬件支持);
4,优化字符转换逻辑。

下载地址:http://www.laoguo.org/uploads/mycommtool-v1_2.rar

分类: 未分类 标签: ,

串口调试工具MyCommTool

2011年8月4日 3,519 views 评论已被关闭

串口调试工具MyCommTool v1.1

下载地址:
RAR:http://www.laoguo.org/uploads/mycommtool.rar
(大小25k)

V1.1更新:
1.增加扩展功能,支付最多25条自定义字符串的存储,发送,自动循环发送;
2.增加自动换行功能,帧间隔时间可调;
3.增加支持输入字符框hex模式下自动过滤非hex字符及0x/0X前缀;
4.串口识别最大到128;
5.优化汉字显示等若干BUG。
特点:
1.精简,单个EXE文件,大小64k(使用中会输出ini配置文件);
2.打开软件自动枚举本机串口;
3.各参数设置、输入字符串自动保存(ini配置文件,不写注册表),启动自加载;
4.接收窗口支持ASCII/HEX切换显示,发送支持ASCII/HEX;
5.发送窗口宽度可调,发送窗口大小可调;
6.接收窗口的字符可保存成文件;
7.支持自动发送,发送间隔时间和次数可调。

使用中有问题或建议,请联系web#laoguo.org

分类: 未分类 标签: ,

Catalyst Control Center打不开解决方法

2011年6月30日 3,132 views 评论已被关闭

今天更新显卡启动后,打不开Catalyst Control Center。
环境:
操作系统:windows xp 32bit sp3
.NET Framework 版本:2.0
更新的Catalyst Control Center版本:11.5

解决方法:
打开“C:\Windows\assembly”目录,按Public key Token排序,全选Public key Token为”90ba9c70f846762e” 的Assembly,卸载。(没有安装.NET Framework或版本较低的须先升级只2.0以上,再安装Catalyst Control Center)

附删除桌面右键的”Catalyst Control Center”方法:
运行命令: regsvr32 atiacmxx.dll /u
如果要恢复:regsvr32 atiacmxx.dll

分类: 未分类 标签:

Android SDK 2.2 API 中文文档

2010年12月12日 7,568 views 评论已被关闭

Android SDK API (2.2,2.3,3.0)中文版文档 陆续更新中
地址:http://android.laoguo.org
固定连接:http://www.laoguo.org/android/sdk/api/index.html

分类: 未分类 标签: , ,

AVR汇编百例(附汇编指令集)

2010年8月1日 15,549 views 评论已被关闭

AVR汇编百例(txt)

整理自网络,以下为预览:

;===================================
;AVR汇编百例 – 定点运算和定点数制转换
;AVR汇编百例 – 计算程序
;AVR汇编百例 – 实用程序
;AVR汇编百例 – 输入输出
;AVR汇编百例 – 电机控制
;AVR汇编百例 – 精确定时及时钟日历走时
;AVR汇编百例 – 串行通讯
;AVR汇编百例 – 脉宽调制(PWM)
;AVR汇编百例 – 断电保护
;AVR汇编百例 – 码制转换
;AVR汇编百例 – 浮点程序库
;AVR汇编百例 – 晋级篇 – 参考程序
;===================================
;定点运算和定点数制转换
;范例1
LSDAA: ADC   R16,R16     ;十进制数(在R16中)左移调整子程序
ADDAA: IN     R6,SREG     ;bcd码相加调整子程序,先保存相加后的
LDI   R17,$66     ;状态the old status
ADD   R16,R17     ;再将和预加立即数$66
IN     R17,SREG   ;输入相加后新状态(the new status)
OR     R6,R17     ;新旧状态相或
SBRS   R6,0       ;相或后进位置位则跳行
SUBI   R16,$60     ;否则减去$60(十位bcd不满足调整条件)
SBRS   R6,5       ;半进位置位则跳行
SUBI   R16,6     ;否则减去$06(个位bcd不满足调整条件)
ROR   R6       ;向高位字节BCD返还进位位!
RET
;范例2
SUDAA: BRCC   SBD1       ;bcd码减法调整子程序,差在R16中
BRHC   SBD3
SUBI   R16,$66     ;进位半进位都置位,将差减去立即数$66
SEC             ;并恢复借位C
RET             ;ret. with seC
SBD1:   BRHC   SBD2       ;进位半进位都清位,返回
SUBI   R16,6     ;进位清除而半进位置位,将差减去6
SBD2:   RET             ;ret. with clC
SBD3:   SUBI   R16,$60     ;进位置位而半进位清除,将差减去$60
SEC             ;并恢复借位C
RET             ;ret. with seC
固定链接:
    附avr汇编指令集:
    算术和逻辑指令
    • ADD         加法
    • ADC         带进位加
    • ADIW        加立即数
    • SUB         减法
    • SUBI        减立即数
    • SBC         带进位减
    • SBCI        带C 减立即数
    • SBIW        减立即数
    • AND         与
    • ANDI        与立即数
    • OR          或 阅读全文…
    分类: 嵌入式 标签:

    PHP实现Excel一列转置多行

    2010年7月9日 8,755 views 评论已被关闭

    使用Excel时会遇到列转置的问题,可以复制一列中需要转置的内容,右键菜单选择:选择性粘贴-选中转置即可实现列转置成行。

    也可使用Excel中的transpose函数,transpose函数的功能为返回转置单元格区域,即将一行单元格区域转置成一列单元格区域,反之亦然。在行列数分别与数组的行列数相同的区域中,必须将 transpose输入为数组公式。使用transpose可在工作表中转置数组的垂直和水平方向。

    例如

    A B C
    1 数据 数据 数据
    2 1 2 3
    公式 说明(结果)
    =transpose($A$2:$C$2) 第一列中的值 (1)
    第二列中的值 (2)
    第三列中的值 (3)

    注释 在示例中的公式必须以数组公式输入。在将公式复制到一张空白工作表后,请选中以公式单元格开始的区域 A5:A7。按 F2,再按 Ctrl+Shift+Enter。如果公式不是以数组公式输入,则返回单个结果值 1。

    实际应用中如果需要一列转置成多行怎么办呢,数据量小的时候一步步手工转置,数据量大时就麻烦了,用PHP可以实现这样的特殊操作:

    Excel中文本复制到textarea时候,列之间是以换行符(char (10))划分,统计换行符出现的次数,并替换换行符为<td>使之为一行,当行的单元格数达到要求时,换行符替换成<tr>(文本复制到Excel中表格会规范的填充单元格,所以使用<td> <tr>来划分行和列)即可实现。

    同理也可作行的多列转置,此处不做详解。

    一个例子:http://www.laoguo.org/uploads/excel-transpose.php

    代码:

    <form id=”form1″ name=”form1″ method=”post” action=”">
    <label>
    <textarea name=”t” id=”t” cols=”45″ rows=”30″></textarea>
    </label>
    <label><br>
    每行元素数
    <input type=text name=num size=8″>
    <input type=”submit” name=”button” id=”button” value=”提交” />
    </label>
    </form>
    <?php
    function strset($str) {
    $m = $_POST['num'];
    $j = 0;
    for($i = 0; $i <strlen($str); $i++){
    if(substr($str,$i,1) == chr(10))
    {
    $str[$i] = chr(9);
    $j++;
    if($j==$m)
    {
    $str[$i] = chr(10);
    $m+=$_POST['num'];
    }
    }
    }
    return $str;
    }
    ?>
    <table cellspacing=”8″ style=”font-size: 10pt”>
    <tr><td>
    <?php
    if($_POST){
    $strend=str_replace(” “, “&nbsp;”, strset($_POST['t']));
    $strend=str_replace(chr(10),’</tr><tr><td>’,$strend);
    $strend=str_replace(chr(9),’<td>’,$strend);
    echo $strend;
    }
    ?> </tr></table>
    分类: web 标签: , , ,

    Hello world!

    2010年7月3日 1,811 views 评论已被关闭

    欢迎使用 WordPress 。这是系统自动生成的演示文章。编辑或者删除它,开始您的博客!

    分类: 未分类 标签:

    AVR_USB技术资料

    2010年5月27日 6,395 views 评论已被关闭

    AVRUSB技术是利用高性能的8位RISC架构的AVR单片机,使用单片机的IO口来模拟USB的通信端口,由软件来实现USB通信协议,将普通的AVR单片机模拟成一个USB低速设备,从而实现AVR单片机与计算机之间的通信和控制。

    AVRUSB技术的基本原理就是利用AVR单片机的普通IO端口来模拟USB的硬件端口进行通信。因为低速USB设备的速度是1.5M位/秒,而AVR单片机是单指令周期的,在单片机使用12MHz的时钟频率时,正好是1.5MHz的8倍。也就是说,单片机每8条指令就精确完成一个数据位的采集。采用这种方法时,对单片机的时序要求非常严格,所以软件的核心部分代码完全由汇编语言实现。

    构成一个AVRUSB系统的硬件结构非常简单,只需要一个普通的AVR单片机(大部分型号都可以),再加上少量的外部元件(晶体、几个电阻以及可选的稳压二极管等),就组成了一个基本的AVRUSB系统。

    一个基本的AVRUSB硬件接口:

    图中的单片机以ATmega8为例。数据线D-上的上拉电阻R4用来通知计算机这是一个低速USB设备(这是在USB规范中定义的,更多内容请参考AVR309以及USB的官方文档)。12MHz晶体和两个22p的电容C2和C3组成单片机运行所必须的时钟。D+ 和D- 数据线可使用单片机的任意IO端口,但是必须使用相同的IO端口。在这里D+ 连接到PB1,D- 连接到PB0。此外数据线D+还需要连接到INT0上,这是为了在不同的AVR单片机中使用AVRUSB时有更好的适应性和兼容性,无需修改底层核心部分程序的代码。如果D-连接到端口D上(就是和INT0同一端口中),同时D+只连接到INT0,还可以节省出一个端口来。

    电阻R2、R3起到限流和保护作用,防止在意外情况下损坏计算机的USB端口或单片机的端口。单片机所需的电源Vcc可由USB的5V输出电源直接提供,或者由USB的5V电源转换得到(如LDO、稳压二极管等),或者通过电池等其他外部电源来供电。

    D+和D-上的3.6V稳压二极管D1和D2起到限制数据线上的电平的作用。因为在USB规范中规定数据线D+和D-上的电平范围是3.0V至3.6V,而AVR单片机的输出电平是Vcc。如果单片机的Vcc是5V,在没有D1和D2的情况下将造成电平不匹配,会造成在很多计算机中无法正确识别出USB设备。如果用户系统的Vcc在3.0V至3.6V之间,就可以省略这两个稳压二极管。从这里也可以看出用户系统的Vcc必须高于3V。

    上面硬件就组成了一个最小的AVRUSB系统,它能够和计算机进行USB通信。在上面最小系统的基础上,如果添加一个红外传感器,就可以接收发送红外信号,就是一个USB红外控制器;如果添加一个MAX202,就是一个带缓冲的USB <-> RS232串口转换器;如果加入ADC转换功能,就是USB的数据采集器;如果加入ADC和电源控制,就能够实现一个简单实用的USB充电器……各种功能的AVRUSB系统都是在这个最小系统的基础上,添加不同功能的外围模块或接口来实现的。

    传统的单片机与计算机进行USB通信,需要使用专用的接口芯片进行USB协议转换,如CP2101、FT232、CH342、PDIUSBD12、SL811等。象CP2101、FT232这样的芯片使用起来虽然简单,但是功能比较单一;而PDIUSBD12、SL811功能较强,但是使用复杂。并且这些专用芯片的价格都相对较高,增加了系统的成本。而AVRUSB简单易用,成本低廉,只需要一个普通的低成本AVR单片机以及很少的几个外部元件,就可以组成一个USB系统。

    AVRUSB的代码为AVR GCC编译器做了高度优化,同时也完全兼容于更专业的IAR C编译器。程序编译后在最小情况下还不到2KB,因此绝大部分的AVR单片机都可以使用AVRUSB(只要支持外部中断INT0,Flash容量不小于2KB就可以实现AVRUSB的功能)。这样在很多低成本的小容量AVR单片机上也可以使用AVRUSB,如ATtiny2313、ATmega45、ATmega48等,因此AVRUSB技术具有很高的实用价值。

    AVRUSB提供了一个完整而又简单易用、成熟稳定的应用程序框架。这个框架包括了底层(单片机部分)和上层(PC部分),单片机可以使用gcc(或者IAR)编程;PC上则可以使用各种通用编程软件,如Windows下使用VC、VB、Delphi、C++ Builder、BDS2006、GCC,Linux下使用GCC等等。用户可以在这个框架基础上添加和扩展各种功能,快速开发出适合于各种需求的单片机控制系统,而且AVRUSB支持Windows、Linux、MacOS等多种操作系统,具有很好的跨平台特性。

    AVR单片机低成本、高性能的特性,使得AVRUSB非常适合于应用到USB加密狗、USB接口的系统控制、低速USB数据采集等,这样构成的具有USB通信功能的单片机系统比很多使用专用芯片的系统简单、成本低。目前,AVRUSB已经成功应用到了很多产品上,比较有名的有:USBasp(USB接口的AVR编程器)、AVRCDC(USB转RS232串口)、USB Bootlader(USB接口的Bootloader软件)等.

    详细资料下载:
    1:USB协议(中文)
    2:USB Class Codes
    3:AVRUSB技术文档(简介,硬件,开发应用等)
    3:AVR-CDC(AVR仿USB-CDC类源代码2007-07-07)
    4:AVR-CDC(AVR仿USB-CDC类源代码2008-08-25)

    分类: 嵌入式 标签: ,

    一气压高度计设计(基于89C52+Adc0809)

    2010年4月28日 2,190 views 评论已被关闭

    工作原理:根据计算和实测的结果表明 ,在海拔高度 -100m~0m~ +4000m范围内 ,可近似地认为大气压的降低和海拔高度的升高成反比关系 ,比例系数约为 – (12. 3~11. 5) Pa/m;即:大约每升高 1m,大气压力下降约 12Pa.利用此原理 ,同时为了达到更加精确的测量高度 ,高度系统引入了温度这个变量 ,并且利用了基准方程:D = – ln( p/p1) ·R·T/g 1其中 T, p , p1 三个变量需要测量。T为平均温度 , K; p 为位于海平面的基准大1气压 , Pa; p为实测的大气压力 , Pa; R为普设气体常量 ,286; g为重力加速度 ,9. 81。
    设计方案:采用89C52,利用气压、温度和海拔高度之间的关系,利用ADC0809的A/D转换功能,把传感器得到的数值采样后送给89C52,在液晶显示屏上得到了气压、温度和海拔高度的值。(因ADC0809精度不高,实用性不好,仅为简单方案)。加上串口232通信模块还可以实现与上位机通信。
    以下为main.c代码
    全部工程源码(Keil uVision3)及Proteus仿真文件请点击:下载altimeter.rar

    代码:
    //************************************
    //气压高度计 89C52+Adc0809+lcd1602
    //www.laoguo.org
    //************************************
    #include <REGX52.H>
    #include <math.h>
    #include “LCD1602.h”

    unsigned char TempBuffer[5]={0,0,0,0,0};
    unsigned char TempBuffer1[2]={0,0};
    unsigned char Display;

    sbit LCD_ST  = P1^0;
    sbit LCD_OE  = P1^2;
    sbit LCD_CS  = P1^4;
    sbit EOC = P1^1;

    unsigned char AD_DATA[2];                  //保存IN0和IN1经AD转换后的数据

    typedef struct Num
    {
    float     DATA;
    unsigned int Intpart;
    unsigned char Decpart;
    }Num_mode;

    Num_mode TP,HT,AP;                 //温度,高度,气压

    void AdInit()
    {
    LCD_ST = 0;
    LCD_OE = 0;
    }

    /***********AD转换函数**********/
    void AD()
    {
    LCD_ST = 0;
    LCD_CS = 0;                    //选择通道IN0
    LCD_ST = 1;                    //启动AD转换
    LCD_ST = 0;
    while(EOC == 0)
    ;
    LCD_OE = 1;
    AD_DATA[0] = P2;
    LCD_OE = 0;

    LCD_ST = 0;
    LCD_CS = 1;                  //选择通道IN1
    LCD_ST = 1;                    //启动AD转换
    LCD_ST = 0;
    while(EOC==0)
    ;
    LCD_OE = 1;
    AD_DATA[1] = P2;
    LCD_OE = 0;
    }

    void Setdata()
    {
    TP.DATA    = AD_DATA[0] * 0.1961f;
    TP.Intpart = TP.DATA;
    TP.Decpart = (TP.DATA-TP.Intpart)*10;
    AP.DATA   = (((AD_DATA[1] * 0.01961f)/5.03)+0.095)/0.009-1;    //减1为仿真补偿
    AP.Intpart = AP.DATA;
    AP.Decpart = (AP.DATA-AP.Intpart)*10;
    HT.DATA    = (-log(AP.DATA/101.325)*TP.DATA*29.1539);
    HT.Intpart = fabs(HT.DATA);
    HT.Decpart = (fabs(HT.DATA)-HT.Intpart)*10;
    }

    void IntToStr(unsigned int dat, unsigned char *str)
    {
    unsigned char a[4]; char i;

    a[0]=(dat/1000)%10;         //取得整数值到数组
    a[1]=(dat/100)%10;
    a[2]=(dat/10)%10;
    a[3]=(dat/1)%10;

    for(i=0; i<4; i++)         //转成ASCII码
    a[i]=a[i]+’0′;

    for(i=0; i<3; i++)            //整数部分非各位填充空白
    {
    if(a[i]!=’0′)
    break;
    else
    {
    *str=’ ‘;
    str++;
    }
    }
    for(; i<4; i++)          //对数组赋需要显示的ASCII码值
    {
    *str=a[i];
    str++;
    }
    *str=’\0′;
    }

    void Print_Tp()
    {
    GotoXY(0,0);
    Print(“Temperature:”);
    IntToStr(TP.Intpart,TempBuffer);
    GotoXY(12,0);
    Print(&TempBuffer[2]);
    GotoXY(14,0);
    Print(“.”);
    GotoXY(15,0);
    TempBuffer1[0]=TP.Decpart+’0′;
    Print(&TempBuffer1);
    Display = 0;
    }

    void Print_Ap()
    {
    GotoXY(0,0);
    Print(“Pressure:”);
    IntToStr(AP.Intpart,TempBuffer);
    GotoXY(9,0);
    Print(&TempBuffer[1]);
    GotoXY(12,0);
    Print(“.”);
    GotoXY(13,0);
    TempBuffer1[0]=AP.Decpart+’0′;
    Print(&TempBuffer1);
    GotoXY(14,0);
    Print(“kp”);
    Display = 1;
    }

    void Print_Ht()
    {
    IntToStr(HT.Intpart,TempBuffer);

    if(HT.DATA<0)
    {
    GotoXY(7,1);
    Print(“-”);
    }
    else
    {
    GotoXY(7,1);
    Print(” “);
    }
    GotoXY(8,1);
    Print(&TempBuffer);
    //GotoXY(12,1);
    //Print(“.”);
    GotoXY(13,1);
    TempBuffer1[0]=HT.Decpart+’0′;

    Print(&TempBuffer1);
    }

    void Botton_down()
    {
    if((P0&0×01)==1)
    {
    Delay_ms(20);
    if((P0&0×01)==1)
    {
    while((P0&0×01)==0)
    ;
    GotoXY(0,0);
    Print(“                 “);
    Display=!Display;
    }
    }
    }

    void main()
    {
    AdInit();
    LcdInit();
    GotoXY(0,1);
    Print(“Height:       “);
    GotoXY(12,1);
    Print(“.”);
    GotoXY(14,1);
    Print(“m”);
    Print_Tp();

    while(1)
    {
    AD();
    Setdata();
    Print_Ht();
    Botton_down();
    switch(Display)
    {
    case 0:
    Print_Tp();
    break;
    case 1:
    Print_Ap();
    break;
    }
    Delay_ms(100);
    }
    }

    分类: 嵌入式 标签: , ,