Practica 4. Contador decimal usando el PIC16F877A y dos display de 7 segmentos PDF

Title Practica 4. Contador decimal usando el PIC16F877A y dos display de 7 segmentos
Course Microcontroladores
Institution Instituto Tecnológico de Tijuana
Pages 24
File Size 1.8 MB
File Type PDF
Total Downloads 87
Total Views 154

Summary

Tecnológico Nacional de MéxicoInstituto Tecnológico de TijuanaIngeniería BiomédicaMicrocontroladoresPractica 4. Contador decimal descendente usando PIC 16F877A y dosdisplays de 7 segmentosCalvillo Lopez Alejandro - 16212214 Sanchez Saavedra Eduardo Francisco - 16212267ABRIL 2019ObjetivoRelizar un pr...


Description

Tecnológico Nacional de México Instituto Tecnológico de Tijuana

Ingeniería Biomédica

Microcontroladores

Practica 4. Contador decimal descendente usando PIC 16F877A y dos displays de 7 segmentos

Calvillo Lopez Alejandro - 16212214 Sanchez Saavedra Eduardo Francisco - 16212267

ABRIL 2019

Objetivo Relizar un programa en lenguaje ensamblador para el microcontrolador 16F877A que realice una secuencia de led de izquierda a derecha (encender bit más significativo hasta el bit menos significativo apagando el anterior, repetir indefinidamente).

Marco Teórico Introducción al PIC 16F877A El PIC 16F877A es un microncontrolador que consta cuarenta pines con un encapsulado PDIP (Plastic Dual-In-Line Package), empleado usualmente para aplicaciones vinculadas con proyectos embebidos. Dentro de sus parámetros indicados en la hoja de datos técnicos correspondiente se encuentra:      

          

Manejo de solo 35 instrucciones de una sola palabra Velocidad de operación de 4MHz a 40MHz Hasta 8k x 14 palabras de memoria Flash Hasta 368 x 8-bytes de memoria RAM Hasta 256 x 8-bytes de memoria EEPROM Consta de tres timers: o Timer 0: timer/counter de 8-bits con preescalador o Timer 1: timer/counter de 16-bits con preescalador, el cual puede ser incrementado durante el modo Sleep por medio de un cristal o una señal de clock externa o Timer 2: timer/counter de 8-bits con un periodo de registro de 8-bits, preescalador y postescalador Consta de tres puertos (PORTA, PORTB, PORTC, PORTD, PORTE) Modulador de Amplitud de Pulso con resolución de 200ns Puerto síncrono serial (SSP) con modo maestro y maestro-esclavo USART con detector de direcciones de 9-bits Puerto esclavo paralelo (PSP) de 8-bits Hasta 10 canales de 8-bits de ADC Retención de datos en la EEPROM de hasta 40 años Autoreprogramable Ofrece protección del código Memoria de Programa de 14.3k bytes y 8192 instrucciones 33 pines de entradas/salidas.

Para las conexiones del PIC 16F877A, es necesario:   

Pin 1 (MCLR) a 5V por medio de una resistencia, generalmente de 10kΩ Pin 11 y 32, bajo la etiqueta Vdd, alimentándose a +5V Pin 12 y 31, bajo la etiqueta Vss, a GND



`Pin 13 y 14, siendo estos los pines correspondientes al oscilador 1 y 2, conectados al oscilador de cristal y capacitores a GND

Figura 1. Diagrama de pines del PIC 16F877A

La memoria del programa y la memoria de datos poseen buses separados para accesar a la información simultáneamente. La memoria de datos se encuentra dividida en cuatro bancos de datos, los cuales se integran de registros de uso general y registros de funciones especiales. Los bits RP1 (STATUS bit 6) y RP0 (STATUS bit 5) permiten seleccionar el banco de datos sobre el cual se realizara una operación. RP1:RP0 Bancos 00 0 01 1 10 2 11 3 Cada banco de datos está conformado por 128 bytes. Las locaciones de memoria para cada banco se encuentran reservadas para los registros de funciones especiales, implementadas en la memoria estática RAM. Si bien todos los bancos poseen registros de funciones especiales, algunos frecuentemente usan los registros de funciones especiales de otros bancos con la finalidad de reducir y, por tanto, simplificar la codificación, conllevando a un incremento de velocidad para accesar a los datos.

Figura 2. Bancos de registros del PIC 16F877A

Uso de puertos Un puerto (Port) es un circuito que forma parte del microcontrolador y sirve de interfaz con algún dispositivo externo o periférico, como son los switches, LEDs, reles, teclados matriciales, displays, ADC, DAC, motores, entre otros. Desde el punto de vista de su programación, los puertos se identifican por sus direcciones, ubicadas por lo general en la memoria de datos. Para hacer referencia a los datos que entran o salen por un puerto, se necesita al menos una dirección. El manejo de las señales de control puede requerir algunos bits adicionales, repartidos en una o dos direcciones más. En los microcontroladores PIC, el acceso a los puertos se realiza a través de los registros de funciones especiales de la memoria de datos. Para manipular los puertos paralelos, hay dos registros de funciones especiales por cada uno de los puertos, que se denominan PORT y TRIS. Los registros PORT almacenan el dato de salida del puerto mientras que los registros TRIS sirven para programar cada línea del puerto correspondiente como entrada o salida. El PIC 16F877A consta de cinco puertos:     

PORT A. Consta del pin 2 al 7, etiquetados como RA0 a RA5, donde RA0 es el bit LSB y RA5 es el MSB PORT B. Consta del pin 33 al 40, etiquetados como RB0 a RB7, donde RB0 es el bit LSB y RB7 es el MSB PORT C. Consta del pin 15 al 18 y del 23 al 26 PORT D. Consta del pin 19 al 22 y del 27 al 30 PORT E. Consta del pin 8 al 10, etiquetados como RE0 a RE2, donde RE0 es el bit LSB y RE2 es el MSB

Figura 3. Visualización de los puertos del PIC 16F877A

Algunos pines de entradas-salidas se encuentran multiplexados con funciones alternativas correspondientes a funciones periféricas del dispositivo. Por tanto, si la función periférica se encuentra habilitada, entonces el pin no actuara como un pin general de entradas-salidas. Al conectar dispositivos a los terminales de los puertos, hay que tener en cuenta las limitaciones de potencia eléctrica del microcontrolador. Cada pin de entrada-salida puede suministrar o drenar una corriente máxima, generalmente no mayor a 25mA. Como el PORT A es un puerto bidireccional de 6-bits, el registro de direcciones de datos correspondiente es el TRISA, el cual, estando en un nivel alto (TRISA=1) generara que el PORT A sea de entrada debido a que el output driver correspondiente estará en modo de alta impedancia, mientras que si se encuentra en un nivel bajo (TRISA=0), el pin correspondiente del PORT A actuara como una salida debido al latch del pin seleccionado.

Figura 4. Diagrama de Bloques del PORT A. Pin RA3:RA0 izquierda, pin RA4 derecha

Figura 5. Diagrama de Bloques del PORT A. pin RA5

Siendo PORT B un puerto bidireccional de 8-bits, el registro de direcciones de datos correspondiente es el TRISB, el cual, estando en un nivel alto (TRISB=1) generara que el PORT B sea de entrada debido a que el output driver correspondiente estará en modo de alta impedancia, mientras que si se limpia TRISB (TRISB=0), el pin correspondiente del PORT B actuara como una salida debido al latch del pin seleccionado. Cada uno de los pines del PORT B constan de un débil pull-up interno, en donde un único bit (RBPU u OPTION_REG bit 7) controla todos los pull-ups. El pull-up se apaga cuando el pin correspondiente se establece como un pin de salida. Los pines de entradas RP7:RP4 se comparan con los valores anteriores del latch de la última lectura del PORT B. El cambio de las salidas de RB7:RB4 entran a una compuerta OR para generar el cambio del puerto RB, actuando como una bandera de interrupción del bit RBIF (INTCON bit 0). Dicha interrupción puede despertar al equipo de un periodo de bajo consumo. El pin RB0 también sirve para aceptar una solicitud de interrupción externa, por flancos. Dicha interrupción queda reportada mediante el bit INTF del registro INTCON bit-0, y se habilita o inhabilita mediante el bit INTE del mismo registro (bit-4).

Figura 6. Diagramas de Bloques del PORT B. Pin RB3:RB0 a la izquierda, pin RB7:RB4 a la derecha

El PORT C es un puerto bidireccional de 8-bits, el registro de direcciones de datos correspondiente es el TRISC, el cual, estando en un nivel alto (TRISC=1) generara que el PORT C sea de entrada debido a que el output driver correspondiente estará en modo de alta impedancia, mientras que si se encuentra en un nivel bajo (TRISC=0), el pin correspondiente del PORT C actuara como una salida debido al latch del pin seleccionado. El PORT C se encuentra multiplexado con múltiples funciones periféricas. Cuando el modulo maestro-esclavo está habilitado, entonces los pines 4 y 3 pueden ser configurados con niveles de maestro-esclavo o SMBus. Los terminales del PORT C comparten funciones con otros dispositivos de entrada y salida tales como el timer1, el módulo CCP (Compare/Capture/PWM) y los puertos SSP, MSSP y USART.

Figura 7. Diagrama de Bloques del PORT C. Pin RB7:RB5 y RB2:RB0 a la izquierda, pin RB4:RB3 a la derecha

El PORT D es un puerto de 8-bits con una entrada de buffers Schmitt Trigger, Cada uno de los pines es individualmente configurable como entrada o como salida. El PORT D puede ser configurado como un microprocesador de puerto esclavo paralelo estableciendo en ser el bit PSPMODE, es decir, TRISE bit-4. Cabe resaltar que en este modo de operación, los buffers de entrada operan bajo los parámetros TTL.

Figura 8. Diagrama de Bloques del PORT D

El PORT E consta de tres pines (RE0/RD/AND, RE1/WR/AN6 y RE2/CS/AND7), los cuales pueden ser individualmente configurables como entradas o como salidas, constando de un buffer de entrada Schmitt Trigger. Los pines del PORT E se convierten entradas del microprocesador cuando se pone en set el bit PSPMODE. En este modo, el usuario debe de asegurarse que los pines TRISE 2:0 sean entradas digitales. Además de ello, es preciso asegurarse que ADCON1 este configurado para entradas y salidas digitales.

Figura 9. Diagrama de Bloques del PORT E

Introducción a MPLAB MPLAB X IDE es un software ejecutable en computadores, compatible con los sistemas operativos Windows, OS y Linux, desarrollado por Microchip Technology por aplicaciones embebidas de PIC Y dsPIC microcontroladores y controladores de señales digitales. MPLAB es una plataforma de desarrollo integrado, con múltiples prestaciones, permitiendo así escribir el programa para los PIC en assembler o en C, crear proyectos, ensamblar o compilar, simular un programa y pro gramar el circuito integrado.

Depuración mediante MPLAB Debugger Le permite al usuario efectuar una prueba de depuración de errores del código fuente del programa a ejecutar, antes de traspasarse y programarse en el circuito integrado. Select tool Son un conjunto de herramientas que le permiten al usuario la verificación del programa durante el desarrollo de la codificación. MPLAM SIM La herramienta MPLAM SIM provee al usuario una forma de visualizar las modificaciones, escrituras o lecturas de los registros de la memoria en tiempo real.

Display de 7 segmentos El display de 7 segmentos es un dispositivo opto-electrónico que permite visualizar números del 0 al 9. Es importante mencionar que los display de 7 segmentos, dado a que están construidos con diodos LED, requieren de una corriente máxima, es decir, se requiere colocar una resistencia para limitar el flujo de corriente a través del dispositivo. Existen dos tipos de displays, ánodo común y cátodo común. En los segmentos de cátodo común, el punto circuital en común para todos los leds es el cátodo (GND) mientras que para el ánodo común el punto de referencia es Vcc. Visto desde otra perspectiva, para un display de cátodo común, el display se regula mediante los niveles altos lógicos, mientras que el display de ánodo común por medio de los niveles bajos lógicos.

Por tanto, dependiendo del tipo de display de 7 segmentos, se realizan las conexiones dadas. Como cada led trabaja con tensiones y corrientes bajas, se puede conectar directamente a compuertas lógicas o pines de salida de un microcontrolador, con una intensidad lumínica derivada de la resistencia.

Figura 10. Diagrama de pines del display de 7 segmentos

Por lo anterior, la tabla siguiente muestra las combinaciones de cada uno de los leds para el display de cada numero.

Figura 11. Tabla de verdad del display de 7 segmentos

Procedimiento Se abre el software MPLAB X IDE

Figura 12. Pantalla de Inicio de MPLAB X IDE

Se hace click en la pestaña File->New Project

Figura 13. Creación de nuevo proyecto

En la ventana de Choose Project se selecciona la opción de Standalone Project

Figura 14. Selección del tipo de proyecto

En la ventana Select Device se indica el circuito integrado con el que se va a trabajar, para fines de la práctica presente, será el PIC16F877A

Figura 15. Selección del dispositivo

En la ventana Select Tool se hace click en la opción Simulator

Figura 16. Selección de herramienta opcional

En la ventana Select Compilier se selecciona el compilador mpasm, el cual permite debuggear y compilar archivos de tipo Assembler Source Module ASM.

Figura 17. Selección del compilador MPSAM

Se determina el nombre del proyecto y la carpeta dentro de la unidad de memoria en la cual se resguardara

Figura 18. Nombramiento del proyecto

Se da click derecho al apartado de Source Files del proyecto, New->AssemblyFile.asm

Figura 19. Creación del archivo .asm

En la ventana Name and Location se declara el nombre del archivo de código fuente y se selecciona la localidad de memoria en donde se guardara

Figura 20. Nombramiento del archivo de código fuente

Sobre el archivo NEWprac4.asm se escribió el siguiente código

__CONFIG _WDT_OFF&_PWRTE_OFF&_XT_OSC&_LVP_OFF&_CP_OFF ; Configuración para el programa: ;Watchdog Timer apagado, Power-Up Timer Enable apagado, Oscilador XT, Low-Voltage ;Programming apagado y Flash Program Memory Code Protection apagado LIST p=16F877A;Denota el CI a implementar (PIC16F877A) INCLUDE ;Include file correspondiente al PIC16F877A ;Contador descendente 99 a 00 implementado con el PIC16F877A, utilizando el PORTB ORG 0x00 ;Inicio de programa status equ 03h;La directiva EQU permite igual el registro status a la localidad de memoria 03h cblock 40h;La directiva CBLOCK permite crear una lista de variables que se posicionaran en ;la memoria a partir de la direccion 40h, incrementando en una cuentar, cuentad, cuentau, ninenine, nueve, siete, N, cont1, cont2, xv;Contador de retraso, ;contador de decenas, contador de unidades endc;La directiva ENDC denota el fin de la lista creada ;Empleo del puerto B para el muestreo del contador 99 a 00 bsf status,5

clrf TRISB ;Habilitar el puerto B como salida bcf status,5 clrf PORTB ;Limpiar el puerto B, es decir, reset ;Establecimiento de la correlacion entre cada digito y el numero binario correspondiete a su ;codificacion en el LED de 7 segmentos con el uso de un decodificador BCD movlw b'10011001' movwf ninenine movlw b'00001010' movwf nueve movlw b'00000110' movwf siete movlw b'00001111' movwf xv ;Contador de unidades inicio;Inicio del programa call retraso movfw ninenine; establece 99 a la salida movwf PORTB ; envía a PORTB movfw nueve ; GRABA 9 en W movwf cuentad; graba 9 en Cuenta Decimal ;------------------------DECREMENTOD;Subrutina de decremento de decenas movfw nueve ; GRABA 9 en W movwf cuentau; graba 9 en cuenta de unidades ;------------------------DECREMENTOU;Subsrutina de decremento de unidades call retraso DECF PORTB,1 ;comenzar a restar unidades DECFSZ cuentau,1 ;inicia decremento de la cuenta goto DECREMENTOU ;Se declara la condicion de que si no es cero, vuelve a restar ;------------------------;La funcion de este apartado recae en el hecho de que, al instante de tener un contador descendente, ;despues del 00 ocurre un carry y el siguiente valor es FF, ;motivo por el cual, tras restarle un 7, pasa automaticamente de 0 a 9, y se repite el contador movfw siete ;graba '7' en W SUBWF PORTB,1 ;resta una decena a PORTB DECFSZ cuentad,1 ;decrementa la cuenta decimal goto DECREMENTOD ;si no es cero vuelve a restar goto inicio ;------------------------retraso;Subrutina Retraso movfw xv ; GRABA 9 en W movwf cuentar; graba 9 en cuenta de unidades tardar call retardo DECFSZ cuentar,1 ;decrementa la cuenta decimal goto tardar

RETURN ;------------------------retardo ;Inicio de Subrutina Retardo MOVLW N MOVWF cont1 Repite1 MOVLW N MOVWF cont2 Repite2 DECFSZ cont2,1 GOTO Repite2 DECFSZ cont1,1 GOTO Repite1 RETURN ; Retorno a la llamada de rutina de retardo. END; Directiva de fin de programa Una vez terminado el código y de construirse el código principal, es posible crear el archivo de fichero .hex para programar la simulación y posteriormente el PIC

Figura 21. Exportación del archivo .hex

En la ventana siguiente nombramos el archivo correspondiente al .hex del codigo

Figura 22. Guardado del archivo .hex

Una vez creado el archivo .hex del código correspondiente, se realiza una simulación con el software de Proteus, tal como se aprecia en la figura 23.

Figura 23. Simulación en Proteus

Dentro de la simulación, en el PIC16F877A se carga el archivo .hex presionando el click derecho sobre el PIC, y seleccionar Edit Properties

Figura 24. Edit Properties

Se carga el archivo practica4.hex

Figura 25. Cargado del archivo practica4.hex

Ejecución

Figura 26. Construcción del proyecto principal

Desarrollo Primeramente, se configura el PIC16F877A mediante la directiva CONFIG mediante los parámetros WatchDog Timer apagado, Power-Up Timer Enable apagado, declaración de un oscilador tipo XT de cristal de 4MHz, Low-Voltage Programming apagado y Flash Program Memory Code Protection apagado. Con la directiva LIST se denota el CI a implementar, mientras que con la directiva INCLUDE se hace un llamdo al include file del PIC16F877A, el cual consta del nombre de los registros y sus respectivas localidades de memoria. La directiva ORG indica que en la dirección 0x00 se efectua el inicio del programa. Declaramos que el registro STATUS equivale a la dirección 03h mediante la directiva EQU. Posteriormente se establece un bloque de variables mediante las directivas CBLOCK y ENDC, marcando el inicio y el fin del mismo, respectivamente, partiendo de la localidad 40h, dentro del banco de registros de uso general en el banco 0.

Con la instrucción BSF STATUS,5 se accede al banco 1 y con CLRF TRISB se marcan todos los pines del PORTB como salidas del sistema. De igual manera, con la instrucción BCF STATUS, 5 se regresa al banco 0 y con CLRF PORTB se limpia el contenido previo del PORTB. A través de las instrucciones MOVLW para mover una literal al registro de trabajo y MOVWF para mover desde el registro de trabajo a un registro dado f, se movieron las literales 153, 10, 6 y 15 a los registros ninenine, nueve, siete y xv, respectivamente. La subrutina Inicio consiste en un llamado a la subrutina retraso, la cual graba xv en W y luego en cuentar (contador de unidades). En la subrutina tardar consta de un llamado a la subrutina retardo empleada en prácticas anteriores, en donde se mueve N (00) a W para cargarse en los registros de cont1 y cont2, los cuales serán decrementados a razón de 1 hasta volver a ser 00. Una vez terminada la subrutina de retraso, se mueve el contenido de ninenine a PORTB, se graba el valor de la variable nueve a W y de W al registro cuentad (contador de decimales). En la subrutina DecrementoD se carga al registro W el valor del registro nueve para cargarse del registro W al registro cuentau. En la subrutina DecrementoU se efectua un llamado a la subrutina retraso previamente mencionada, con la instrucción DECF PORTB, 1 restamos 1 a las unidades hasta que, con la línea DEFSZ cuentau,1 vuelva a ser cero. Si es cero, entonces se mueve del registro siete al registro de trabajo W y substraemos de W-PORTB, realizándose la acción de decremento en la resta. Si con la línea DECFSZ cuentad,1 no se vuelve a obtener un cero en cuentad, entonces se vuelve a llamar a la subrutina DecrementoD. Si se presenta un cero en cuentad, entonces se realiza la llamada a la subrutina Inicio.

Observaciones y Conclusiones En la práctica presente se apreció la multiplexion de un solo puerto para la optimización de la circuitería, permitiendo así el uso para diferentes aplicaciones, si fuese necesario, de los demás puertos de...


Similar Free PDFs