查看: 1499|回复: 12
|
[16F877A] RB0/Int Interrupt 的问题 - 有新问题在#9
[复制链接]
|
|
发表于 2-12-2008 10:59 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 2-12-2008 10:50 PM
|
显示全部楼层
其实我并没有详细地看完你整个 program。你改一改你的code,然后 program 进去试一试不就知道能不能用了嘛。 |
|
|
|
|
|
|
|
楼主 |
发表于 2-12-2008 10:45 PM
|
显示全部楼层
是这样的吗@@” 我真的不知道呢
可是goto不是也能用return来返回吗?
我以前都在用goto地说 XD
那改去call了会解决不能interrupt的问题吗@@ 。。 《-- 最想知道还是这个
--------update--------
改去用call还是一样,int不能用。。。
我要疯了><
[ 本帖最后由 SolBadguy2 于 2-12-2008 10:52 PM 编辑 ] |
|
|
|
|
|
|
|
最近开始研究用interrupt,可是怎么研究都不能用
希望有人可以帮帮那个忙,拜托了!
我的project, 有3个switch, RB6,RB7, RB0, 然后有2个LED在RD6,RD7
RB0的switch只用来trigger interrupt,所以只会开一下子就立刻关掉
然后进入ISR,检查哪个switch (RB6 or RB7) is turned on,然后进入个别的 led blinking routine.
下面是我的code
list p=16F877A
include "16F877A.inc"
__CONFIG _LVP_OFF & _XT_OSC & _WDT_OFF & _PWRTE_OFF & _CP_OFF & _BODEN_OFF
LED_2 equ 7
LED_1 equ 6
SW_1 equ 7
SW_2 equ 6
cblock
d1
d2
d3
d4
d5
d6
d7
endc
org 0x200
goto main
org 0x204
goto move_ISR
main
bsf STATUS,RP0 ; change to bank1
movlw 0xFF ortB as input
movwf TRISB
movlw 0x00
movwf TRISD ortD as output
bsf OPTION_REG,INTEDG ; interrupt occur on rising edge of RB0/Int
bcf STATUS,RP0 ; change to bank0
clrf PORTD
clrf PORTB
movlw b'10010000'
movwf INTCON ; Set GIE and INTE, clear flag bits
loop sleep
goto loop
move_ISR goto delay_10ms
btfsc INTCON,INTF ;chk if RB0 request interrupt
goto ISR ;jump to chk_SW if RB0 causes interrupt
retfie ;return to main prog if RBO did not issue a int
ISR bcf INTCON,INTF ; clear RBO int flag bit
clrf PORTD ; stop all the LED
chk_SW goto delay_10ms
btfsc PORTB,SW_1 ; chk if the switch is turn on
goto doLED_1 ; jump do movement program if its turn on
btfsc PORTB,SW_2
goto doLED_2
retfie
; SW 1 and 2 is not pressed
doLED_1 goto delay_10ms
btfss PORTB,SW_1 ; chk if switch 1 is still pressed
return
led1_blink
bsf PORTD,LED_1
goto delay_0p5s
bcf PORTD,LED_1
goto delay_0p5s
goto led1_blink
doLED_2
goto delay_10ms
btfss PORTB,SW_2
led2_blink
bsf PORTD,LED_2
goto delay_0p5s
bcf PORTD,LED_2
goto delay_0p5s
goto led2_blink 我的delay routine没放在这里,因为浪费位子@@“
OK,问题是:
1.) 我用bootloader test,可是不能用, 有mplab sim ,我的program一直不能进入 interrupt...到底是怎么了?
2.) 还有,一旦进入闪LED,就forever loop了。 可是我想再次打开RB0 switch时让它又在进入一次 interrupt。 请问我可以在ISR里set GIE吗?
[ 本帖最后由 SolBadguy2 于 16-12-2008 06:16 PM 编辑 ] |
|
|
|
|
|
|
|
发表于 2-12-2008 10:09 PM
|
显示全部楼层
我想你应该是要 call delay 才对吧。而不是 goto delay。 |
|
|
|
|
|
|
|
楼主 |
发表于 2-12-2008 10:24 PM
|
显示全部楼层
|
|
|
|
|
|
|
发表于 2-12-2008 10:42 PM
|
显示全部楼层
call 和 goto 的差别是:
call 会把当前的 program counter save 在 stack,然后当你实行完你的 subroutine (比如说 delay) 后,你可以 return 回去之前的位置。
而 goto 却是直接跳去那个位置,一去不回头 |
|
|
|
|
|
|
|
发表于 9-12-2008 09:15 AM
|
显示全部楼层
原帖由 SolBadguy2 于 2-12-2008 10:59 PM 发表
我在想,会不会是我的circuit错了@@”
请帮忙查查:
图并不完整,RB7 最好经过一颗电阻才接到 5V. RB0 和 RB6 不属于完整的电路,改好后再寄。发光二极管也不能直接连接 RD7, 必须经过一颗电阻,以避免零件各自损伤导致失灵。
[ 本帖最后由 rothmans 于 9-12-2008 09:17 AM 编辑 ] |
|
|
|
|
|
|
|
楼主 |
发表于 16-12-2008 06:15 PM
|
显示全部楼层
原帖由 rothmans 于 9-12-2008 09:15 AM 发表
图并不完整,RB7 最好经过一颗电阻才接到 5V. RB0 和 RB6 不属于完整的电路,改好后再寄。发光二极管也不能直接连接 RD7, 必须经过一颗电阻,以避免零件各自损伤导致失灵。
哦!RB0 RB6 都是和RB7一样!用
哈哈。。其实是懒惰话而已:P 。。。 用paint超难画的说 :P
请问下,如果用simulation (ISIS) test program能用,在practical时,program也会work吗? 还是会有小差别?
还有,我有新问题!
现在,我的project会用到parallel port send 3bit的signal到3个pin(8个combination)
然后,我要pic check那3个pin的signal,然后跳到对应的routine..
就好象, chk到 0 0 0时会跳去turn off LED
chk到1 1 1是会跳去blink LED
chk到 101 时又会怎样怎样的。。
请问我该怎样做呢? 可以写个sample code吗? 还是可以介绍我读些什么的? (我不懂用什么字眼来search ><)
P.S=我用asm的! |
|
|
|
|
|
|
|
发表于 16-12-2008 08:21 PM
|
显示全部楼层
原帖由 SolBadguy2 于 16-12-2008 06:15 PM 发表
哦!RB0 RB6 都是和RB7一样!用
哈哈。。其实是懒惰话而已:P 。。。 用paint超难画的说 :P
请问下,如果用simulation (ISIS) test program能用,在practical时,program也会work吗? 还是会有小差别?
还 ...
请问下,如果用simulation (ISIS) test program能用,在practical时,program也会work吗? 还是会有小差别?
->目前位置我用到都可以。 不过有一些东西是没有model(如OSC pin)的。。 读description.有些写他的limitation在那里。
第二个问题。如果是我, 我会用 c ,如果没办法,一定要asm,我用c 然后generate asm,在从那边做更改。 我很懒的。。。。。 |
|
|
|
|
|
|
|
楼主 |
发表于 16-12-2008 11:24 PM
|
显示全部楼层
fritlizt simulate复杂的在现实也能用,那我简单的LED blinking也应该也行吧!哈哈!
第二问题:
原来如此!这样也可以哦!我竟然没想到! |
|
|
|
|
|
|
|
发表于 17-12-2008 12:43 AM
|
显示全部楼层
原帖由 SolBadguy2 于 16-12-2008 11:24 PM 发表
fritlizt simulate复杂的在现实也能用,那我简单的LED blinking也应该也行吧!哈哈!
第二问题:
原来如此!这样也可以哦!我竟然没想到!
我也没有simulate很复杂的冬冬。。。。。。 |
|
|
|
|
|
|
|
发表于 6-1-2009 01:03 PM
|
显示全部楼层
请问一下
1)10ms是不是 10mili second ???
2)delay 是不是pause 呢???
####如是,用16F877A 试pause 1000 ( 1second) or 500 ( 1/2second)
####10ms太快了。。LED 开关快到肉眼看不见哦。。建议用Oscilloscope
####可能有noise interrupt /
3)你的circuit 是construct 在breadboard 还是 pcb ??
用breadboard很容易受到干扰(noise or others) 。
希望帮到你
|
|
|
|
|
|
|
| |
本周最热论坛帖子
|