完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
想写这篇帖子,有几个目的。1,论坛里到处充斥着各种资料分享,我想说大家吸收了多少,很多可能你只是下载下来了,看都没看过吧,我也一样很多没看过,我不认为论坛单纯靠这个行不通。2,我把我学习的经历跟大家说一说,也加深下我的知识。3,我想的东西,也许有些是错误的,希望大家可以指出来。有时间就写写。我用汇编,我本想学学C,感觉C太高级了,不能接受(现在做完项目后,肯定还有学,因为好多人用C,起码我虽不用,但是我要能看懂别人写的才行啊)。为什么用汇编呢?因为690采用RISC。一共就30几天指令,常用的就是10条左右。比起C来是不是更简单? 首先,我承认我学单片机到现在还没一年。我的学习是我老师(老板)给了两千行的汇编程序,外加一个DATASHEET自学的。还有一些知识,是平时自己乱翻阅的零散知识吧。单片机难学吗?它不是难在算法怎么做,而是你想问题的思路,如何去配合外部电路。例如,一个型号的单片机定时器中断,如何做一个20分钟的计时呢?产生PWM时候,需要多少的频率,多少占空比合适呢?如何在AD采样时候检测到一个准确的值?。。。。
大家学PIC大部分以877A学的吧。我用的是16F690,那我就以690为例子吧。其实以877也是一样的。我写这篇帖子,与其说讲解690,不如说是如何学习PIC单片机吧。 说单片机之前,先从基本的东西说起吧。可能大家觉得很EASY了。FLASH,EEPROM,RAM. FLASH是用来放程序的地方,也就是我们大家讲的PC,讲的地址,讲的指针,其实就是里面的一个个的单元。EEPROM就是掉电不丢失的‘U盘’,RAM通常指大家的特殊寄存器跟通用寄存器,用来放数据用的。 再讲一个,任何程序有两部分组成主程序跟中断程序(中断可以没有)。中断就像你在吃饭,有人给你打电话,你去接电话。中断就是说不定什么时候就发生了。PIC非常特殊,它的中断入口地址都是同一个04H。而且没有优先级,在处理某一个中断的时候,哪怕别的中断来了,只要正在出里中断没有处理完,就不会管别的中断。(它有一个软件上的优先级,这个后说,因为与程序有关)。 我们看单片机,常看见一个写4K*14是什么意思啊?4K代表的是FLASH,用汇编可以写4K行的程序,14是将每条汇编程序,在FLASH中是14位的。举个例子,一条指令由操作吗和操作数组成,操作码是6位的,操作数是8位(其中有一位代表目的寄存器是W还是F).还有一个东西就是PC,690是13位的,代表能寻址的最大范围是8K,因此对于690来讲,最高位是无效位。 今晚先写到这里,记住一句话,单片机说白了,就是让你合理的配置资源以配合外部电路的,不是什么流水灯,更也不是复杂的算法。 评分 |
|
相关推荐
|
|
用汇编写程序,不得不牵扯到一个东西.BANK。数据存储器是分几个BANK的。690为例子,它的数据存储器有512个单元啊,而操作数8位组成(其中一位是目的寄存器是W还是F),也就是说实际上7位组成的。2的7次方是128,所以要用4个BANK。所以在STATUS中存在两位RP1,RP0。7+2=9,2的9次方就是512了。
|
|
|
|
|
|
细心的,可能主要到STATUS中还有一位IRP.也与BANK相关,这是间接寻址时候用的,FSR寄存器装了地址是个8位的,2的8次是256,512个单元明显不够啊,所以多了这么一位。2的9次方就行了。
|
|
|
|
|
|
半年前刚接触,我对什么是系统周期,指令周期这东西概念都没有,大学学51,就跟本没学过一样,我把时间用来学电路了,当时都看不起这单片机什么的。毕业后做单片机发现都很重要。在群里问别人,什么是系统时钟。23个月后,基本上就会用单片机了。还有一些东西,是沉淀来的。即使我现在说了,也没用。所以我相信,我没有51做基础,都能学会。大家肯定没问题。
|
|
|
|
|
|
本帖最后由 我不是医生 于 2014-1-3 14:47 编辑
在烧写程序时候,PIC是用5根线的,VPP=13v,VDD=5V, VSS PGC PGD(不同的型号对应不同的引脚),注意烧写程序最好不要在PGC PGD VPP引脚上添加电容,电路板上有的时候,先拿掉再去烧写,烧好后再焊上。否则这些容性器件影响电平变化的速度导致程序少不进去。这些东西个人都经历过。 |
|
|
|
|
|
上面提到W跟F,W指的是工作寄存器work.而F指的的是特殊寄存器跟通用寄存器file.PIC采用了流水线结构,就是CPU在执行一条指令时候,PC已经加1了。例如MOVLW 01H , BTFSC LOGIC_FLAG,2 当执行第一句时候,指令已经指向 BTFSC 这一句了。因为采用了哈佛结构。数据跟程序是分开的。所以执行速度是冯诺依曼结构的2倍。
|
|
|
|
|
|
前面关于数据存储区提到BANK。而在程序存储区有个类似的叫PAGE.就是说程序是分页的。因为一页上可能放不下你的程序。GOTO CALL指令关于目的地址11位是关于目的地址的。前面讲了PC是13位的,最高一位为无效位,可以认为是12位的。11位能寻址FLASH的2k,690是4K的FLASH,如何寻址,所以在PCLATH寄存器有关于页的位。所以实行这两条语句时候注意页的位。小程序写不到2K就不用管。
|
|
|
|
|
|
说到CALL 不得不提堆栈。先进后出,想必大家都明白。PIC采用的是硬件实现的形式,不用PUSH POP的。CALL 或者发生中断动作时候自动入栈,返回时候就是出栈。入栈就是指令执行的地址,出栈就是还原地址。硬件上是8级深度,就说CALL里面允许出现CALL,但是最多能套7个。再多的话,返回时候 前面的找不到返回地址了。
|
|
|
|
|
|
本帖最后由 我不是医生 于 2014-1-3 13:54 编辑
我没学过写书,怎么搭建框架也不是很清楚。随手写吧。想到什么写什么。配置寄存器时候留意下,哪位是可读的,哪位是可写的,哪位是即可读也可写的。还有DATASHEET才是最重要的学习资料,注意介绍某一个模块时候的框图。很重要。有一点注意,端口在写的时候,如果一个PORT口直接驱动一个三极管,BSF时候,基极电压时0.7V。所以以后读的时候,读到的是低电平。我们是置了高电平,读到的是低电平。我们想把这个端口的高低电平复制到另一个电平,就牵扯到写了。写是一个读——修改——写的过程,读都错了,写肯定错。方法就先说个根本的吧,在基极加个电阻或者上拉。 |
|
|
|
|
|
在写程序时候,第一步应该是进行资源的配置,先说关于PORT的配置,我们关注这几个寄存器TRISX,PORTX,ANSEL,IOCX.分别代表是初始时候是模拟的还是数字的,是高电平还是低电平,是输入还是输出,是否配置了弱上拉。细节性的东西就是你配置为模拟输入时候,不管你在初始配置高低电平时候都无效。
|
|
|
|
|
|
关于语句的东西,大家自己看,记住移动,加减,移位,位的操作,与或非反。就存在这几个东西。我有些也记不住,去看看DATASHEET就行了,做单片机不在于你吧所有的指令记住,大体知道有哪些功能就行了。当然PIC690单片机里没有乘除法,这个要自己写个函数。尤其注意它们的目的寄存器是w还是f.不同的PIC单片机汇编指令是有可能不同的,建议用单片机时候注意下语句,还是那句话,语句不是关键。当然在程序编写窗口也会发现不能识别的语句,颜色不同。用汇编的好处,你写了多少FLASH,自己一看就基本有数,不像C语言,完全蒙在鼓里。
|
|
|
|
|
|
关于TIMER0,就是一个单纯的定时器或者计数器,如果预分频比是1:4,要么每4条指令+1,要么端口每4个上升沿(下降沿)+1,TMR0从0到255时候加上2个延迟指令周期,TMR0F便发生了值1.中断中一定要用软件清除。一般的计时,建议用个计时器完成。因为后续的计时器带有别的功能。说实话我最喜欢的一个定时器是TIMER2,因为可以设定上限。但是很多不时候用起来不方便,因为我经常用到PWM。
|
|
|
|
|
|
关于TIMER1,它的最大特点个人认为就是带捕捉比较功能,而且是16位的。先从最简单的说起,就是如何去读取TMR1H,TMR1L的值,因为它是一个16位的,所以要读两次。先读高位,后读低位,再读高位,比较两次的高位,如果变化了,就以新的做高位,没变就以原来的做高位。想想为什么?MOVF TMR1H,0 MOVWF TIMER1H MOVF TMR1L,0 MOVWF TIMER1L MOVF TMR1H,0 XORWF TIMER1H,0 BTFSC STATUS,Z GOTO XXXX(更新高位) GOTO YYYY(两次相同)
|
|
|
|
|
|
本帖最后由 我不是医生 于 2014-1-4 15:12 编辑
关于ADC。想说几点。1,我们在采样时候通常利用数字滤波法(3个求平均,取中间值。。。。),完成每次采样,一定要加上时间延时。否则里面的采样保持电容充不满电,采样结果就不正确了。这个时间不用太长,用指令延时的方法就足以。us级别的。2,采样时候,对于信号源的内阻不宜过大,太大的话,且流入单片机的电流也不该过大。合适的折中下。3,采样时候,最好用有源低通滤波器滤去噪声,有源的好处多多。实在不行就用RC无源低通滤波。推荐有源,因为能对信号进行缩放,输出阻抗近似为0.再说个小技巧吧。通常采样的结果是10位的,我们可以选择左对齐的方式,取高8位就行了。就像9857跟9850一样,差距很小。因为是汇编,10位都用的太繁琐,C的话倒是简单了。 |
|
|
|
|
|
关于ADC,还有TIMER1.还有一点就是比较功能中‘特殊事件的发生’。就是定时采样的意思。TMR1H,TMR1L与CCPR1H,CCPR1L相等的时候,如果ADC是打开的,将对设置了模拟通道的信号进行自动进行采样。不用人为的GO.采样完成后ADIF就会置1。此时就可以读出采样值。很关键的一点是,采样时候一定要单通道采样,采样不可能几个通道同时去采样的,还有个前提就是ADC一定是打开的才行。有一点不用担心,当TMR1HL与CCPR1HL匹配时候,TMR1HL自动清零。 这个功能我尽管没用过,我相信应该没问题。
|
|
|
|
|
|
只有小组成员才能发言,加入小组>>
求解外围电路实现的是4脚给持续低电平复位并正常工作,高电平不工作的原因
2086 浏览 1 评论
3630 浏览 3 评论
PIC1946程序有一个变量在运行过程中恢复初始值其他变量保持不变
2336 浏览 2 评论
2763 浏览 0 评论
PIC16F1825的RC5引脚,在主程序中操作无效,在中断中可以改变是为什么?
4029 浏览 5 评论
976浏览 0评论
用XC8编译PIC18F25K80时提示下面Error,求怎么解决这个问题
6362浏览 0评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-4 14:10 , Processed in 1.059515 second(s), Total 109, Slave 91 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号