Ejemplo de Programación Pic16f877a

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 12

DEPARTAMENTO DE ELECTRICA Y ELECTRONICA

ÁREA DE SISTEMAS DIGITALES

ASIGNATURA: MICROCONTROLADORES NRC:

Informe Laboratorio No. 1.2

Tema: Manejo de puertos (Secuencia de Fibonacci)

Docente: Ing. Carlos Ponce

Equipo #: 8
Integrantes: Raham Castillo, Saúl Obando

Base Aspectos de evaluación Calificación


0.25 Fundamento teórico
Valor de los registros de
0.50
configuración
0.25 Diagrama de bloques
3 Informe
0.75 Diagrama de flujo
0.25 Tabla de asignación de variables
0.75 Programa
0.25 Conclusiones
2 Simulación
3 Funcionamiento
2 Defensa

10 Total

Sangolquí – 3 de diciembre de 2018

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

3.1. La sucesión de Fibonacci

La secuencia de Fibonacci es la sucesión infinita de números, en la cual se calcula sumando los


dos números anteriores. Para que se cumpla la sucesión se parte de la suma de los dos primeros
números los cuales son el 1 y 1. (Viana Martínez, 2018).

Es decir, para formar la sucesión se debería de hacer el siguiente proceso:

 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:

 𝒙𝒏 :es el término en posición "n"


 𝒙𝒏−𝟏 :es el término anterior (n-1)
 𝒙𝒏−𝟐 :es el anterior a ese (n-2)

Sucesión de Fibonacci

1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1.597…

(Viggiani Rocha, 2018)


4. Valor de los registros de configuración

VARIABLE ESTADO DESCRIPCIÓN


OSC XT Oscilador XT para media frecuencia
WDT OFF Desactiva el temporizador del perro guardián
PWRTE ON Habilita el temporizador de encendido
BODEN OFF Deshabilita el restablecimiento de salida
LVP OFF Pin RB3 es digital I/O
CPD OFF Deshabilita la protección de datos de la memoria EEPROM
WRT OFF Deshabilita la escritura en memoria de programa
DEBUG OFF Deshabilita el modo In Circuit Debugger
CP OFF Deshabilita el código de protección

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

Principal Configurar Retardo

(a) (b) (c)

Figura2.a.-Diagrama de flujo principal


Figura2.b.-Diagrama de flujo subrutina Configurar
Figura2.c.-Diagrama de flujo subrutina Retardo
Inicializar Variables Secuencia Retorno

(e)

(c)

(f) (d)

Figura2.c.-Diagrama de flujo subrutina Inicializar variables


Figura2.d.-Diagrama de flujo subrutina Secuencia
Figura.2e.-Diagrama de flujo subrutina Retorno
Figura.2f.-Diagrama de flujo Finalizar
7. Tabla de asignación de variables

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

VARIABLE VALOR DIRECCIÓN


AUX 0xE9 (11101001B) 20H
ANTERIOR 0x90 (11101001B) 21H
ACTUAL ---------------------- 22H
PRESENTE ---------------------- 23H
CONT1 0xFA (11111010B) 24H
CONT2 0x50 (01010000B) 25H
DATO 0x01 (00000001B) 26H
PORTA 0x01 05H
PORTB 0x00 06H

Tabla3.-Inicialización y dirección de variables

8. Programa

PROCESSOR 16F877A ;SE REALIZA LA LLAMADA DEL uC QUE SE VA A UTILIZAR


RADIX DEC ;SE INDICA QUE SE VA A TRABAJAR EN FORMA DESCENDENTE
INCLUDE "P16F877A.INC" ;SE LLAMA A LA LIBRERÍA DEL uC QUE SE VA A UTILIZAR
__CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF
& _DEBUG_OFF & _CP_OFF

; Oscilador XT para media frecuencia, OSC: XT


; Desactiva el temporizador del perro guardián, WDT: OFF
; Habilita el temporizador de encendido, PWRTE: ON
; Deshabilita el restablecimiento de salida, BODEN: OFF
; Pin RB3 es digital I/O, LVP: OFF
; Deshabilita la protección de datos de la memoria EEPROM, CPD: OFF
; Deshabilita la escritura en memoria de programa, WRT: OFF
; Deshabilita el modo In Circuit Debugger: DEBUG: OFF
; Deshabilita el código de protección, CP: OFF

; 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

RETORNO ; EN EL LABEL "RETORNO" SE REALIZA EL PULSO PARA LA SIGUIENTE


SECUENCIA
BTFSC PORTA, 0 ; SE PREGUNTA SI EL PUERTO RA0 ESTA EN "0" SALTA A SECUENCIA
GOTO RETORNO ; SI NO ESTÁ EN "0" REGRESA AL LABEL "RETORNO"
CALL SECUENCIA ; HACE EL LLAMADO A LA FUNCIÓN SECUENCIA AL REALIZAR EL PULSO

SECUENCIA ; INICIA UNA SECUENCIA DE LA SUCESIÓN DE FIBONACCI HASTA UN NUEVO


PULSO
MOVF ACTUAL, 0 ; SE MUEVE EL CONTENIDO DE ACTUAL AL REGISTRO DE TRABAJO W
SUBWF ANTERIOR, 0 ; SE REALIZA LA RESTA DE ACTUAL - ANTERIOR
XORWF DATO, 1 ; SE REALIZA LA OPERACIÓN XOR DE LA RESTA OBTENIDA CON EL
DATO Y LO GUARDA EN EL REGISTRO F
BTFSC STATUS, Z ; SI EL RESULTADO LA OPERACIÓN ES 0 SALTA A PRESENTE
GOTO FINALIZAR ; SI EL RESULTADO ES 1 SALTA A FINALIZAR
MOVWF PRESENTE ; EL RESULTADO ES ALAMCENADO EN EL REGISTRO PRESENTE
MOVWF PORTB ; EL RESULTADO ES MOSTRADO EN EL PUERTO B
CALL RETARDO ; SE LLAMA A LA FUNCIÓN RETARDO

; SE REALIZA UN INTERCAMBIO DE CONTENIDO DE LOS REGISTROS


; EL CONTENIDO DE ACTUAL PASA A AL CONTENIDO DE ANTERIOR
; EL CONTENIDO DE PRESENTE PASA AL CONTENIDO DE ACTUAL

MOVF ACTUAL, 0 ; SE MUEVE EL CONTENIDO DE ACTUAL AL REGISTRO DE TRABAJO 'W'


MOVWF ANTERIOR ; SE GUARDA EL CONTENIDO DE 'W' EN EL REGISTRO ANTERIOR
MOVF PRESENTE, 0 ; SE MUEVE EL CONTENIDO DE PRESENTE AL REGISTRO DE TRABAJO
'W'
MOVWF ACTUAL ; SE GUARDA EL CONTENIDO DE 'W' EN EL REGISTRO ACTUAL
GOTO RETORNO

; SE REALIZA UN RETARDO DE TIEMPO AL REALIZAR EL PULSO EN 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

; PERMITE TERMINAR LA EJECUCIÓN DEL PROGRAMA


FINALIZAR
NOP ; SALTA UNA OPERACIÓN Y TERMINA LA EJECUCIÓN DEL PROGRAMA
GOTO FINALIZAR

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.

NÚMERO EN NUMERO EN BINARIO


DECIMAL
89 01011001
Figura3.-Ejecución del primer escenario
Segundo Escenario

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.

NÚMERO EN NUMERO EN BINARIO


DECIMAL
55 00110111
Figura4.-Ejecución del segundo escenario

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.

NÚMERO EN NUMERO EN BINARIO


DECIMAL
3 00000011
Figura5.-Ejecución del tercer escenario

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

Viggiani Rocha, M. I. (2 de 12 de 2018). Universidad Ncional de Tucumán. Obtenido de


Universidad Ncional de Tucumán:
http://www.famaf.unc.edu.ar/~revm/FibonacciFinal2.pdf

También podría gustarte