打印

关于流水灯问题

[复制链接]
2361|13
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
huangke1993|  楼主 | 2013-5-11 23:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
下面是我写的流水灯程序,但是好像出问题了,只能闪一轮,然后就不能闪;了,望大神指点

stm8/
  #include "stm8s105c6.inc"
        #include "user_register.inc"
        #include "mapping.inc"

        segment 'rom'
main.l
        ; initialize SP
        ldw X,#stack_end
        ldw SP,X

        #ifdef RAM0       
        ; clear RAM0
ram0_start.b EQU $ram0_segment_start
ram0_end.b EQU $ram0_segment_end
        ldw X,#ram0_start
clear_ram0.l
        clr (X)
        incw X
        cpw X,#ram0_end       
        jrule clear_ram0
        #endif

        #ifdef RAM1
        ; clear RAM1
ram1_start.w EQU $ram1_segment_start
ram1_end.w EQU $ram1_segment_end       
        ldw X,#ram1_start
clear_ram1.l
        clr (X)
        incw X
        cpw X,#ram1_end       
        jrule clear_ram1
        #endif

        ; clear stack
stack_start.w EQU $stack_segment_start
stack_end.w EQU $stack_segment_end
        ldw X,#stack_start
clear_stack.l
        clr (X)
        incw X
        cpw X,#stack_end       
        jrule clear_stack
  ;初始化IO引脚
        MOV PB_DDR,#$FF
        MOV PB_CR1,#$00
        MOV PB_ODR,#$FF
        ;初始化时钟
        MOV R01,#$FE
        SCF
        MOV R10,#50
        MOV CLK_SWR,#$E1
        MOV CLK_CKDIVR,#$18
        BRES CLK_ICKR,#5
        MOV CLK_PCKENR1,#$FF
        ;初始化定时器
        MOV TIM1_SMCR,#$00
        BRES TIM1_ETR,#6
        MOV TIM1_PSCRH,#$00
        MOV TIM1_PSCRL,#$01
        MOV TIM1_ARRH,#$27
        MOV TIM1_ARRL,#$10
        MOV TIM1_CR1,#$04
        BSET TIM1_EGR,#0
        BSET TIM1_IER,#0
        BSET TIM1_CR1,#0
        ;初始化中断优先级
        BRES ITC_SPR3,#7
        BRES ITC_SPR3,#6
        RIM
loop.L
        jpf loop
        ;中断程序
        interrupt TIM1
TIM1.L
  BRES TIM1_SR1,#0
        DEC R10
        JRNE TIM1_EXIT
        MOV R10,#50
  MOV PB_ODR,R01
  RLC R01
TIM1_EXIT.L
  IRET
        IRET
        IRET
        IRET
        IRET
        interrupt NonHandledInterrupt
NonHandledInterrupt.l
        iret

        segment 'vectit'
        dc.l {$82000000+main}                                                                        ; reset
        dc.l {$82000000+NonHandledInterrupt}        ; trap
        dc.l {$82000000+NonHandledInterrupt}        ; irq0
        dc.l {$82000000+NonHandledInterrupt}        ; irq1
        dc.l {$82000000+NonHandledInterrupt}        ; irq2
        dc.l {$82000000+NonHandledInterrupt}        ; irq3
        dc.l {$82000000+NonHandledInterrupt}        ; irq4
        dc.l {$82000000+NonHandledInterrupt}        ; irq5
        dc.l {$82000000+NonHandledInterrupt}        ; irq6
        dc.l {$82000000+NonHandledInterrupt}        ; irq7
        dc.l {$82000000+NonHandledInterrupt}        ; irq8
        dc.l {$82000000+NonHandledInterrupt}        ; irq9
        dc.l {$82000000+NonHandledInterrupt}        ; irq10
        dc.l {$82000000+TIM1}        ; irq11
        dc.l {$82000000+NonHandledInterrupt}        ; irq12
        dc.l {$82000000+NonHandledInterrupt}        ; irq13
        dc.l {$82000000+NonHandledInterrupt}        ; irq14
        dc.l {$82000000+NonHandledInterrupt}        ; irq15
        dc.l {$82000000+NonHandledInterrupt}        ; irq16
        dc.l {$82000000+NonHandledInterrupt}        ; irq17
        dc.l {$82000000+NonHandledInterrupt}        ; irq18
        dc.l {$82000000+NonHandledInterrupt}        ; irq19
        dc.l {$82000000+NonHandledInterrupt}        ; irq20
        dc.l {$82000000+NonHandledInterrupt}        ; irq21
        dc.l {$82000000+NonHandledInterrupt}        ; irq22
        dc.l {$82000000+NonHandledInterrupt}        ; irq23
        dc.l {$82000000+NonHandledInterrupt}        ; irq24
        dc.l {$82000000+NonHandledInterrupt}        ; irq25
        dc.l {$82000000+NonHandledInterrupt}        ; irq26
        dc.l {$82000000+NonHandledInterrupt}        ; irq27
        dc.l {$82000000+NonHandledInterrupt}        ; irq28
        dc.l {$82000000+NonHandledInterrupt}        ; irq29

        end
沙发
grasswolfs| | 2013-5-11 23:48 | 只看该作者
看习惯了C看这个汇编真是痛苦啊,没仔细读清楚,不过猜测会不会是没有清楚中断标志位,或者定时器不能重新装载,所以不能循环了?

使用特权

评论回复
板凳
huangke1993|  楼主 | 2013-5-12 00:12 | 只看该作者
grasswolfs 发表于 2013-5-11 23:48
看习惯了C看这个汇编真是痛苦啊,没仔细读清楚,不过猜测会不会是没有清楚中断标志位,或者定时器不能重新 ...

你好,有清除中断标志,我的是八个灯,八个灯从左至右各亮一下,最后一个灯亮完就全部灭了,没反应了

使用特权

评论回复
地板
grasswolfs| | 2013-5-12 13:01 | 只看该作者
huangke1993 发表于 2013-5-12 00:12
你好,有清除中断标志,我的是八个灯,八个灯从左至右各亮一下,最后一个灯亮完就全部灭了,没反应了 ...

  MOV PB_ODR,R01
  RLC R01

这个指令能保证是循环移位么?

使用特权

评论回复
5
huangke1993|  楼主 | 2013-5-12 15:30 | 只看该作者
grasswolfs 发表于 2013-5-12 13:01
MOV PB_ODR,R01
  RLC R01

能的,他就是把最高位送进位标志,然后进位标志送A的第一位,以此类推,进行循环的

使用特权

评论回复
6
huangke1993|  楼主 | 2013-5-12 15:34 | 只看该作者
huangke1993 发表于 2013-5-12 15:30
能的,他就是把最高位送进位标志,然后进位标志送A的第一位,以此类推,进行循环的 ...

我用这个程序能正常流水,但我不明白为什么用TIM1的定时中断不行
stm8/
        #include "stm8s105c6.inc"
        #include "user_register.inc"
        #include "mapping.inc"

        segment 'rom'
main.l
        ; initialize SP
        ldw X,#stack_end
        ldw SP,X

        #ifdef RAM0       
        ; clear RAM0
ram0_start.b EQU $ram0_segment_start
ram0_end.b EQU $ram0_segment_end
        ldw X,#ram0_start
clear_ram0.l
        clr (X)
        incw X
        cpw X,#ram0_end       
        jrule clear_ram0
        #endif

        #ifdef RAM1
        ; clear RAM1
ram1_start.w EQU $ram1_segment_start
ram1_end.w EQU $ram1_segment_end       
        ldw X,#ram1_start
clear_ram1.l
        clr (X)
        incw X
        cpw X,#ram1_end       
        jrule clear_ram1
        #endif

        ; clear stack
stack_start.w EQU $stack_segment_start
stack_end.w EQU $stack_segment_end
        ldw X,#stack_start
clear_stack.l
        clr (X)
        incw X
        cpw X,#stack_end       
        jrule clear_stack
        MOV PB_DDR,#$FF
        MOV PB_CR1,#$00
        MOV PB_ODR,#$FF
  LD A,#$FE
        SCF
infinite_loop.l
L1
  LDW X,#$FFFF
  CALL L2
        LD PB_ODR,A
        RLC A
        jra infinite_loop
L2
  DECW X
        JRNE L2
        RET
        interrupt NonHandledInterrupt
NonHandledInterrupt.l
        iret

        segment 'vectit'
        dc.l {$82000000+main}                                                                        ; reset
        dc.l {$82000000+NonHandledInterrupt}        ; trap
        dc.l {$82000000+NonHandledInterrupt}        ; irq0
        dc.l {$82000000+NonHandledInterrupt}        ; irq1
        dc.l {$82000000+NonHandledInterrupt}        ; irq2
        dc.l {$82000000+NonHandledInterrupt}        ; irq3
        dc.l {$82000000+NonHandledInterrupt}        ; irq4
        dc.l {$82000000+NonHandledInterrupt}        ; irq5
        dc.l {$82000000+NonHandledInterrupt}        ; irq6
        dc.l {$82000000+NonHandledInterrupt}        ; irq7
        dc.l {$82000000+NonHandledInterrupt}        ; irq8
        dc.l {$82000000+NonHandledInterrupt}        ; irq9
        dc.l {$82000000+NonHandledInterrupt}        ; irq10
        dc.l {$82000000+NonHandledInterrupt}        ; irq11
        dc.l {$82000000+NonHandledInterrupt}        ; irq12
        dc.l {$82000000+NonHandledInterrupt}        ; irq13
        dc.l {$82000000+NonHandledInterrupt}        ; irq14
        dc.l {$82000000+NonHandledInterrupt}        ; irq15
        dc.l {$82000000+NonHandledInterrupt}        ; irq16
        dc.l {$82000000+NonHandledInterrupt}        ; irq17
        dc.l {$82000000+NonHandledInterrupt}        ; irq18
        dc.l {$82000000+NonHandledInterrupt}        ; irq19
        dc.l {$82000000+NonHandledInterrupt}        ; irq20
        dc.l {$82000000+NonHandledInterrupt}        ; irq21
        dc.l {$82000000+NonHandledInterrupt}        ; irq22
        dc.l {$82000000+NonHandledInterrupt}        ; irq23
        dc.l {$82000000+NonHandledInterrupt}        ; irq24
        dc.l {$82000000+NonHandledInterrupt}        ; irq25
        dc.l {$82000000+NonHandledInterrupt}        ; irq26
        dc.l {$82000000+NonHandledInterrupt}        ; irq27
        dc.l {$82000000+NonHandledInterrupt}        ; irq28
        dc.l {$82000000+NonHandledInterrupt}        ; irq29

        end

使用特权

评论回复
7
grasswolfs| | 2013-5-12 17:12 | 只看该作者
huangke1993 发表于 2013-5-12 15:34
我用这个程序能正常流水,但我不明白为什么用TIM1的定时中断不行
stm8/
        #include "stm8s105c6.inc"

这个就是延时流水了,那感觉还是中断和定时器的问题,很奇怪竟然可以执行一次流水

使用特权

评论回复
8
hawksabre| | 2013-5-12 17:55 | 只看该作者
个人觉得是循环出了问题   个人的意见   汇编用的很少   兄弟

使用特权

评论回复
9
hawksabre| | 2013-5-12 17:55 | 只看该作者
没能帮上你的忙  对不住啊

使用特权

评论回复
10
huangke1993|  楼主 | 2013-5-12 22:53 | 只看该作者
hawksabre 发表于 2013-5-12 17:55
个人觉得是循环出了问题   个人的意见   汇编用的很少   兄弟

没办法啦,学校书用的是汇编啊,不过我觉得汇编比较简洁

使用特权

评论回复
11
huangke1993|  楼主 | 2013-5-12 22:53 | 只看该作者
hawksabre 发表于 2013-5-12 17:55
没能帮上你的忙  对不住啊

没事啦,谢谢你啊

使用特权

评论回复
12
huangke1993|  楼主 | 2013-5-13 18:57 | 只看该作者
hawksabre 发表于 2013-5-12 17:55
没能帮上你的忙  对不住啊

今天突然想到为什么不可以了,问题解决了。谢谢你的帮忙啊

使用特权

评论回复
13
cjhk| | 2013-5-13 19:47 | 只看该作者
问题解决了  就好  呵呵   多动脑筋   多琢磨  应该问题不大   顶一个

使用特权

评论回复
14
huangke1993|  楼主 | 2013-5-15 13:01 | 只看该作者
cjhk 发表于 2013-5-13 19:47
问题解决了  就好  呵呵   多动脑筋   多琢磨  应该问题不大   顶一个

好的。谢谢。:lol

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

25

主题

67

帖子

0

粉丝