PIC16F84A汇编代码容易出现问题

时间:2018-04-04 12:29:47

标签: assembly overflow pic cpu-registers

我用pic16F84A编写了一个小编程器。它是一个时钟,它使用1cs延迟程序在端口b上显示秒计数器。

    include P16F84A.INC
    list p=16F84A
org 0x00        ;Vector de reset
N   equ 0x0C
    goto Inicio     ;Salto incondicional al principio del programa
    org 0x05        ;Vector de interrupción

Retcs   bsf STATUS,RP0 ;Selección de la página 1
    movlw b'00000111' ;Inicialización del registro OPTION con un divisor de frecuencia
    movwf OPTION_REG ;de 256
    bcf INTCON,T0IF ;Borrado del bit de fin de cuenta
    bcf STATUS,RP0 ;Selección de la página 0
    movlw 0x27 ;Complemento a 2 del número de ciclos
    sublw 0x00 ;0x00-0x27
    movwf TMR0 ;Inicialización del registro TMR0 con la resta anterior          
Bucle   btfss INTCON,T0IF ;Comprobación del final de la cuenta
    goto Bucle ;Si no es el final, se sigue esperando
    return

RetNcs  movwf N
Bucle3  call Retcs
    DECFSZ N,1; Decrementa N en una unidad, si es 0 salta
    goto Bucle3
    return

Inicio  bsf STATUS,RP0      ;Se pone a 1 el bit 5 RP0 de STATUS (03h) y se pasa a la página 1   
    movlw b'00000000'   ;Se carga 0 en w
    movwf TRISB     ;Se configura TRISB (06h) como salidas.
    clrf PORTB      ;Se limpia el puerto
    movlw d'100'

Bucle2  call RetNcs     ;Retardo de 1 segundo
    incf PORTB      ;Se incrementa en 1 unidad el contenido de PortB
    goto Bucle2
    end

问题是在“Bucle3”循环后调用Retcs由于N返回100值,为什么? 我需要保留这种例程格式。

提前致谢!!!! 抱歉我的英语!

1 个答案:

答案 0 :(得分:0)

问题在于银行业务。请记住,在PIC上,您的地址范围有限。有两个问题: 1)在Inicio中,您立即设置为bank 1以写入端口b方向寄存器,然后使用文字100d加载W. Bucle2的第一行调用RetNcs,它将W寄存器存储到N,但状态寄存器仍然指向存储区1而不是0.然后在Retcs中,设置为存储区1(已存在)但在返回之前复位到存储区0。要解决此问题,请在清除portb之前重置为bank 0。 2)你还没有看到的另一个问题是在Bucle2中。一旦你循环N次(100)你将最终返回到Bucle2,增加端口B并循环.....但你忘了用100d重新加载W.如果您必须保留此结构,请添加" movlw d' 100'"就在incf PortB之后。