矿石收音机论坛

 找回密码
 加入会员

QQ登录

只需一步,快速开始

搜索
楼主: 崂山

单片机入门不难------谈PIC系列

  [复制链接]
发表于 2007-9-23 15:10:50 | 显示全部楼层
我们产品上用的是144条腿的,MC68HC-16Z1-PV16。。。。。。。。。。。。。
发表于 2007-10-30 16:05:28 | 显示全部楼层
简单易懂,收藏了。
另外谢谢崂山老师,您辛苦了。
发表于 2007-11-24 15:42:12 | 显示全部楼层
好东西!通俗易懂
发表于 2007-12-8 23:03:07 | 显示全部楼层
我用过PIC12F675,可以反复擦写(大约可以1000次)。内部带4个A/D。
    主要是为了学习,写了一个最简单的点灭程序,让它点一个LED,证明CPU能正常工作。
发表于 2007-12-8 23:11:54 | 显示全部楼层
在试图对PIC12F675编程时,对CONFIG bit 2007H的理解,花了一些时间。
     最终把程序写进去了。

     如果大家不使用厂家提供的编程软件,完全靠自己把编译/汇编后的机器码写入PIC系列的CPU都要遇到这个问题。
     
发表于 2007-12-22 22:56:20 | 显示全部楼层

好帖当然要顶!

不过9.17到今天有3个多月了.道士还没有露面??????
老天保佑他!
     
发表于 2007-12-23 18:27:39 | 显示全部楼层
五十岁学电脑,现在以达到能装机水平,今年快六十了应该学单片机了.
     
 楼主| 发表于 2008-1-4 22:35:32 | 显示全部楼层
下面介绍单片机汇编语言里的一个概念      “子程序”

下面我介绍 “子程序”
我先打个比方,如果你做一顿饭,要做汤,炒菜,炖鱼,汆丸子, 奥,忘了还有炒小螃蟹(大螃蟹现在都叫人吃的逮不着了:))期间有一个动作在我看来不断的重复,这个动作就是放盐  放盐的过程描述是这样的:

放盐:  用一把小勺子深入盐罐
        舀出氯化钠适量 。
        把小勺子里的氯化钠
        均匀洒在锅里。
        完毕

如果我们把做饭定义为主任务 那么放盐这个动作就叫做  子任务。
这样定义的一个好处就是描述主任务的时候比较方便,当你用语言文字描述主任务的时候,无论哪一道菜,到了该加盐的时候不必细说用一把小勺子深入盐罐...... 因为很多菜都有同样的这个过程,所以,你用 “放盐” 两个字就可以了。但是在你使用 放盐 这个词之前或者之后,你应该解释一下放盐 这个词的具体过程是什么。

我们单片机的程序也是一样的,如果你设计一个电视机的自动搜索频道的程序,程序要求电视机每搜索成功一个频道,它面板上的发光二极管就眨一次眼睛,也就说,先熄灭一段时间然后再点亮。这样就会遇到很多这样的眨眼动作,为了简化主程序我们可以把眨眼这样一个过程定义为一段子程序,以后每次遇到需要眨眼的时候就调用一次子程序就可以了。
子程序的定义是这样的
Zhayan:     bcf        GPIO,GP1        '管脚GP1输出低电平关闭LED灯   做为子程序标号是必须有的 标号
                                              ' 就是子程序的名字
            nop
            nop
            nop
            nop
            nop
            ... .
            
            bsf      GPIO,GP1  '管脚GP1输出高电平点亮LED灯
              nop
            nop
            nop
            nop
              ...         
    return           '这个命令表示子程序的结束 是必需的 否则这个子程序没有结束


这样,子程序就定义完了 如果想在程序的某个位置需要led灯熄灭以下(眨眼一次),只需在那个程序位置调用一下子程序就可以了。
调用的方法是用 call 命令。

主程序:
     ....               '这些点点表示主程序里的语句
     ....
     ......
     ......              '这个位置搜所成功一个台 需要“眨眼”一次
     call  Zhayan         
     ......              '继续搜索下一个台的命令行
      ......
     ......
     ......
     ......              '这个位置搜所成功一个台 需要“眨眼”一次
     call  Zhayan
     ......              '继续搜索下一个台的命令行
      ......
     ......
     ......              '这个位置搜所成功一个台 需要“眨眼”一次
     call  Zhayan         
     ......              '继续搜索下一个台的命令行
      ......


疑问1  我在一个主程序里固然可以调用另一个子程序,而我在一个子程序里能不能调用另一个子程序?
答  可以的,这叫子程序嵌套,甚至还可以在另一个子程序中再继续调用别的子程序。

疑问2  嗯,那继续往下调用下去,有限制么?
答  有,这叫允许嵌套的层数 每个品牌 型号的单片机允许的嵌套层数都是有规定的 例如pic16f74 允许8层
   pic12e519 允许两层  也就是说pic12e519的主程序里可以调用子程序,子程序里海可以再调用子程序,到此为止不要再往下调用   了,否则程序报错或者超出你预计的结果。

疑问3  在同一层程序空间里,例如在我的某个子程序之中,调用另一个子程序的次数有限制么?
        回答 没有限制,只要你的程序寄存器装得下你的程序。
疑问4  我听说单片机在调用子程序以前,好像需要程序“堆栈”访问什么的,要进行一些程序计数器的保存保护,以保证子程序返回来得时候,程序能够正确回到原来位置和环境。是这样的么?
答 pic单片机不用管这些问题,它是硬件自动完成这些堆栈的事情,我们的指令里不用关心这些。尽管如此,中档pic单片机的例如 pic16等系列,它们的程序存储器地址是分页的,尽量调用本页的子程序,如果子程序不在本页,而是在另一个页面里存放,你还是要告诉单片机你的子程序所在的页面数据的,具体操作指令可以查相关指令说明。我们的pic12c519的程序存储器,没有分页,不用关心这事。

[ 本帖最后由 崂山 于 2008-1-5 02:23 编辑 ]
     
发表于 2008-1-5 08:23:24 | 显示全部楼层
好啊!
谢谢崂山老师,辛苦了!
您那吃月饼选频道的思考题 ----- 防止该寄存器的值从0 变成255,我还不懂得做(初学,请别见笑),能否再给点提示?
     
发表于 2008-1-10 16:03:39 | 显示全部楼层
我看懂了!谢谢崂山老师!

[ 思考题:设计一段程序代码,当用户连续按下音量减小键后,判定音量寄存器09H的存储音量数值,防止该寄存器的值从0 变成255,以免震惊到用户。]
  
SMALL_SOUND:  nop
              decfsz  9H
              goto OK  
              incf  9H
     OK:   nop     

另外:     
[ 思考题:利用decfsz 指令设计一段延时代码,使得延时时间可以在10个机器周期到65535个机器周期之间 。。。。]
给出的程序是不是会有下面的问题?
1)置数24086 (5E16H), jixu:得到的延时时间是(5E - 1)H * 256 * 3T + (5E - 1)H x 5T + 16H x 3T = 71955T
      因为:0A寄存器减1用3T,0B寄存器减1用5T,当0B寄存器的数为 01H 时,运行decfsz 0BH 只要2T就结束了
                (少了256*3T);
2)如果0B寄存器内的初始置数是0,如:10(0AH), 11(0BH), ... 255(0FFH), 无条件运行decfsz 0BH后,0B寄存器内数为
     255,  jixu:得到的延时时间将会非常长;
3)同样,如果0A寄存器内的初始置数是0,如:256(100H), 512 (0200H), 768 (0300H),....  会多延时255* 3T ,因为无
     条件运行decfsz 0AH后,0A寄存器内数为255(不为0),没有跳转,0B寄存器没有减1。
     就是说:初始置数是256(100H) --〉延时时间(256*3 + 2)T = 770T;
                   初始置数是257(101H) --〉延时时间(2 + 2)T = 4T;

我是跟贴初学PIC汇编,可能是我理解错了。
再次谢谢崂山老师!

[ 本帖最后由 Julie 于 2008-1-11 06:16 编辑 ]
     
 楼主| 发表于 2008-2-14 23:46:25 | 显示全部楼层
先回答问题:
1、你的怀疑是对的,置数24086 (5E16H), 和得到的实际延时的确实不相等,所以我的原文用“大约”,不过也大的太多了。但是你的计算方法好像也不正确,感觉不会差那么多。

作为实际的精确时间,可以通过仿真器进行仿真测试出来。写上述思考题的时候,我还在热带雨林里工作,没有带仿真器和参考书,是我完全靠记忆,别说内容了,基本指令我现在还得检查一下的说。
如果非要计算,也不是不可以,主要是goto  跳步语句比较难办
作为实际,一般先给出一个大概置数,在通过仿真器调整到你需要的精确延时(可以精确到几个机器周期)

2、非常正确。这个思考题的例子里  高8位寄存器0B的值,最小为1  不能是0
3、道理和要求同上。
所以,我在题目里把最小时间定为 10个机器周期左右,而不是0。
因为这个例子最小时间是置数 0101H,  运行也就大约10个机器周期(10uS,  if  4MHz)左右
     
 楼主| 发表于 2008-2-15 01:15:35 | 显示全部楼层
继续讲
我们学习到这里,就已经初窥门庭了,下一步还有一个重要的关口-------中断

单片机的中断,概念并不难以理解。只是要真正理解运用编程处理一些实际中断的例子,却也不是很容易,甚至是单片机学习、入门的拦路虎。要想学会实际的中断处理编程,也还需要清楚一些程序存储器,程序结构,程序计数器,硬件堆栈,现场保护等这些个另杂碎概念。

因此,我们在学习中断以前,以后和学习中断过程中,都有必要介绍回顾复习一些有关上述关键词的概念和知识,否则,尽管你学了中断,用起来可还是不能得心应手,以至于茫然。

我还是用比喻的方法介绍一下中断的概念:
你的主程序任务是做一桌可口的饭菜,期间可能要多次调用子程序“撒盐”。

尽管子程序下边还有更小的子任务,比如“计算食盐的量”等过程,尽管这些子过程很复杂,但他们的出场时间和顺序是可以预料的,是可以预先安排的。也就说你肯定知道在什么时候放盐。

有一类子程序,他的出场时间是不确定的,突然的,处理他们的时间刻不容缓,必须赶紧的。我们称这一类子程序为 中断子程序。 也就是我们所说的 中断

你正在做菜的过程中,隔壁邻居小孩突然敲门说 他的二大爷在他房间里摔倒了 请你帮忙把二大爷扶起来。这是急迫的,必须处理的事务。

你肯定关掉炉子一溜烟跑出去帮忙,等回来以后再点着炉子继续做菜。
这个事件的特点就是发生的时间你无法预先知道,而这个任务必须得停下当前工作去处理,并且是刻不容缓。

  从开始关炉子到回来点着炉子的这段时间里以及你的救人行为,就叫做  “中断子程序”。  
在中断子程序过程中,你关炉子的动作,叫做“中断现场保护”  点着炉子叫做“中断现场恢复”中间走出去扶起隔壁二大爷到回来 叫做“中断任务处理”

小孩子敲门就叫做“中断请求”

这就是中断的基本概念。

在单片机里,中断的例子也是很多的。我举一个你手里的手机的例子,你的GSM手机正工作在赋闲,屏幕上也就显示个时间日期中国电信什么的,表面看没有什么。其实它内部的cpu高速运行忙碌地工作在诸如联络无线网络,查询是否有短消息发来,计算当前信号强度,时间等任务中。
你突然按下数字键“8”,此时内部cpu必须停下它正在干的工作来应付你,也就是清屏,显示你按下的数字8,然后再回到它原来的任务接着运行。(当然,这个例子不一恰当,现在有操作系统Windows-ce windows-mobile的手机的工作机制远没有如此的简单)

下面我们要接触和复习一些另杂碎,学习中断必须要弄明白单片机这些另杂碎,所以你还得忍耐他们一阵子。
(太晚了,待续)

[ 本帖最后由 崂山 于 2008-2-15 01:54 编辑 ]
发表于 2008-5-12 01:35:22 | 显示全部楼层
感谢崂山
您写得太通俗易懂了
让我一个刚刚接触到单片机的新手才看一遍一下子就感觉已经入门了
根本就不需要再去看什么教科书了
只要按照以上所写的内容
配合microchip相应型号的datasheet
好像已经不需要别的

可是

以上所写的可以说已经理解
而那些还没写完的 和一些还没写的
还是不懂啊

所以恳请老师继续写下去
对于新手来说
没有什么比这个更好的入门教材了!
您的教材将会造福无数像我这样急切需要入门的新手!

再次感谢
期待着续作
发表于 2008-6-19 09:36:58 | 显示全部楼层
原帖由 wey05 于 2007-7-19 11:49 发表
大胆纠正一下:
51机、AVR的存储系统都是哈佛结构:程序存储器和数据存储器起始地址相同,用不同的指令分别访问程序和数据区。51机是CISC,PIC和AVR是RISC(精简指令集)。个人电脑是诺伊曼结构(普林斯顿结构)程序和 ...

这位老兄的大胆纠正也不完全,所以再给补充一下,单片机随着技术的发展为2种结构都有,应该说具体什么结构应该看具体的型号而不能一概而论, 请参考下面的资料

哈佛结构是一种将程序指令存储和数据存储分开的存储器结构。中央处理器首先到程序指令存储器中读取程序指令内容,解码后得到数据地址,再到相应的数据存储器中读取数据,并进行下一步的操作(通常是执行)。程序指令存储和数据存储分开,可以使指令和数据有不同的数据宽度,如Microchip公司的PIC16芯片的程序指令是14位宽度,而数据是8位宽度。
    哈佛结构的微处理器通常具有较高的执行效率。其程序指令和数据指令分开组织和存储的,执行时可以预先读取下一条指令。目前使用哈佛结构的中央处理器和微控制器有很多,除了上面提到的Microchip公司的PIC系列芯片,还有摩托罗拉公司的MC68系列、Zilog公司的Z8系列、ATMEL公司的AVR系列和安谋公司的ARM9、ARM10和ARM11,51单片机也属于哈佛结构

    冯•诺伊曼结构也称普林斯顿结构,是一种将程序指令存储器和数据存储器合并在一起的存储器结构。程序指令存储地址和数据存储地址指向同一个存储器的不同物理位置,因此程序指令和数据的宽度相同,如英特尔公司的8086中央处理器的程序指令和数据都是16位宽。

    目前使用冯•诺伊曼结构的中央处理器和微控制器有很多。除了上面提到的英特尔公司的8086,英特尔公司的其他中央处理器、安谋公司的ARM7、MIPS公司的MIPS处理器也采用了冯•诺伊曼结构。

在DSP算法中,最大量的工作之一是与存储器交换信息,这其中包括作为输入信号的采样数据、滤波器系数和程序指令。例如,如果将保存在存储器中的2个数相乘,就需要从存储器中取3个二进制数,即2个要乘的数和1个描述如何去做的程序指令。图〔a)显示了一个传统的微处理器是如何做这项工作的。这被称为冯?诺依曼结构,是以一位数学家的名字命名的。冯?诺依曼结构中,只有一个存储器,通过一条总线来传送数据。乘两个数至少需要3个指令周期,即通过总线将这3个数从存储器中送到CPU。所以这种结构在面对高速、实时处理时,不可避免地造成总线拥挤。为此,哈佛大学提出了与冯?诺依曼结构完全不同的另一种计算机结构,人们习惯称之为哈佛结构,如图(b)所示。它根据数据和数据指令将存储器和总线分开。因此,总线操作是独立的,能同时取指令和数据,提高了速度。目前DSP内部一般采用的是哈佛结构,它在片内至少有4套总线:程序的数据总线,程序的地址总线,数据的数据总线和数据的地址总线。这种分离的程序总线和数据总线,可允许同时获取指令字(来自程序存储器)和操作数(来自数据存储器),而互不干扰。这意味着在一个机器周期内可以同时准备好指令和操作数。有的DSP芯片内部还包含有其他总线,如DMA总线等,可实现单周期内完成更多的工作。这种多总线结构就好像在DSP内部架起了四通八达的高速公路,保障运算单元及时地取到需要的数据,提高运算速度。因此,对DSP来说,内部总线是个资源,总线越多,可以完成的功能就越复杂。超级哈佛结构(super Harvard architecture,缩写为SHARC)如图(c)所示,它在哈佛结构上增加了指令cache(缓存)和专用的I/O控制器。

  根据程序存储方式的不同,单片机可分为EPROM、OTP(一次可编程)、QTP(掩膜)三种。我国一开始都采用ROMless型单片机(片内无 ROM,需片外配EPROM),对单片机的普及起了很大作用,但这种强调接口的单片机无法广泛应用,甚至走入了误区。如单片机的应用一味强调接口,外接 I/O及存储器,便失去了单片机的特色。目前单片机大都将程序存储体置于其内,给应用带来了极大的方便

[ 本帖最后由 kgp0213 于 2008-6-19 09:44 编辑 ]
发表于 2008-6-19 09:46:58 | 显示全部楼层

崂山老师哪里去了?

崂山老师怎么老是玩失踪啊?超级版主能否介绍一下崂山老师的情况?崂山老师可是不可多得的人才呢,这样玩失踪我等可是非常挂念呢
您需要登录后才可以回帖 登录 | 加入会员

本版积分规则

小黑屋|手机版|矿石收音机 ( 蒙ICP备05000029号-1 )

蒙公网安备 15040402000005号

GMT+8, 2024-5-4 06:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表