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

请whatcall指点一下程序的错误....

PIC单片机16F877,这个程序是用来检测输入电压的,,,用RA0脚检测输入电压,左偏置,只取高8位,,,,RA3~RA5与PC0~PC7配合用来显示检测电压的数字0~256之间,,,目前仿真和测试都不正常,,,请版主指点一下...
全部回复(5)
正序查看
倒序查看
藏经阁
LV.7
2
2007-07-13 12:25
这个是目前编的程序:
tmr0 equ 01h
pcl equ 02h
status equ 03h
porta equ 05h
portc equ 07h
intcon equ 0bh
pir1 equ 0ch
option1 equ 81h
trisa equ 85h
trisc equ 87h
adcon0 equ 1fh
adcon1 equ 9fh
adresh equ 1eh
adresl equ 9eh
;---------------
temp1 equ 20h
temp2 equ 21h
temp3 equ 22h
hundred equ 23h  
ten equ 24h
piece equ 25h
;-----------------
start:
org 00h
;config relevant register
movlw 00h
movwf intcon   ;config timer0
movlw b'00000111'
movwf option1   ;setup prescaler to 1:256
;***************
banksel trisa
movlw b'00000001'
movwf trisa
movlw 00h
movwf trisc
;****************
banksel adcon0
movlw b'01000001'
movwf adcon0
banksel adcon1
movlw b'00001110'
movwf adcon1  ;only take adresh
;****************
banksel adcon0
display:
call delay
bsf adcon0,2
check:
btfss pir1,6
goto check
movf adresh,0
;///////////////
clrf temp1
clrf temp2
clrf hundred
clrf ten
clrf piece
;//////////////
bsf status,0
movwf temp1
lp100:
movlw temp1
movwf temp2
movlw 64h
subwf temp1,1
incf hundred,1
btfsc status,0
goto lp100
;reset
movlw temp2
movwf temp1
decf hundred,1
bsf status,0
lp10:
movlw temp1
movwf temp2
movlw 0ah
subwf temp1,1
incf ten,1
btfsc status,0
goto lp10
movlw temp2
movwf piece
decf ten,1
goto display
;-----------------------
delay:    ;dalay program
clrf tmr0
bcf intcon,2
;//////////////////
loop:
movlw b'11111011'
movwf porta
movf piece,0
call table
movwf portc
movlw b'11110111'
movwf porta
movf ten,0
call table
movwf portc
movlw b'11101111'
movwf porta
movf hundred,0
call table
movwf portc
btfss intcon,2
goto loop
;/////////////////
return
;---------------------
;table list
table:
addwf pcl,1
retlw b'11000000' ;0
retlw b'11111001' ;1
retlw b'10100100' ;2
retlw b'10110000' ;3
retlw b'10011001' ;4
retlw b'10010010' ;5
retlw b'10000010' ;6
retlw b'11111000' ;7
retlw b'10000000' ;8
retlw b'10010000' ;9
end
0
回复
whatcall
LV.5
3
2007-07-13 18:40
@藏经阁
这个是目前编的程序:tmr0equ01hpclequ02hstatusequ03hportaequ05hportcequ07hintconequ0bhpir1equ0choption1equ81htrisaequ85htriscequ87hadcon0equ1fhadcon1equ9fhadreshequ1ehadreslequ9eh;---------------temp1equ20htemp2equ21htemp3equ22hhundredequ23h  tenequ24hpieceequ25h;-----------------start:org00h;configrelevantregistermovlw00hmovwfintcon  ;configtimer0movlwb'00000111'movwfoption1  ;setupprescalerto1:256;***************bankseltrisamovlwb'00000001'movwftrisamovlw00hmovwftrisc;****************bankseladcon0movlwb'01000001'movwfadcon0bankseladcon1movlwb'00001110'movwfadcon1  ;onlytakeadresh;****************bankseladcon0display:calldelaybsfadcon0,2check:btfsspir1,6gotocheckmovfadresh,0;///////////////clrftemp1clrftemp2clrfhundredclrftenclrfpiece;//////////////bsfstatus,0movwftemp1lp100:movlwtemp1movwftemp2movlw64hsubwftemp1,1incfhundred,1btfscstatus,0gotolp100;resetmovlwtemp2movwftemp1decfhundred,1bsfstatus,0lp10:movlwtemp1movwftemp2movlw0ahsubwftemp1,1incften,1btfscstatus,0gotolp10movlwtemp2movwfpiecedecften,1gotodisplay;-----------------------delay:    ;dalayprogramclrftmr0bcfintcon,2;//////////////////loop:movlwb'11111011'movwfportamovfpiece,0calltablemovwfportcmovlwb'11110111'movwfportamovften,0calltablemovwfportcmovlwb'11101111'movwfportamovfhundred,0calltablemovwfportcbtfssintcon,2gotoloop;/////////////////return;---------------------;tablelisttable:addwfpcl,1retlwb'11000000';0retlwb'11111001';1retlwb'10100100';2retlwb'10110000';3retlwb'10011001';4retlwb'10010010';5retlwb'10000010';6retlwb'11111000';7retlwb'10000000';8retlwb'10010000';9end
指点不敢当.没有仔细的看,有以下几个意见:
(1)专用寄存器最好还是用MPLAB自带的,省事不容易出错.include一下16F877对应的可包含文件(类似于C中的头文件).
(2)没看到你的CONFIG配置,是否是直接在MPLAB IDE中进行的?WDT有没有关掉?请检查一下,最好还是写在源文件里.
(3)ORG 00h后你的指令覆盖了中断向量0x004的地址,如果你用到中断这里就是很大的错误.应该在0x004之前用goto跳转到主程序的地址.
另外“仿真和测试都不正常”是指什么样的现象?用ICD2调试的话直接step进去一条条执行或设断点我想应该是可以查出问题的.如果压根就不可以调试,先检查硬件链接,在检查CONFIG的配置选项.总之,首先要确保MCU的时钟已经建立起来.
0
回复
藏经阁
LV.7
4
2007-07-16 09:42
@whatcall
指点不敢当.没有仔细的看,有以下几个意见:(1)专用寄存器最好还是用MPLAB自带的,省事不容易出错.include一下16F877对应的可包含文件(类似于C中的头文件).(2)没看到你的CONFIG配置,是否是直接在MPLABIDE中进行的?WDT有没有关掉?请检查一下,最好还是写在源文件里.(3)ORG00h后你的指令覆盖了中断向量0x004的地址,如果你用到中断这里就是很大的错误.应该在0x004之前用goto跳转到主程序的地址.另外“仿真和测试都不正常”是指什么样的现象?用ICD2调试的话直接step进去一条条执行或设断点我想应该是可以查出问题的.如果压根就不可以调试,先检查硬件链接,在检查CONFIG的配置选项.总之,首先要确保MCU的时钟已经建立起来.
谢谢whatcall的指点,,,,
(1)已经发现调用头文件确实比较方便,,,不会出错,,同时也省去不少事情.
(2)CONFIG 是在MPLAB IDE软件中配置的,,WDT和中断都关掉了
(3)因为中断关掉了,,所以没有跳过0004H
已经发现问题所在,,查表程序溢出了,,,程序老是跑飞,,,,原来是算法有问题,,,,

但这个程序运行出来的效果还是不太理想,,,,主要是低位显示老是不太稳定,,,,不知道是否是因为没有采用软件滤波的缘故,,,,还是显示设置有问题??
0
回复
whatcall
LV.5
5
2007-07-16 13:22
@藏经阁
谢谢whatcall的指点,,,,(1)已经发现调用头文件确实比较方便,,,不会出错,,同时也省去不少事情.(2)CONFIG是在MPLABIDE软件中配置的,,WDT和中断都关掉了(3)因为中断关掉了,,所以没有跳过0004H已经发现问题所在,,查表程序溢出了,,,程序老是跑飞,,,,原来是算法有问题,,,,但这个程序运行出来的效果还是不太理想,,,,主要是低位显示老是不太稳定,,,,不知道是否是因为没有采用软件滤波的缘故,,,,还是显示设置有问题??
低位不稳定是正常的,信号本来就有点波动,ADC采样也会有些误差.你可以把刷新的间隔设大一点(比如500ms),毕竟刷新太快人眼难以分辨也没有什么意义反而会造成低位闪烁不定的状况.
0
回复
藏经阁
LV.7
6
2007-07-17 09:36
@whatcall
低位不稳定是正常的,信号本来就有点波动,ADC采样也会有些误差.你可以把刷新的间隔设大一点(比如500ms),毕竟刷新太快人眼难以分辨也没有什么意义反而会造成低位闪烁不定的状况.
昨天晚上回家再弄了一下,,,,发现是A/D转换前延迟的时间太久了,,,,改短了就基本稳定了,,,,如果加上软件滤波效果应该更好,,,,改天试试,,,,

现在发现一个新问题:就是数码管显示的余辉会让数字显示不是很清楚,,,不知到是数码管的问题还是其它问题,,,版主有没有碰到过??
0
回复