• 回复
  • 收藏
  • 点赞
  • 分享
  • 发新帖

PIC16F73串口通信的问题

16F73内置有USART功能,我用PIC做一个发送测试测程序,从PIC上面发送一个字节的字符到PC,PC方使用串口调试助手看结果,但是没有加入任何循环的语句,PC放会不停的收到PIC发送过来的数据,我实在想不出是什么问题,我把程序贴出来,请大家帮我看看
led变量是用来跟踪程序执行的流程,结果目标板上的LED不停的闪烁,表示程序在不停的重复执行
watch窗口里看到TXREG寄存器里的数据一直没有没清空,不知道为什么,按理把数据丢进TXREG后,发送就会开始,发送结束后TEREG就会被清空
;
;TARANS.ASM
;baud rate:9600
;
list            p=16F73
#include        

trans_c        equ        0x20
led            equ        0x21
            org        0x00
            nop
            goto    initial

initial:

;set baud rate

            banksel    SPBRG
            movlw    .129            ;baud rate=9600
            movwf    SPBRG

;TX init

            bcf        TXSTA,SYNC
            bsf        TXSTA,BRGH
            banksel    TXSTA
            bsf        TXSTA,TXEN

;RC init

            banksel    RCSTA
            bsf        RCSTA,SPEN

trans:

            incf    led
            movf    led,w
            banksel    PORTB
            clrf    PORTB
            movwf    PORTB
            banksel    TRISB
            clrf    TRISB
            banksel    TXREG
            movlw    0x54
            movwf    TXREG
            end
全部回复(8)
正序查看
倒序查看
whatcall
LV.5
2
2007-10-26 19:03
程序缺少主循环,单片机会不停跑飞并复位.你看到的现象是合理的.
0
回复
flashhun
LV.2
3
2007-10-29 12:27
@whatcall
程序缺少主循环,单片机会不停跑飞并复位.你看到的现象是合理的.
主循环就是trans,仅仅为了测试,并没有写循环,就是想让程序发送一个字节就中止,为什么这样会不停的跑飞和复位呢
0
回复
xing1234
LV.6
4
2007-10-29 15:35
@flashhun
主循环就是trans,仅仅为了测试,并没有写循环,就是想让程序发送一个字节就中止,为什么这样会不停的跑飞和复位呢
我有点菜,程序看起来有些让人头晕.
0
回复
whatcall
LV.5
5
2007-10-29 18:59
@flashhun
主循环就是trans,仅仅为了测试,并没有写循环,就是想让程序发送一个字节就中止,为什么这样会不停的跑飞和复位呢
"就是想让程序发送一个字节就中止",应该在end前加上
stop:
  goto stop
来停在这里,否则单片机运行起来PC指针不停累加直到溢出从0000复位启动.
0
回复
flashhun
LV.2
6
2007-10-30 10:08
@whatcall
"就是想让程序发送一个字节就中止",应该在end前加上stop:  gotostop来停在这里,否则单片机运行起来PC指针不停累加直到溢出从0000复位启动.
你的意思是必须让PC指针在指定的范围内活动是吧,这样来,上面的是测试的程序当然就没有问题了,但是,我之前的程序是使用函数调用的方式发送单个字节,给定一个循环的次数,是有主循环的,循环结束后让程序停下来,但是PC方仍然是不停的收到数据,跟踪发现TRMT位始终不为1,这个才是我串口通信的主要问题,程序代码如下:
;
;TARANS.ASM
;baud rate:9600
;
list p=16F73
#include

trans_c equ 0x20
led equ 0x21
org 0x00
nop
goto initial

initial:

;set baud rate

banksel SPBRG
movlw .129 ;baud rate=9600
movwf SPBRG

;TX init

bcf TXSTA,SYNC
bsf TXSTA,BRGH
banksel TXSTA
bsf TXSTA,TXEN

;RC init

banksel RCSTA
bsf RCSTA,SPEN


trans:

banksel trans_c
decfsz trans_c,f
call send1
goto trans
stop:
goto stop


send1:

banksel TXSTA
btfss TXSTA,TRMT
goto send1
banksel TXREG
movlw 0x54
movwf TXREG
return
end
0
回复
anycrying
LV.5
7
2007-10-30 18:01
@flashhun
你的意思是必须让PC指针在指定的范围内活动是吧,这样来,上面的是测试的程序当然就没有问题了,但是,我之前的程序是使用函数调用的方式发送单个字节,给定一个循环的次数,是有主循环的,循环结束后让程序停下来,但是PC方仍然是不停的收到数据,跟踪发现TRMT位始终不为1,这个才是我串口通信的主要问题,程序代码如下:;;TARANS.ASM;baudrate:9600;listp=16F73#includetrans_cequ0x20ledequ0x21org0x00nopgotoinitialinitial:;setbaudratebankselSPBRGmovlw.129;baudrate=9600movwfSPBRG;TXinitbcfTXSTA,SYNCbsfTXSTA,BRGHbankselTXSTAbsfTXSTA,TXEN;RCinitbankselRCSTAbsfRCSTA,SPENtrans:bankseltrans_cdecfsztrans_c,fcallsend1gototransstop:gotostopsend1:bankselTXSTAbtfssTXSTA,TRMTgotosend1bankselTXREGmovlw0x54movwfTXREGreturnend
你那个:goto trans....,进不了后面的stop.
0
回复
whatcall
LV.5
8
2007-10-30 21:47
@flashhun
你的意思是必须让PC指针在指定的范围内活动是吧,这样来,上面的是测试的程序当然就没有问题了,但是,我之前的程序是使用函数调用的方式发送单个字节,给定一个循环的次数,是有主循环的,循环结束后让程序停下来,但是PC方仍然是不停的收到数据,跟踪发现TRMT位始终不为1,这个才是我串口通信的主要问题,程序代码如下:;;TARANS.ASM;baudrate:9600;listp=16F73#includetrans_cequ0x20ledequ0x21org0x00nopgotoinitialinitial:;setbaudratebankselSPBRGmovlw.129;baudrate=9600movwfSPBRG;TXinitbcfTXSTA,SYNCbsfTXSTA,BRGHbankselTXSTAbsfTXSTA,TXEN;RCinitbankselRCSTAbsfRCSTA,SPENtrans:bankseltrans_cdecfsztrans_c,fcallsend1gototransstop:gotostopsend1:bankselTXSTAbtfssTXSTA,TRMTgotosend1bankselTXREGmovlw0x54movwfTXREGreturnend
看看anycrying的回复吧,似乎朋友对于汇编程序的结构认识还是刚入门的阶段,多看一些书吧,打好基础.
0
回复
flashhun
LV.2
9
2007-10-31 09:16
@anycrying
你那个:gototrans....,进不了后面的stop.
多谢指正,的确是我写错了,我把他改过来就好了,这个问题的确是我对汇编的程序结构不清楚,我不知道原来自己需要控制PC指针的活动范围.多谢两位,还有就是用MPLAB的sim似乎跟踪下来的并非实际程序运行的流程,不知道这个debug是怎么用的
0
回复