简易PIC16F84A汇编代码的问题
Problems with easy PIC16F84A assembly code
我用 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
由于 N return 的值变为 100,问题出在调用 Retcs 后的 "Bucle3" 循环中,为什么?
我需要保留这个例程格式。
提前致谢!!!!
对不起我的英语!
问题是银行业务。请记住,在 PIC 上,您的地址范围有限。有两个问题:
1) 在 Inicio 中,您立即设置为 bank 1 以写入端口 b 方向寄存器,然后用文字 100d 加载 W。 Bucle2 的第一行调用 RetNcs,它将 W 寄存器存储到 N,但是状态寄存器仍然指向 bank 1 而不是 0。然后在 Retcs 中,您设置为 bank 1(已经存在)但在您之前重置为 bank 0 return。要解决此问题,只需在清除 portb 之前重置为 bank 0。
2) 您还没有看到的另一个问题是在 Bucle2 中。一旦你循环 N 次(100),你最终将 return 到 Bucle2,incremetn 端口 B 和循环.....但是你忘记用 100d 重新加载 W。如果必须保留此结构,请在 incf PortB 之后添加 "movlw d'100'"。
我用 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
由于 N return 的值变为 100,问题出在调用 Retcs 后的 "Bucle3" 循环中,为什么? 我需要保留这个例程格式。
提前致谢!!!! 对不起我的英语!
问题是银行业务。请记住,在 PIC 上,您的地址范围有限。有两个问题: 1) 在 Inicio 中,您立即设置为 bank 1 以写入端口 b 方向寄存器,然后用文字 100d 加载 W。 Bucle2 的第一行调用 RetNcs,它将 W 寄存器存储到 N,但是状态寄存器仍然指向 bank 1 而不是 0。然后在 Retcs 中,您设置为 bank 1(已经存在)但在您之前重置为 bank 0 return。要解决此问题,只需在清除 portb 之前重置为 bank 0。 2) 您还没有看到的另一个问题是在 Bucle2 中。一旦你循环 N 次(100),你最终将 return 到 Bucle2,incremetn 端口 B 和循环.....但是你忘记用 100d 重新加载 W。如果必须保留此结构,请在 incf PortB 之后添加 "movlw d'100'"。