佳礼资讯网

 找回密码
 注册

ADVERTISEMENT

查看: 1500|回复: 12

[16F877A] RB0/Int Interrupt 的问题 - 有新问题在#9

[复制链接]
发表于 2-12-2008 10:59 PM | 显示全部楼层
我在想,会不会是我的circuit错了@@”

请帮忙查查:
http://img.photobucket.com/albums/v493/Cyclone1/untitled-3.jpg

[ 本帖最后由 SolBadguy2 于 2-12-2008 11:00 PM 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

发表于 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 编辑 ]
回复

使用道具 举报

 楼主| 发表于 2-12-2008 09:51 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# waiweng83 的帖子

没用call会导致不能interrupt @@?
回复

使用道具 举报

Follow Us
发表于 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 编辑 ]
回复

使用道具 举报


ADVERTISEMENT

 楼主| 发表于 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) 。
希望帮到你  
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

 

ADVERTISEMENT



ADVERTISEMENT



ADVERTISEMENT

ADVERTISEMENT


版权所有 © 1996-2023 Cari Internet Sdn Bhd (483575-W)|IPSERVERONE 提供云主机|广告刊登|关于我们|私隐权|免控|投诉|联络|脸书|佳礼资讯网

GMT+8, 31-12-2024 07:30 AM , Processed in 0.180749 second(s), 22 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表