可编程计数阵列PCA(转)
转自:http://townsi.blog.hexun.com/12934682_d.html
PCA就是一个定时器(计数器),和一般定时器原理相似:当PCA被使能则PCA由初值开始定周期累加,然后读取PCA的值。我们通常的做法是比较PCA是否等于我们提前设定的定时标志寄存器的值,如果相等,则定时时间到。PCA也是这样,不过PCA已经给我们准备好了定时标志寄存器,也已经做好了比较机制,不再需要我们在程序中添加比较语句。
PCA是一个16位定时器,它有5个定时标志寄存器(CCAPnH+CCAPnL,n=0,1,2,3,4),把PCA划分成5个定时模块,这5个模块分别有一个单片机引脚与之对应。与标准的定时器/计数器相比,PCA对CPU 的干扰小,定时更精确,减少了软件设计。
1.CMOD:PCA模式选择寄存器
位 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
值 |
CIDL |
WDTE |
- |
- |
- |
CPS1 |
CPS0 |
ECF |
CIDL:0-单片机空闲模式PCA工作;1-单片机空闲模式PCA不工作
WDTE:0-定时模块4禁用看门狗;1-定时模块4启用看门狗
CPS1,CPS0:PCA定时频率选择位(具体请看DATASHEET)
ECF:1-使CF为1时会产生中断
2.CCON:PCA控制寄存器
位 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
值 |
CF |
CR |
- |
CCF4 |
CCF3 |
CCF2 |
CCF1 |
CCF0 |
CF:PCA定时2BYTE溢出标志,当CF变高时,PCA会产生溢出中断,CF位必须软件清零,前提是ECF对CF使能
CR:PCA启停位,0-停止PCA计数,1-启动PCA计数
CCFn(n=0,1,2,3,4):当PCA某个模块检测到PCA定时器的值和自己的定时标志寄存器的值相等时,对应的CCFn会被硬件置位, CCFn必须软件清零,前提是对应的MAT对CCF使能
3.CCAPMn:PCA比较模式选择寄存器(n=0,1,2,3,4)
位 |
7 |
6 |
5 |
4 |
3 |
2 |
1 |
0 |
值 |
- |
ECOM |
CAPP |
CAPN |
MAT |
TOG |
PWM |
ECCF |
ECOM:0-关闭比较功能;1-打开比较功能
CAPP:1-PCA的下降沿捕捉定时器的值
CAPN:1-PCA的上升沿捕捉定时器的值(当CAPP和CAPN都为1时,上升沿和下降沿都捕捉)
MAT:1-使能定时时间与定时标志寄存器相等时CCF由硬件置位的功能
TOG:1-使能定时时间与定时标志寄存器相等时,该模块对应的管脚输出高电平的功能
PWM:1-脉宽调制功能打开;0-脉宽调制功能关闭
ECCF:1-使当CCF=1时可以产生中断
4.CCAPnH, CCAPnL (n=0,1,2,3,4):PCA定时标志寄存器
5.CH,CL:PCA定时寄存器
6.CEXn (n=0,1,2,3,4):与各模块相关的单片机引脚
PCA基本功能有5种:捕捉功能、16位软件定时器功能、高速输出功能、脉冲宽度调制功能PWM和看门狗功能,其中看门狗功能只有模块4支持,具体说明如下:
1.捕捉功能:
选择方法:ECCF=1
功能介绍:当给所用模块相应的管脚改变时,PCA会将当前定时器中的值捕捉到用户的定时标志寄存器中,捕捉后该模块的CCFn会被硬件置位,同时产生中断。
2.16位软件定时器功能:
选择方法:ECOM=1;ECCF=1;MAT=1
功能介绍:定时器值和定时标志寄存器的值相等时会有中断产生
3.高速输出功能:
选择方法:ECOM=1;TOG=1;MAT=1 ECCF=1
功能介绍:定时器值和定时标志寄存器的值相等时该模块相应的管脚上有触发产生(高电平)。
4.脉冲宽度调制功能:
选择方法:ECOM=1;PWM=1
功能介绍:此功能通过比较定时器的低字节和定时标志寄存器的低字节来在模块相应的管脚上输出PWM调制电平,当CL < CCAPnL 时输出值为低,当CL >= CCAPnL 时,输出值为高。
5.看门狗功能
选择方法:ECOM=1;MAT=1;TOG=1;WDTE=1
功能介绍:定时器值和定时标志寄存器的值相等时,看门狗产生复位。用户可以周期性改变CCAP4H和CCAP4L防止定时器值和定时标志寄存器的值相等,从而防止复位。此功能只有模块4可以使用。
本文中的寄存器只有CCON可以位寻址,其他都不支持!
本文所参考单片机为P89C66X!
SPI和UART(转)
UART (Universal Asynchronous Receiver/Transmitter)
通用异步收发器
UART是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终
端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了
。作为接口的一部分,UART还提供以下功能:
将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行
数据转换为字节,供计算机内部使用并行数据的器件使用。在输出的串行数据流中加入
奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,
并从接收数据流中删除启停标记。处理由键盘或鼠标发出的中断信号(键盘和鼠票也是
串行设备)。可以处理计算机与外部串行设备的同步管理问题。有一些比较高档的UART
还提供输入输出数据的缓冲区,现在比较新的UART是16550,它可以在计算机需要处理数
据前在其缓冲区内存储16字节数据,而通常的UART是8250。现在如果您购买一个内置的
调制解调器,此调制解调器内部通常就会有16550 UART。
SPI:高速同步串行口。3~4线接口,收发独立、可同步进行
SPI总线由三条信号线组成:串行时钟(SCLK)、串行数据输出(SDO)、串行数据输入(SDI)。SPI总线可以实现多个SPI设备互相连接。提供SPI串行时钟的SPI设备为SPI主机或主设备(Master),其他设备为SPI从机或从设备(Slave)。主从设备间可以实现全双工通信,当有多个从设备时,还可以增加一条从设备选择线。
如果用通用IO口模拟SPI总线,必须要有一个输出口(SDO),一个输入口(SDI),另一个口则视实现的设备类型而定,如果要实现主从设备,则需输入输出口,若只实现主设备,则需输出口即可,若只实现从设备,则只需输入口即可。
UART:通用异步串行口。按照标准波特率完成双向通讯,速度慢
UART总线是异步串口,因此一般比前两种同步串口的结构要复杂很多,一般由波特率产生器(产生的波特率等于传输波特率的16倍)、UART接收器、UART发送器组成,硬件上由两根线,一根用于发送,一根用于接收。
显然,如果用通用IO口模拟UART总线,则需一个输入口,一个输出口。
ubuntu7.10下 装KDE
看过一些资料后发现原来KDE还是不错的,ubuntu下自带的是GNOME,尝试一下KDE
最近没空看linux,天天MFC。。。。
从这里找到的方法:
http://www.eastmovie.com.cn/skin/pj/article.asp?id=9
首先,打开终端,输入
终端提示要下载200MB左右的文件,遇到提示时全部选“Y”,接下来是长时间的等待(取决于你的带宽情况,毕竟要下载200MB左右的文件)。下载完成后,终端自动进行配置,之后变成一个蓝屏的文字窗口,寻问你要选择Kdm 还是gdm,这个看个人喜好,因为这只是开机登陆窗是KDE的还是GNOME的差别而已。我选择的是gdm,按回车,解下来自动配置。。。
安装好后,按组合键Ctrl+Alt+Backspace 重启Xwindows,在登陆窗的“会话”中选择KDE,登陆后就是变成KDE了。(如果想回到ubuntu的话,可以在“会话”中改成gnome)
需要说明的是,此时你在ubuntu下安装的一切软件都可以在Kubuntu下使用,同理,Ubuntu下也可以使用KDE的软件。简言之,所以软件是共用的。
另外,此时默认的KDE为英文界面,可以使用这条命令安装中文环境。
按组合键Ctrl+Alt+Backspace 重启Xwindows,这样就变成中文的了
////////////////////////////////////////////////////////////////////////////////////////////////////////
感觉KDE比GNOME漂亮,可能长时间看GNOME审美疲劳了
老是搞表面的这一套,有些肤浅。
一个雨天的水贴
vc的一些简单用法(转)
老板说我们都用vc,这些天忙vc,用到的东西不多,基本就是编个界面,控制运动卡。
vc刚学,尚需努力。
vc的一些简单用法 转自:
http://ywqboy.blog.sohu.com/61848511.html一: CStatic的用法
public:
CMyStaticDlg(CWnd* pParent = NULL); // standard constructor
CStatic m_Dynamic;
//设置文本
CStatic* static1 = (CStatic*)GetDlgItem(IDC_STATIC1);
static1->SetWindowText("明11");
//动态创建
if (!IsWindow(m_Dynamic.m_hWnd))//m_Dynamic是在窗口类中定义的CStatic对象
m_Dynamic.Create("欢迎您!",WS_CHILD,CRect(110,50,180,100),this,1525);
m_Dynamic.ShowWindow(SW_SHOW);
//修改按钮风格
CStatic* static2 = (CStatic*)GetDlgItem(IDC_STATIC2);
static2->ModifyStyle(0,SS_BITMAP);//修改按钮风格
static2->SetBitmap(LoadBitmap(AfxGetInstanceHandle(),
MAKEINTRESOURCE(IDB_BITMAP1))); //设置位图
////加载图标
CStatic* static3 = (CStatic*)GetDlgItem(IDC_STATIC3);
static3->ModifyStyle(0,SS_ICON);//修改按钮风格
static3->SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));//加载图标
二:文本框用法
//设置文本
CEdit* m_edit1 = (CEdit*)GetDlgItem(IDC_EDIT1);
m_edit1->SetWindowText("hello");
//获取文本
CString c_user;
m_edit1->GetWindowText(c_user);
//取消编辑
CEdit* m_edit2 = (CEdit*)GetDlgItem(IDC_EDIT2);
m_edit2->Undo();
//密码文本
CEdit* m_edit3 = (CEdit*)GetDlgItem(IDC_EDIT3);
m_edit3->SetPasswordChar('*');
//数字编辑框
CEdit* m_edit4 = (CEdit*)GetDlgItem(IDC_EDIT4);
m_edit4->ModifyStyle(0,ES_NUMBER);
//设置控件焦点
GotoDlgCtrl((CEdit*)GetDlgItem(IDC_EDIT1)); //设置控件焦点
三: 按钮类
//设置按钮风格、样式
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CButton* button1 =(CButton*) GetDlgItem(IDC_BUTTON1);
button1->ModifyStyle(0,BS_ICON);
button1->SetIcon(AfxGetApp()->LoadIcon(IDI_ICON1));
//复选
CButton* m_button = (CButton*)GetDlgItem(IDC_CHECK1);
m_button->SetCheck(TRUE);
//单选
m_button = (CButton*)GetDlgItem(IDC_RADIO1);
m_button->SetCheck(TRUE);
//鼠标形状
SetCursor(AfxGetApp()->LoadCursor(IDC_CURSOR1));
四 列表框
//添加数据
CListBox* pList = (CListBox*)GetDlgItem(IDC_LIST2);
pList->AddString("语文");
pList->AddString("数学");
pList = (CListBox*)GetDlgItem(IDC_LIST3);
pList->AddString("Visual C++");
pList->AddString("SQL Server");
CListBox* listbox1 = (CListBox*)GetDlgItem(IDC_LIST1);
//Add data to ListBox
listbox1->AddString("孙海霞");
listbox1->AddString("王兵");
//查找数据
CListBox* listbox2 = (CListBox*)GetDlgItem(IDC_LIST2);
listbox2->SelectString(0,"英语");
//当前数据
CButton* button = (CButton*)GetDlgItem(IDC_BUTTON2);
CListBox* listbox3 = (CListBox*)GetDlgItem(IDC_LIST3);
CString str;
int index = listbox3->GetCurSel();
if (index >=0)
{
listbox3->GetText(index,str);
button->SetWindowText(str);
}
//列举文件
CListBox* listbox4 = (CListBox*)GetDlgItem(IDC_LIST4);
listbox4->Dir(DDL_DIRECTORY|DDL_SYSTEM,"c:\\*.*");
五 组合框
//添加数据
CComboBox* combobox1 = (CComboBox*)GetDlgItem(IDC_COMBO1);
combobox1->AddString("男");
combobox1->AddString("女");
//清空数据
CComboBox* combobox2 = (CComboBox*)GetDlgItem(IDC_COMBO2);
combobox2->ResetContent();
//当前数据
CComboBox* combobox3 = (CComboBox*)GetDlgItem(IDC_COMBO3);
CString text;
combobox3->GetLBText(combobox3->GetCurSel(),text);
MessageBox(text,"提示");
//列举磁盘
CComboBox* combobox4 = (CComboBox*)GetDlgItem(IDC_COMBO4);
combobox4->Dir(DDL_DRIVES|DDL_EXCLUSIVE,"c:\*.*");
*/
// 显示窗体
CProviderInfo provider;
CCustomer customer;
provider.Create(CProviderInfo::IDD);
provider.ShowWindow(SW_SHOW);
六 连接数据库
// LIST列表框------------------------------------------1
m_grid.SetExtendedStyle(LVS_EX_FLATSB
|LVS_EX_FULLROWSELECT
|LVS_EX_HEADERDRAGDROP
|LVS_EX_ONECLICKACTIVATE
|LVS_EX_GRIDLINES);
m_grid.InsertColumn(0,"编号",LVCFMT_LEFT,100,0);
m_grid.InsertColumn(1,"姓名",LVCFMT_LEFT,100,1);
m_grid.InsertColumn(2,"年龄",LVCFMT_LEFT,100,2);
ADOConn m_AdoConn;
m_AdoConn.OnInitADOConn();
CString sql;
sql.Format("select* from employees order by id desc");
_RecordsetPtr m_pRecordset;
m_pRecordset = m_AdoConn.GetRecordSet((_bstr_t)sql);
while(m_AdoConn.m_pRecordset->adoEOF==0)
{
m_grid.InsertItem(0,"");
m_grid.SetItemText(0,0,(char*)(_bstr_t)m_pRecordset->GetCollect("id"));
m_grid.SetItemText(0,1,(char*)(_bstr_t)m_pRecordset->GetCollect("name"));
m_grid.SetItemText(0,2,(char*)(_bstr_t)m_pRecordset->GetCollect("age"));
m_pRecordset->MoveNext();
}
m_AdoConn.ExitConnect();
//m_list.DeleteAllItems();//删除
//数据判断----------------------------------2
if(m_id.IsEmpty())
{
MessageBox("编号不能为空!");
return;
}
if(m_name.IsEmpty())
{
MessageBox("姓名不能为空!");
return;
}
//下拉框--------------------------------------3
m_combo.GetLBText(m_combo.GetCurSel(),sex);//-----
try
{
m_pRecordset->Move((long)pos,vtMissing);//--------
m_pRecordset->PutCollect("编号",(_bstr_t)m_id);
}
catch(...)
{
MessageBox("操作失败");
return;
}
MessageBox("保存成功.");
m_grid.DeleteAllItems();//------
//列表框事件-------------------------------------------4
void C--::OnClickList1(NMHDR* pNMHDR, LRESULT* pResult)
{
// TODO: Add your control notification handler code here
pos=m_grid.GetSelectionMark();
m_oid=m_grid.GetItemText(pos,0);
*pResult = 0;
}
linux的几个相关概念
看了一些入门的教程,上来都实先说一通发展史。刚看了一段话还不错,就先写下来,脑子不大好用,记下来先
Free software-------is a matter of liberty, not price.
Free software refers to the users freedom to run , copy, distribute ,study, change, and improve the software.
Freeware(免费) != Free software(自由)
GPL--------General Public License
GNU-----GNU's Not Unix ------一个无穷循环
推荐 witcher巫师 和电影迷雾 以及远离电脑
推荐一个游戏,witcher 波兰的小说改编,情节是非常的复杂,没有传统游戏中好人坏人那么明显的区别,全部需要你自己去选择,游戏的技能系统和打斗方面做得也不错,最值得一提的是CG画面,太漂亮了,有时候真的忍不住停下仔细得看看体味一下。不过游戏很大,装上后7个多G,至少两G内存才能流畅。
重新装了系统,游戏还没玩完,抽空看了个电影,非常好,mist迷雾,把人心在生死攸关的时候,以及彻底孤独的时候的各种心态表现得淋漓尽致,人是孤独的,人又是最怕孤独的。刚下了mist的原声音乐,很不错。。。
发现我居然很难离开电脑了,在校内上发过了感慨,在这里就提醒一下看贴的朋友,静下来想一下离开电脑我们自己是否还会正常生活。。。
又一次从零开始 F7到ubuntu
捣鼓了一个星期的linux了,一个字----累!
以前从来没有接触过(这也不是什么好借口),这一次又是从零开始。
一开始买了张F7的盘,顺利地装上了系统,可是很多软件都缺少乱其八糟的库文件和其他的看不明白的文件。对一个刚想摆脱windows的初学者来说是个不小的打击,甚至萌生了放弃linux的念头。一闪而过。
开始学习怎样安装ubuntu。外面卖碟的没有ubuntu版,都是red hat的,并且我的光驱不是很好,浏览了大量硬盘安装的帖子,我决定从硬盘安装,虽然也看到了硬盘安装的风险。我把硬盘里重要的东西考了出来,剩下的专业软件和平时用的就都作为牺牲的准备了。做好了所有准备,重启,进入grub,可是选择安装没有反应,直接进了windows。
再一次浏览帖子,找到另一个版本的说法,将boot.ini和menu.lst改过,然后再一次重启。居然可以安装了,兴奋之情无以言表!可是居然不知道怎么复选,结果一点enter,直接安装,而且还没有出现网上说的很多选项。安装是完成了,似乎没有装上很多东西,而且启动后居然是命令行。。。和网上的说法完全不一样。我以为我的安装步骤不对,反正装一次就明白了流程,再装一次!
就是这一次惨了,莫名的出现错误,一路点下去,重启。error17!貌似grub引导错误。我一没软驱,二没光盘。。
一不做二不休,重装windows。从头开始。就这样已经折腾了好多天了。这次可不能从硬盘装了,承受不了打击。下去买了两张cd,找同学刻碟。可是启动光盘没法引导。我又一次认为光驱问题。可在别的机器上也这样。这次郁闷了!再次查找问题,可能是刻盘的时候没注意到映像刻盘,如果简单的复制数据的话缺少引导。幸亏买了两张盘!
再试,结果就行了!
感觉ubuntu比F7方便的多,对于我这种新手还是从这里起步吧。折腾了一个星期,终于把linux的安装搞好了(虽然硬盘安装有了阴影),过程中也明白了不少知识。算是迈过了一个坎吧。
另外附上ubuntu中文输入法的配置:
apt-get install scim-chinese
就可以使用智能拼音输入法了!当然在使用之前还要先配置一下,配置方法很简单,在/etc/X11/Xsession.d/里新建一个名叫95xinput的文件,文件内容如下
/usr/bin/scim -d
XMODIFIERS="@im=SCIM"
export XMODIFIERS
export GTK_IM_MODULE=scim
保存文件,确认内容无误后,退出X(建议退出X后运行exit命令重新login一次),再进入X的时候就可以用Ctrl+Space调出SCIM了
其他的方法用过不行,这个还可以。
我的linux之路,第一步
不管什么事,走出第一步总是需要一丁点勇气的。
前些日子看到一篇文章,关于linux的,虽然有些地方说的有点偏颇,但linux还是引起了我尝试的想法。
从来没有接触过,但凭借windows下的对操作系统的认识(低调。。。)我还是很快的去东门外买了张fedora7的盘,这张盘算是正版的吧,起码不算盗版,5元一张。
生怕把原来windows下的东西误删除,所以很小心的用光盘安装,自以为e文还可以的我,在选择语言的时候点击了english,哈哈,导致了后来的对中文不支持,费了好大的劲也没有装好中文输入,中文网页也是一片乱码。
两天之后,重新安装,幸亏我在windows下重装习惯了。这次直接中文版,防止e文下的中文乱码。于是我现在正在linux下输入。哈哈哈哈。
不过里面的教训还是很多的。
说一下网络吧,我们是校园网,非静态ip的,用华为版的认证端,解包之后有三个文件,通过如下命令加入可执行属性
#chmod a+x linux1x pre.ps renew.ps
运行
# ./pre.ps
执行下面的命令让网络重启
# /etc/init.d/network restart
找到安装目录
# cd /usr/local/bin
如果不执行下面的命令可能不行,虽然不知道是干什么用的
# ./renew.ps
配置网络,高中e文水平就能看明白
# linux1x -c
# linux1x -d //输入用户名和密码,就可以上网拉! 或者直接用后面的命令,一次成功 #linux1x -u ***/**** -n eth0 -d
很郁闷的是,我们8个人用一个帐号上网,windows下很正常,但linux下我必须比他们上网早才能上的去,否则一般情况下我是连不上去的。不知道是不是配置的问题。
第一步比较难走,现在能上网已经让我很高兴了。在此感谢刘健同学的热心帮助。
虽然经常在双系统下切换,但两个操作系统的两种思想还是会让人得到一定的益处的。
一点台湾公投的想法
明天,应该是今天,台湾就要入联公投了,看了不少人的帖子,有极力支持打的,因为中国出了个反分裂国家法,而如果等台湾公投结果一出,那就很难收拾了;也有反对的,认为影响了经济,影响了奥运,并且,都是中华儿女,为什么要自己人打自己人呢?
看了这些说法,我更感觉多了些迷茫,年少的时候看了些台湾作家的散文,感觉那些东西才是中华传统的精神的继承,而GCD对中国的发展做出的贡献是不能忽视的,可这些年就连我这个不懂经济不懂政治的人来说都能看得出来,这些年中国乱了,变得很不纯粹。有人说是社会转型必须经历的,希望如此。马英九说要重返联合国,这个说法就很尴尬,GCD是代表中国加入联合国,而马英九代表谁呢?中华民国。中国是中华人民共和国还是中华民国呢?没人可以否定中华民国。
再说公投,民众难道懂得所有的一切么?难道不是这些舞台上的主角们肆意向人民灌输么?
我支持民众的意愿,可我又不相信民众能做出正确的决定。
我喜欢三毛,喜欢张晓峰,喜欢台湾的很多作家,喜欢罗大佑,候德建,对李敖也很喜欢。他们有种真正中华民族的精神。而不是经过很多政治洗脑,金钱诱惑,物欲肆虐过的人民所能具有的。虽然我没有去过台湾,没有真正认识台湾,但我可以说我喜欢台湾。
中国是中国,GCD是GCD。
说到这里,我还是不知道应该支持谁或者能提出什么所谓的建设性的看法。只希望我们是一个统一的中国!
发发感慨而已。