Ejemplo de Programación Pic16f877a
Ejemplo de Programación Pic16f877a
Ejemplo de Programación Pic16f877a
Equipo #: 8
Integrantes: Raham Castillo, Saúl Obando
10 Total
FECHA - CIUDAD
1. Tema: Manejo de puertos (Secuencia de Fibonacci)
2. Objetivos
Diseñar un circuito a través de la programación del PIC 16F877A , que permita generar la
sucesión de Fibonacci expresado en forma binaria, para lo cual cada sucesión se lo realice a
través de un pulso comenzando en el número 89 en orden descendente al número 3 de la
sucesión.
Establecer la configuración para cada uno de los puertos como entradas y salidas digitales,
considerando la habilitación de los registro a utilizar.
3. Fundamento Teórico
1+1=2
1+2=3
2+3=5
3+5=8
Por lo que para un n-esimo termino que se desee calcular se tendría lo siguiente.
𝒙𝒏 = 𝒙𝒏−𝟏 + 𝒙𝒏−𝟐
Donde:
Sucesión de Fibonacci
1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1.597…
Tabla1.-Configuración de registros
5. Diagrama de bloques
PORTA PORTB
b0,...b7
Pulso para la uC Representación en
siguiente 8 8 bits en forma
sucesión en Microcontrolador binaria de la serie
forma de Fibonacci del [1-
descendente 100] a través de
LEDS
Figura1.-Diagrama de bloques
6. Diagrama de flujo
(e)
(c)
(f) (d)
VARIABLE DESCRIPCIÓN
AUX Variable de inicialización para el primer valor de 233.
ANTERIOR Variable que corresponde al sustraendo inicializada con 144.
ACTUAL Variable que almacena la resta entre AUX-ANTERIOR y guarda el dato
actualizado.
PRESENTE Variable que muestra el resultado como salida del puerto B.
CONT1 Variable que corresponde al primer decremento para dar un retardo.
CONT2 Variable que corresponde al segundo decremento después que se realice el primer
decremento.
DATO Variable que compara la sucesión hasta que llegue al número 3.
PORTA Puerto de entrada, pulso para la siguiente sucesión
PORTB Puerto de salida, secuencia representada en leds
Tabla2.-Asignación de variables
8. Programa
; DECLARACION DE VARIABLES
AUX EQU 20H ; VARIABLE DE INICIALIZACIÓN PARA EL PRIMER VALOR DE 233
ANTERIOR EQU 21H ; VARIABLE QUE CORRESPONDE AL SUSTRAENDO INICIALIZADA CON
144
ACTUAL EQU 22H ; VARIABLE QUE ALMACENA LA RESTA ENTRE AUX-ANTERIOR Y GUARDA
EL DATO ACTUALIZADO
PRESENTE EQU 23H ; VARIABLE QUE MUESTRA EL RESULTADO COMO SALIDA EN EL PUERTO
B
CONT1 EQU 24H ; VARIABLE QUE CORRESPONDE AL PRIMER DECREMENTO PARA DAR UN
RETARDO AL REALIZAR EL PULSO
CONT2 EQU 25H ; VARIABLE QUE CORRESPONDE AL SEGUNDO DECREMENTO DESPUES QUE
SE REALICE EL PRIMER DECREMENTO
DATO EQU 26H ; VARIABLE DE COMPARACIÓN QUE COMPARA QUE LA SUCECIÓN LLEGUE
HASTA EL NÚMERO 3
ORG 00H
; CONFIGURAR
BCF STATUS, RP1 ; SE LIMPIA EL RESITRO ESTATUS
BSF STATUS, RP0 ; ACCEDEMOS AL BANCO 1
MOVLW 06H ; CONFIGURACIÓN LOS PUERTOS COMO DIGITALES
MOVWF ADCON1
MOVLW 00H ; CONFIGURACIÓN DEL PUERTO B COMO SALIDA
MOVWF TRISB
BCF OPTION_REG, NOT_RBPU ; CONFIGURAMOS AL PUERTO RB0 COMO SALIDA
BCF STATUS, RP0 ; SE ACCEDE AL BANCO 1 DE REGITROS
; INICIALIZACION
MOVLW 00000001B ; ASIGNA EL VALOR DE 1 A LA VARIABLE DATO PARA COMPARAR (NO
SE CARGA 3 DEBIDO A QUE REQUIERE DE UNA EJECUCIÓN ADICIONAL)
MOVWF DATO
MOVLW 11101001B ; SE ASIGNA EL 233 EN NUESTRA VARIABLE AUX
MOVWF AUX
MOVLW 10010000B ; SE ASIGNA EL 144 EN NUESTRA VARIABLE ANTERIOR
MOVWF ANTERIOR
SUBWF AUX, 0 ;REALIZA LA RESTA DE ANTERIOR-AUX
MOVWF ACTUAL ; ESTE RESULTADO LO GUARDAMOS EN NUESTRA VARIABLE ACTUAL
MOVWF PORTB ; LO REPRESNTAMOS EN NUESTRO PUERTO B
CALL RETARDO ; HACE EL LLAMADO A LA FUNCIÓN RETARDO
RETARDO
MOVLW D'80' ; SE ASIGNA EL VALOR DE 80 AL REGISTRO DE TRABAJO 'W'
MOVWF CONT2 ; ESTE VALOR SE LO ASIGANA AL REGISTRO CONT2
DOS
MOVLW D'250' ; SE ASIGNA EL VALOR DE 250 AL REGISTRO DE TRABAJO 'W'
MOVWF CONT1 ; ESTE VALOR SE LO ASGINA A REGISTRO CONT1
UNO
NOP ; SALTA 2 OPERACIONES QUE CORRESPONDEN A UN CICLO DE MÁQUINA
NOP
DECFSZ CONT1, 1 ; DECREMENTA EN UNA UNIDAD AL REGISTRO CONT1
GOTO UNO ; SI NO ES DIFERENTE DE CERO EL NUMERO DECREMENTADO REGRESA
A UNO
DECFSZ CONT2, 1 ; UNA VEZ DECREMENTADO EL VALOR DEL CONT1 REALIZA EL
DECREMENTO DEL REGISTRO CONT 2
GOTO DOS ; SI NO ES DIFERENTE DE CERO EL NUMERO DECREMENTADO REGRESA
A DOS
RETURN ; RETORNA AL LLAMADO REALIZADO
END
9. Simulación
Primer Escenario
Se parte del número 89 para ello se realizó la resta entre los dos números anteriores 233 y 144 los
cuales fueron declarados para la primera ejecución , dicho número se expresa en forma binaria
representado a través de leds como se observa en la Figura1.
Se produce la segunda sucesión es decir la resta entre 144 y 89, en la cual se obtiene 55, dicho número
se expresa en forma binaria representado a través de leds como se observa en la Figura2.
Tercer Escenario
Se produce la última sucesión es decir la resta entre 8 y 5, en la cual se obtiene 3, no se produce otra
sucesión ya que se delimito que este sea el número en el que termine la secuencia de Fibonacci, dicho
número se expresa en forma binaria representado a través de leds como se observa en la Figura3.
10. Conclusiones
Para emplear al puerto B como entrada y salida digital se debe configurar al PIC
específicamente el pin RB3 y deshabilitar ”0” el LVP de la programación a bajo voltaje,
además es necesario para esta aplicación configurar el Registro OPTION_REG ya que es
necesario habilitar la opción RBPU “0” de las resistencias pull-up internas y evitar
resistencias externas.
Al realizar un pulso hacia la siguiente sucesión, es necesario de que se acompañe de un retardo
con el suficiente tiempo para presionar el botón, ya que sin el retardo el programa ejecutara
todas las instrucciones, en la cual solo se observara la primera y última ejecución.
Es necesario configurar el registro ADCON1 y asignar el valor de 06H para poder utilizar al
puerto A como entradas y salidas digitales.
11. Referencias
Viana Martínez, V. (2 de 12 de 2018). La sorprendente serie de Fibonacci. Obtenido de La
sorprendente serie de Fibonacci:
http://vviana.es/doc/LaSorprendente%20SucesionDeFibonacci.pdf