耳机大家坛老帖 » DIY及技术讨论区 » ◎大家来玩MCU◎ ---(0001:运行我的第一个程序)
« 1 234» Pages: ( 1/4 total )
本页主题: ◎大家来玩MCU◎ ---(0001:运行我的第一个程序) 打印 | 加为IE收藏 | 收藏主题 | 上一主题 | 下一主题

sword_yang

头衔:www.littledot.net www.littledot.net

级别: 新手上路
精华: 4
发帖: 33716
威望: 8382
金钱: 29432
在线时间:10102(小时)
注册时间:2004-09-29
最后登录:2013-09-20

◎大家来玩MCU◎ ---(0001:运行我的第一个程序)

描述:1、工具选择
图片:
描述:2、进入IDE工作界面
图片:
描述:3、芯片Configure选择
图片:
描述:4、汇编运行
图片:
图片:
【关键词】创建Project、汇编、DEBUG运行、
有了仿真调试器和评估板,解决了MPLAB IDE的安装困扰,我们就可以进入软件调试运行的小天地啦!
进入这个小天地,不要被那些犹如“天书”般的程序代码所迷惑。让我们“先玩为快”,来试试RUNING我们的第一个程序:MYFIRST.ASM吧:
程序虽然简单,但是为了避免输入打字差错和节省时间,建议大家在这里下载源代码:
论坛上程序的排版也比较乱,大家也可以下载本讲的文本文件。
http://www.little-tube.com/bbs/dispbbs.asp?boardid=3&id=2049&star=1#2049
◎准备工作:
1)用小一字螺丝刀把四个数码管拆下(本程序还用不上数码管);
2)把评估板的4位DIP开关拨到ON的位置。

◎在MPLAB IDE上建立你的Project:
1)在你的电脑建立一个文件夹(例如C:\MY MCU)
2)把下载的MYFIRST.ASM copy到这个文件夹里
3)打开MPLAB ICD v7.60
4)点击进入Project的“Project Wizard”
5)“下一步”Device 栏目里上/下拉选择PIC16F873A
6)“下 一步”(请看截图1:软件工具选择)
7)在Create New Project File 点Browse,找到路径C:\MY MUC 填入MYFIST
  在下面一个Browse里在同样路径也填入MYFIRST
8)在Add existing files to your projict里面,找到MYFIRST.ASM 点击Add添加
9)下一步给出一个Summary点击“完成”,就进入IDE工作界面了(见截图2)。
10)在Configure里面先把Configuration Bits set in code 那个“勾”去掉,按我的截图3“Configure选择”设置好
11)在Debugger里面选择工具:“1 MPLAB ICD 2”,这时候就完成了调试设置,一个Project就建好了。

◎汇编,运行程序:
1)在弹出的“MYFIRST.mcw”框里,点击Source Files 下的MYFIRST.ASM文件,整个源程序文件就会打开
2)点击汇编工具条(Build All图框),就会开始汇编
3)点击下载工具条(Program target device图框),就把汇编好的目标代码下载到芯片了
4)点击运行(右三角Run图标),程序就开始运行了(以上四步骤,请参见截图:汇编运行)
5)以后要再次打开这个Project来修改,运行,只需要在Project选项里面选择“OPEN”,再打开目录中的MYFIRST.mcp就行了。

◎脱机运行:
1)在Debugger里面选择工具:“None”(无工具),退出Debugger界面
2)在Programmer里面选择工具:“2 MPLAB ICD 2”
3)这时候界面进入到编程界面
4)点击下载工具条(Program target device图框),就把汇编好的目标代码烧写到芯片了
5)把6芯电话插头从评估板拔出,程序就可以脱开仿真调试器运行了。





;TITLE 'MYFIRST_DEMO_1 PROGRAM'
;    (C) copyright by Little Dot CO,.LTD.
;DESIGN  DATE  BEGIN:  2007/10/15
;FINISH:                2007/10/15 (V1.0)
;Programan:            My 
;=================================================    ;以上这是写给自己看的文件头,作为一个良好编程习惯应该有的。
;本程序是一个演示MCU的I/O端口输入、输出的示范程序,
;当四个开关K1~K4任意按下时,相应的LED1~LDE4就会点亮
;程序虽然简单,但是也说明MCU能够知道你要它干什么活儿了。                         

                list p=16f873A                        ;这是告诉汇编器我们选用的芯片型号

                #include <p16f873a.inc>              ;这是调用系统附带的初始化文件,用来定义特殊寄存器的“房间”                                                              ;由于在特定的MCU里,这些“房间号码”都是固定的,所以直接引用就是了

; ***********************************************
; *            Variable definitions            *    ;这些就是我们在程序中要用到的变量了
; ***********************************************    ;以下分别定义了按钮四个开关和四个LED的Bit位         
K1            EQU        .2              ; PORTA 的第2端口
K2            EQU        .3          ; PORTA 的第3端口   
K3            EQU        .4            ; PORTA 的第4端口
K4            EQU        .5            ; PORTA 的第5端口
LED1            EQU        .3          ; PORTB 的第3端口
LED2            EQU        .2            ; PORTB 的第2端口
LED3            EQU        .1            ; PORTB 的第1端口
LED4            EQU        .0            ; PORTB 的第0端口
                                                      ;MCU的端口都是很灵活的,具体用那一个做什么往往我们根据电路板排列
;*************************************************    ;以及端口的性能来决定,例如有些功能A端口有,B端口没有,那就只能用A

                ORG    0X00            ;ORG是一条伪指令,用来设定程序从程序存储器的0X00地址开始存储和执行
                NOP                ;NOP 是一条空操作指令,不做什么事情,磨蹭一下而已
                GOTO    INIT_START              ;跳转到初始化程序段执行,因为接下来的房间,是用来存放将来会用到的中断                                                        ;入口的
   
                ORG    0X07                    ;又是一条伪指令,表示下面的程序从0X07开始 
INIT_START
        CLRF    PORTA            ;初始化端口A ,分配那个端口作为输入,那个做输出
                BSF    STATUS,RP0
                MOVLW  B'00111100'            ; RA0-3 INPUT 分配端口A的2、3、4、5端口为输入口,对应于我们的四个按键
                MOVWF  TRISA
        MOVLW  B'10000110'            ; Select all digital
        MOVWF    ADCON1       
                BCF    STATUS,RP0   
        CLRF    PORTB            ;初始化端口B ,分配那个端口作为输入,那个做输出
                BSF    STATUS,RP0
                MOVLW  B'11110000'            ; RB0-3 OUTPUT  分配端口B的0~3为输出口,对应于我们的4个LED
                MOVWF  TRISB       
                BCF    STATUS,RP0           
        MOVLW    0X3C            ;给端口A赋值:0X3C = 二进制的00111100使得我们的按键电位拉高           
        MOVWF    PORTA 
        MOVLW    0X0F            ;给端口B赋值:0X0F = 二进制的00001111使得我们LED一开始是灭的           
        MOVWF    PORTB                                               
;========================================
Main_Loop:       
        NOP

TEST_K1:
        BTFSC    PORTA,K1        ;判断K1是否按下?(按下:端口A2是低电平,没有按:是高电平)
        GOTO    TK_1
        BCF    PORTB,LED1        ;如果按下,就点亮LED1,请注意,这里用PNP管作为驱动管,低电位点亮
        GOTO    TEST_K2
TK_1:        BSF    PORTB,LED1        ;如果没有按下,就在端口B3输出高电平,关闭LED1
TEST_K2:   
        BTFSC    PORTA,K2                ;下面的程序段和K1,LED2完全一样,只是处理的按键和LED不同而已。
        GOTO    TK_2
        BCF    PORTB,LED2
        GOTO    TEST_K3
TK_2:        BSF    PORTB,LED2        ;以上处理K2、LED2
TEST_K3:
        BTFSC    PORTA,K3        ;以下处理K3、LED3
        GOTO    TK_3
        BCF    PORTB,LED3
        GOTO    TEST_K4
TK_3:        BSF    PORTB,LED3
TEST_K4:
        BTFSC    PORTA,K4        ;以下处理K4、LED4
        GOTO    TK_4
        BCF    PORTB,LED4
        GOTO    TEST_END
TK_4:        BSF    PORTB,LED4

TEST_END:       
        goto    Main_Loop        ;回到主循环开始的地方,周而复始地扫描4个按键,做出相应的处理。

;================================================
        END                            ;程序结束标志


◎本贴出现的指令“生词”:
(括号里是与之逻辑相反的,也可能暂时没有出现)
EQU
ORG
GOTO
NOP
CLRF
BSF(BCF)
MOVLW 
MOVWF
BTFSC(BTFSS)
END
(若有遗漏,请大家补充)
我只是把它们列举出来,这些指令的含义是什么,上面的注释里已经有简要说明,详细的用法说明请看参考书。
如果有不明白的,大家一起讨论。希望大家像学习英语单词一样去了解它们的含义,但不需要去背,反复使用就熟了。
也希望了解这些指令的人,把它们的含义跟帖在后面。
修改过的评估板原理图附上,这是和PCB对应的。

【下一讲概要】:
PIC MCU的端口、内部存储器、程序的架构等。。。


[ 此贴被sword_yang在2007-10-28 20:07重新编辑 ]
顶端 Posted: 2007-10-21 16:49 | [楼 主]
数码发烧友

头衔:shop34275212.taobao.com shop34275212.taobao.com

级别: 蝙蝠侠
精华: 0
发帖: 5155
威望: 810
金钱: 3852
在线时间:3797(小时)
注册时间:2006-07-26
最后登录:2013-08-26

**
顶端 Posted: 2007-10-21 16:52 | 1 楼
actroxn




级别: 侠客
精华: 0
发帖: 157
威望: 34
金钱: 158
在线时间:487(小时)
注册时间:2006-03-16
最后登录:2013-09-01

坐下先,听课ing........

“1)用小一字螺丝刀把四个数码管拆下(本程序还用不上数码管);”
可是我是直接把数码管焊在基板上的呀
………………


[ 此贴被actroxn在2007-10-21 17:41重新编辑 ]
顶端 Posted: 2007-10-21 17:19 | 2 楼
actroxn




级别: 侠客
精华: 0
发帖: 157
威望: 34
金钱: 158
在线时间:487(小时)
注册时间:2006-03-16
最后登录:2013-09-01

刚依葫芦画瓢程序运运行成功了  
顶端 Posted: 2007-10-21 17:35 | 3 楼
renzhiy




级别: 侠客
精华: 0
发帖: 288
威望: 74
金钱: 295
在线时间:171(小时)
注册时间:2004-12-29
最后登录:2012-10-30

K1            EQU        .2              ; PORTA 的第2端口
K2            EQU        .3          ; PORTA 的第3端口   
K3            EQU        .4            ; PORTA 的第4端口
K4            EQU        .5            ; PORTA 的第5端口
LED1            EQU        .3          ; PORTB 的第3端口
LED2            EQU        .2            ; PORTB 的第2端口
LED3            EQU        .1            ; PORTB 的第1端口
LED4            EQU        .0            ; PORTB 的第0端口

在这里怎么知道哪个是对应 PORTA和 PORTB??
顶端 Posted: 2007-10-21 17:38 | 4 楼
sword_yang

头衔:www.littledot.net www.littledot.net

级别: 新手上路
精华: 4
发帖: 33716
威望: 8382
金钱: 29432
在线时间:10102(小时)
注册时间:2004-09-29
最后登录:2013-09-20

呵呵,不错!
建议你看看指令“生词”。。。
顶端 Posted: 2007-10-21 17:39 | 5 楼
sword_yang

头衔:www.littledot.net www.littledot.net

级别: 新手上路
精华: 4
发帖: 33716
威望: 8382
金钱: 29432
在线时间:10102(小时)
注册时间:2004-09-29
最后登录:2013-09-20

Quote:
引用第4楼renzhiy于2007-10-21 17:38发表的  :
K1            EQU        .2              ; PORTA 的第2端口
K2            EQU        .3          ; PORTA 的第3端口   
K3            EQU        .4            ; PORTA 的第4端口
K4            EQU        .5            ; PORTA 的第5端口
LED1            EQU        .3          ; PORTB 的第3端口
.......

在这里无需对应,它只是赋值K1=2而已,后面要用到:
BTFSC  PORTA,K1        在这里才对上了,这和51的Bit变量是不同的。
顶端 Posted: 2007-10-21 17:41 | 6 楼
YLS



头衔:街头小混混 街头小混混

级别: 验证会员
精华: 2
发帖: 1083
威望: 715
金钱: 1479
在线时间:617(小时)
注册时间:2003-02-22
最后登录:2013-05-31

图片:
图片:
点击source file下的myfirst.asm后, 弹出了错误讯息.
点击first.mcp > build all后, output视窗显示一堆错误. 停下来
顶端 Posted: 2007-10-21 18:55 | 7 楼
sword_yang

头衔:www.littledot.net www.littledot.net

级别: 新手上路
精华: 4
发帖: 33716
威望: 8382
金钱: 29432
在线时间:10102(小时)
注册时间:2004-09-29
最后登录:2013-09-20

看来是文件路径不对,请检查一下。
可以重新建立,在建立Project的第7)步要特别注意检查一下。
顶端 Posted: 2007-10-21 19:43 | 8 楼
清水楼台


级别: 蝙蝠侠
精华: 0
发帖: 790
威望: 533
金钱: 1390
在线时间:227(小时)
注册时间:2005-08-07
最后登录:2014-06-04

迟到了,都上课了哈!~搬个凳子坐下听...
顶端 Posted: 2007-10-21 20:15 | 9 楼
YLS



头衔:街头小混混 街头小混混

级别: 验证会员
精华: 2
发帖: 1083
威望: 715
金钱: 1479
在线时间:617(小时)
注册时间:2003-02-22
最后登录:2013-05-31

问题解决了, 最初是将project建立在桌面一个文件夹内, 做什么也发生错误.
后来将project建立在My Document的一个文件夹内, 则可正常运行.
问..是否在debugger运行正确后, 要再选programmer烧录一次, 实验板才可脱离icd独自工作?
顶端 Posted: 2007-10-21 20:26 | 10 楼
sword_yang

头衔:www.littledot.net www.littledot.net

级别: 新手上路
精华: 4
发帖: 33716
威望: 8382
金钱: 29432
在线时间:10102(小时)
注册时间:2004-09-29
最后登录:2013-09-20

是的,有关烧写的内容,已经补充到主贴了。


[ 此贴被sword_yang在2007-10-21 21:08重新编辑 ]
顶端 Posted: 2007-10-21 20:54 | 11 楼
renzhiy




级别: 侠客
精华: 0
发帖: 288
威望: 74
金钱: 295
在线时间:171(小时)
注册时间:2004-12-29
最后登录:2012-10-30

杨老师,我知道是赋值,
K1            EQU        .2              ; PORTA 的第2端口
LED2            EQU        .2            ; PORTB 的第2端口
这两句不看注释怎么知道是PORTA 和PORTB 的对应端口呢???
顶端 Posted: 2007-10-21 20:58 | 12 楼
big-eblis




级别: 骑士
精华: 0
发帖: 1336
威望: 475
金钱: 1703
在线时间:1169(小时)
注册时间:2005-08-26
最后登录:2013-07-07

Quote:
引用第12楼renzhiy于2007-10-21 20:58发表的  :
杨老师,我知道是赋值,
K1            EQU        .2              ; PORTA 的第2端口
LED2            EQU        .2            ; PORTB 的第2端口
这两句不看注释怎么知道是PORTA 和PORTB 的对应端口呢???


我来试着解释下吧。这个和C51的语句不同,不需要预先指定具体端口,而是预先指定某端口的具体I/O号。
要知道它的实际操作端口,看下面的指令:
TEST_K1:
        BTFSC    PORTA,K1        ;判断K1是否按下?(按下:端口A2是低电平,没有按:是高电平)
        GOTO    TK_1
        BCF    PORTB,LED1        ;如果按下,就点亮LED1,请注意,这里用PNP管作为驱动管,低电位点亮
        GOTO    TEST_K2
其中"BTFSC PORTA,K1"就是判断端口A的2号I/O状态
“BCF PORTB,LED1”就是根据上句话的结果执行对端口B的2号I/O赋值操作
杨老师我这样理解正确不?
另外,发现这个MCU的语言与C51大同小异,也不是十分的难懂。但是我觉得入门可能还是C51汇编更简单些。比如楼主的问题,用C51汇编写就是
K1 EQU P0.2
LED2 EQU P1.2
不用考虑后继的问题,是不是容易理解很多!
顶端 Posted: 2007-10-21 21:16 | 13 楼
sword_yang

头衔:www.littledot.net www.littledot.net

级别: 新手上路
精华: 4
发帖: 33716
威望: 8382
金钱: 29432
在线时间:10102(小时)
注册时间:2004-09-29
最后登录:2013-09-20

Quote:
引用第12楼renzhiy于2007-10-21 20:58发表的  :
杨老师,我知道是赋值,
K1            EQU        .2              ; PORTA 的第2端口
LED2            EQU        .2            ; PORTB 的第2端口
这两句不看注释怎么知道是PORTA 和PORTB 的对应端口呢???

这里只是给K1赋值,和具体用在什么端口是没有联系,注释也是提醒我们自己这个Bit变量以后是准备用在A端口或者B端口。
只有到了用的时候,在指令中和具体的端口组合在一起,它才能真正在相应的端口中起作用。
例如:
K1      EQU    .2       
如果我们这么用:
BTFSC    PORTA,K1            ;这表明测试的是PA的第二端口
同时也可以这么用(当然是不规范的,只是为了说明问题):
BTFSC    PORTB,K1              ;这表明测试的是PB的第二端口了

也就是说,
K1  EQU    .2
只是把这个值赋给了K1,它和使用什么端口没有必然的逻辑联系(当然我们的硬件电路是规定了K1已经固定地接到了端口A).
顶端 Posted: 2007-10-21 21:18 | 14 楼
sword_yang

头衔:www.littledot.net www.littledot.net

级别: 新手上路
精华: 4
发帖: 33716
威望: 8382
金钱: 29432
在线时间:10102(小时)
注册时间:2004-09-29
最后登录:2013-09-20

Quote:
引用第13楼big-eblis于2007-10-21 21:16发表的  :


我来试着解释下吧。这个和C51的语句不同,不需要预先指定具体端口,而是预先指定某端口的具体I/O号。
要知道它的实际操作端口,看下面的指令:
TEST_K1:
.......

是的,对于Bit变量,51要简单很多。PIC因为是RISC的缘故,指令种类要少很多。当然RISC也有它的优点:指令执行时间的唯一性很好。
顶端 Posted: 2007-10-21 21:20 | 15 楼
big-eblis




级别: 骑士
精华: 0
发帖: 1336
威望: 475
金钱: 1703
在线时间:1169(小时)
注册时间:2005-08-26
最后登录:2013-07-07

是的,RISC的速度快,MCU硬件结构简单,对执行时间的控制更精确。不过相应的代价就是由于指令数量少而带来的程序复杂性大幅提高。可谓有利有弊吧!
顶端 Posted: 2007-10-21 21:26 | 16 楼
sword_yang

头衔:www.littledot.net www.littledot.net

级别: 新手上路
精华: 4
发帖: 33716
威望: 8382
金钱: 29432
在线时间:10102(小时)
注册时间:2004-09-29
最后登录:2013-09-20

RISC指令其实也复杂不了多少,只是不同指令集的习惯问题。
顶端 Posted: 2007-10-21 21:36 | 17 楼
big-eblis




级别: 骑士
精华: 0
发帖: 1336
威望: 475
金钱: 1703
在线时间:1169(小时)
注册时间:2005-08-26
最后登录:2013-07-07

也许吧,没有学,无法比较-C51都还没学完
顶端 Posted: 2007-10-21 21:47 | 18 楼
renzhiy




级别: 侠客
精华: 0
发帖: 288
威望: 74
金钱: 295
在线时间:171(小时)
注册时间:2004-12-29
最后登录:2012-10-30

感谢big-eblis 的帮忙和杨老师的耐心解释,我是不是可以这么理解
我们先确定把某I/O赋值给某动作(这里先理解成动作把),例如第二个端口,至于是A或B要根据程序中具体使用的某一步来确定出来。
呵呵
顶端 Posted: 2007-10-21 22:11 | 19 楼
« 1 234» Pages: ( 1/4 total )
耳机大家坛老帖 » DIY??????

Powered by PHPWind 网友所发文章不代表本站立场,耳机大家坛版权所有,未经许可不得转载。 www.erji.net 浙icp备08008246号
战略合作伙伴:深圳市恒之瑞科技有限公司 《中华人民共和国增值电信业务经营许可证》粤B2-20120704
耳机大家坛成立于2002年  《耳机大家坛》图形LOGO及文字均为注册商标