原创 菜鸟书中寻真经(断续读后感)

2007-1-16 00:34 5451 7 7 分类: MCU/ 嵌入式


菜鸟书中寻真经(<PIC单片机入门与实战>断续读后感)
mood25.gif hotpower 发表于 2004-10-31 22:27 PIC 单片机 ←返回版面 按此察看该网友的资料 按此把文章加入收藏夹 按此编辑本帖举报该贴


第一章  PIC单片机的结构和指令系统

发现张工对banksel,bankisel,pagesel不太感冒...

今天,在高奇的网站上,有人问我banksel和pagesel是什么?我没有回复,也不准备回复...
搞汇编的连这2个"玩意"也不用,我不敢想出他能编出什么好的程序,除非他是个记忆力非常好的天才...
当变量多且不在一个块(体)时,我不相信有谁能记住哪个变量在哪个bank中...也许我是个弱智吧,反正我是记不清...

由于PIC的特殊性,所以,我认为banksel和pagesel是首要掌握的技能之一...

感觉都写些PIC最致命的地方和弱点...


第二章  PIC单片机的特色

这句话我爱听--"实际上能用软件关闭的看门狗并不能算真正的看门狗"(P60)

这个也许是我放弃EMC单片机应用的最大原因...其他可关闭看门狗的MCU我一般都加个外狗...
http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?id=731408
http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?id=728766


这句话我不太喜欢听--"绝对不能把这条指令放在中断服务程序中"(P61)
                    注:这条指令就是喂狗指令clrwdt

http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?id=1288939

http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?v=&ID=1370598
http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?v=&ID=1292077

http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?id=1286144

http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?id=1289654


第三章  PIC单片机的开发环境

在本章中,张工详细讲述了banksel,bankisel,pagesel三条宏指令的用法.
MPLAB IDE 5.7前的banksel不太聪明(可能是我苯吧),现在的MPLAB IDE 6.6不知如何???

既然想当PICC菜鸟,也就不想了解他们的聪明程度了...
但新一代的MPLAB IDE确实非常好用,特别是对汉字的中文注解.
而且编译速度要快了许多.缺点好像放弃了对ICD的支持...

第四章  PIC单片机的开发工具
农民手头不是很宽松,只能用些ICD,ICD2...高档的玩不起...
只要相信自己,我想就是不要开发工具,只要软仿真可能就会搞定...

第五章  PIC单片机的I/O口及其灵活应用


第六章  PIC单片机的定时器资源及其应用


第七章  PIC单片机的模/数转换模块及其使用


第八章  PIC单片机的USART通信模块及其使用

这一章写的太详细了!尤其是各种波特率的实际值,真方便!
并多次深情地说:"尽可能选择高速波特率发生方式以减少与标准值的误差"...太感人了...


我也提供一个自己编写的Delphi+MSComm控件串口收发程序http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?id=1421495

第九章  PIC单片机同步串行接口及其应用


第十章  PIC单片机的CCP模块及其应用


第十一章  PIC单片机的C语言编程
从汇编转入C,搞MCU的人可能最关心的有几点,其中就有位变量的定义.因为工控的主要目标就是IO的控制.至于算法等与PC编程没什么两样.
前天看了高奇PIC C论坛斑竹cypok的文章http://www.goldenchip.com.cn/gdbbs/dispbbs.asp?ID=2003126231104574&announceid=2003126231104574&prefile=searchlist.asp&boardid=5&searchkey=picc&area=0&dateandtime=all&username=cypok&dpi=1&page=1&skin=1后,觉得很有意思,就突发奇想:自己是否也玩玩PICC的位变量呢???
地球人都知道!cypok说的太好了,正合我意!
我是个粗人,我不管书上说些什么,网上帖些什么,只要是自己也能瞎想出来的,哪怕与别人雷同也罢...
所以就想张工等用位域来定义一个位变量,何不用typedef来定义一个新变量类型,且它既能按位域寻址也可按字节寻址呢???
于是就构造出来了http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?v=&ID=1416214
觉得还有些麻烦,就改为http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?v=&ID=1416941

先看下经典的位定义
static volatile unsigned char myvar @ 0x25;
static volatile bit b7 @ (unsigned)&myvar*8+7;
static volatile bit b6 @ (unsigned)&myvar*8+6;
static volatile bit b5 @ (unsigned)&myvar*8+5;
static volatile bit b4 @ (unsigned)&myvar*8+4;
static volatile bit b3 @ (unsigned)&myvar*8+3;
static volatile bit b2 @ (unsigned)&myvar*8+2;
static volatile bit b1 @ (unsigned)&myvar*8+1;
static volatile bit b0 @ (unsigned)&myvar*8+0;
再看下非典的位定义
方法1:
PICCBITBYTE myvars @(unsigned)0x25;//申请新变量类型PICCBITBYTE名为myvars,并绝对定位在bank0的0x25处

#define myvars0 myvars.BIT.BIT0        //myvars.0
#define myvars1 myvars.BIT.BIT1        //myvars.1
#define myvars2 myvars.BIT.BIT2        //myvars.2
#define myvars3 myvars.BIT.BIT3        //myvars.3
#define myvars4 myvars.BIT.BIT4        //myvars.4
#define myvars5 myvars.BIT.BIT5        //myvars.5
#define myvars6 myvars.BIT.BIT6        //myvars.6
#define myvars7 myvars.BIT.BIT7        //myvars.7

方法2:
PICCBIT myvar @((unsigned bank1) 0x80+0x25);//申请新变量类型PICCBIT名为myvar,并绝对定位在bank1的0x25处

#define myvar0 myvar.BIT0              //myvar.0
#define myvar1 myvar.BIT1              //myvar.1
#define myvar2 myvar.BIT2              //myvar.2
#define myvar3 myvar.BIT3              //myvar.3
#define myvar4 myvar.BIT4              //myvar.4
#define myvar5 myvar.BIT5              //myvar.5
#define myvar6 myvar.BIT6              //myvar.6
#define myvar7 myvar.BIT7              //myvar.7

可以看出,方法2比较简单(缺点只能位寻址)
但myvar.BIT.BITn或myva.BITn好像比&myvar*8+n更符合C++中的类成员符"."的"潮流"
这可能与我喜好BC++及delphi有关吧...

如果当初PICC也是用非典方法来定义位变量,网上就不会就人说我吃饱了没事干了...

我对基本的三种位变量类型成功的定义并非重复劳动,只是从侧面说明PICC的位变量定义绝非华山一条路,可能还有其他的思路.
不管别人如何认为,自己对2种位类型的新变量类型定义
typedef struct {
  unsigned BIT0: 1;
  unsigned BIT1: 1;
  unsigned BIT2: 1;
  unsigned BIT3: 1;
  unsigned BIT4: 1;
  unsigned BIT5: 1;
  unsigned BIT6: 1;
  unsigned BIT7: 1;
}PICCBIT;//定义一个只能按位域寻址的新变量类型

typedef union {
  PICCBIT BIT;//可以按位域寻址
  unsigned char BYTE;//可以按字节寻址
}PICCBITBYTE;//定义一个既能按位域寻址也可按字节寻址的新变量类型
还是自认为比较满意的...真是"郁闷惊醒梦中人"呀...

搞MCU的人可能最关心还有C编译器的启动及变量自动清零过程,因为那是MCU人的命根!如果这个也搞不清,那就没法真正使用C.
所以就向张工发出了自己认为可能是最有价值的鸡毛信http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?id=1373965
同时也得到了我上网以来最使我兴奋的回帖http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?v=&ID=1374841
真是一划惊醒梦中人呀...http://www.21icbbs.com/club/bbs/ShowAnnounce.asp?v=&ID=1375042

虽然PICC的persistent很美丽,但对于低功耗及不怕任意复位的系统编程设计中,可能有些罗嗦(但很可靠),
可对于我来还是不能满足需要的,张工的"一划"太难忘了...爽!爽!爽!

先占个地方,有空就写点...
写的不对之处,望张工打板子...
PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条