Serie Fibonacci.asm

Hola a todos colegas, les traigo este codigo de la serie Fibonacci:
;************************************* Fibonacci.asm ************************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Los términos de la secuencia de Fibonacci son: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
; En esta secuencia cada número es la suma de los dos términos que le preceden. Por ejemplo,
; el término que sigue al 55 será 34 + 55= 89.
;
; Obtener el último término de la secuencia de Fibonacci menor de 256 y sacar ese valor
; por el puerto de salida.
;
; ZONA DE DATOS **********************************************************************


__CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
LIST P=16F84A
INCLUDE <P16F84A.INC>


CBLOCK 0x0C
Penultimo ; Ocupa la posición 0x0C de RAM.
Ultimo ; Ocupa la posición 0x0D de RAM.
Suma ; Ocupa la posición 0x0E de RAM.
ENDC


; ZONA DE CÓDIGOS ********************************************************************

ORG 0 ; El programa comienza en la dirección 0.
Inicio
bsf STATUS,RP0 ; Acceso al Banco 1.
clrf TRISB ; Las líneas del Puerto B se configuran como salida.
bcf STATUS,RP0 ; Acceso al Banco 0.
Principal
clrf Penultimo ; Asigna 0 al penúltimo término de Fibonacci y
movlw .1 ; 1 al último. Son las "semillas".
SigueSumando
movwf Ultimo ; Asigna (W) al (Ultimo) término de Fibonacci.
addwf Penultimo,W ; Suma términos último y penúltimo.
movwf Suma ; (Suma)=(Penultimo)+(Ultimo).
btfsc STATUS,C ; ¿C=0?, ¿(W)<256?
goto Fin ; No, por tanto ha excedido del máximo y sale.
movf Ultimo,W ; Sí, por tanto el (Ultimo) pasa al (Penultimo).
movwf Penultimo
movf Suma,W ; Y la (Suma) al (Ultimo).
goto SigueSumando
Fin movfw Ultimo ; En (Ultimo) el término de Fibonacci buscado.
movwf PORTB ; Resultado se visualiza por el puerto de salida.
sleep


END

; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================


Como pueden observar es del Libro de Microcntrolares PIC 16F84. El problema es que cuando simulo en el programa MPLAB 8.92, los resultados mostrados en el watch, no salen como debería ser:
En vez de salir así: 00000001 sale así ---> 00000001
00000001 sale así ---> 00000010
00000010 sale así ---> 00000011
00000011 sale así ---> 00000100
00000101 sale así ---> 00000101
00001000 sale así ---> 00000110
00001101 sale así ---> 00000111
Etc ...
Me podrían ayudar por favor
 
M

Miembro eliminado 356005

A mi me funciona de perlas... por el puerto B sale el valor 0xE9 (233).

Lo estoy probando con el MPLAB X IDE y su depurador.
Código:
;************************************* Fibonacci.asm ************************************
;
; ===================================================================
; Del libro "MICROCONTROLADOR PIC16F84. DESARROLLO DE PROYECTOS"
; E. Palacios, F. Remiro y L. López.
; Editorial Ra-Ma. www.ra-ma.es
; ===================================================================
;
; Los términos de la secuencia de Fibonacci son: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, ...
; En esta secuencia cada número es la suma de los dos términos que le preceden. Por ejemplo,
; el término que sigue al 55 será 34 + 55= 89.
;
; Obtener el último término de la secuencia de Fibonacci menor de 256 y sacar ese valor
; por el puerto de salida.
;
; ZONA DE CONFIGURACIÓN **************************************************************

        LIST P=16F84A
        INCLUDE <p16f84a.inc>

        __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

; ZONA DE DATOS **********************************************************************

        CBLOCK 0x0C
                Penultimo       ; Ocupa la posición 0x0C de RAM
                Ultimo          ; Ocupa la posición 0x0D de RAM
                Suma            ; Ocupa la posición 0x0E de RAM
        ENDC

; ZONA DE CÓDIGOS ********************************************************************

        ORG 0                   ; El programa comienza en la dirección 0

Inicio:
        BANKSEL TRISB           ; Acceso al Banco 1
        clrf TRISB              ; Las líneas del Puerto B se configuran como salida

Principal:
        BANKSEL Penultimo       ; Acceso al Banco 0
        clrf Penultimo          ; Asigna 0 al penúltimo término de Fibonacci y
        movlw .1                ; 1 al último. Son las "semillas"

SigueSumando:
        movwf Ultimo            ; Asigna (W) al (Ultimo) término de Fibonacci
        addwf Penultimo,W       ; Suma términos último y penúltimo
        movwf Suma              ; (Suma) = (Penultimo) + (Ultimo)
        btfsc STATUS,C          ; ¿C=0?, ¿(W)<256?
        goto Fin                ; No, por tanto ha excedido del máximo y sale

        movf Ultimo,W           ; Sí, por tanto el (Ultimo) pasa al (Penultimo)
        movwf Penultimo
        movf Suma,W             ; Y la (Suma) al (Ultimo)
        goto SigueSumando

Fin:
        movfw Ultimo            ; En (Ultimo) el término de Fibonacci buscado
        movwf PORTB             ; Resultado se visualiza por el puerto de salida

        sleep

        END
 
Última edición por un moderador:
Arriba