Calculadora PIC - Ensamblador
Short Description
Programada en Ensamblador...
Description
DEPARTAMENTO DE ELECTRICA Y ELECTRONICA Octubre 2017 – Febrero 2018
CARRERA DE INGENIERIA ELECTRONICA EN TELECOMUNICACIONES ASIGNATURA: MICROCONTROLADORES NRC: 2094 INFORME/TRABAJO PREPARATORIO DE LABORATORIO No.1 Profesor: Ing. Vanessa Vargas INTEGRANTES 1. Herrera Diana 2. Sampedro Darwin 3. Venegas Marcelo
11/12/2017 - SANGOLQUI
Tema:
UTILIZACIÓN DE PUERTOS DE E/S, TECLADO MATRICIAL Y PANTALLA LCD 1. Objetivo:
Al finalizar este laboratorio, el estudiante debe ser capaz de entender y utilizar las funciones básicas de los puertos de entrada y salida del Microcontrolador PIC 16F877A a través del manejo de un teclado matricial y una pantalla LCD como periféricos. 2. Materiales y Equipos:
Materiales:
Microcontrolador PIC 16F877A
Elementos que constituyen su circuito básico
Teclado matricial
Pantalla LCD
Grabador de PIC
Herramientas:
Plataforma de Desarrollo MPLAB IDE –X
Software de grabación para el PIC seleccionado
3. Procedimiento:
3.1.
PREPARACION
3.1.1. Leer el capítulo 5 del texto guía. 3.1.2. Luego de consultar la bibliografía recomendada recomendada en el curso o en otras fuentes, responda a las siguientes preguntas. En todas sus respuestas indique la referencia bibliográfica empleada.
Tema:
UTILIZACIÓN DE PUERTOS DE E/S, TECLADO MATRICIAL Y PANTALLA LCD 1. Objetivo:
Al finalizar este laboratorio, el estudiante debe ser capaz de entender y utilizar las funciones básicas de los puertos de entrada y salida del Microcontrolador PIC 16F877A a través del manejo de un teclado matricial y una pantalla LCD como periféricos. 2. Materiales y Equipos:
Materiales:
Microcontrolador PIC 16F877A
Elementos que constituyen su circuito básico
Teclado matricial
Pantalla LCD
Grabador de PIC
Herramientas:
Plataforma de Desarrollo MPLAB IDE –X
Software de grabación para el PIC seleccionado
3. Procedimiento:
3.1.
PREPARACION
3.1.1. Leer el capítulo 5 del texto guía. 3.1.2. Luego de consultar la bibliografía recomendada recomendada en el curso o en otras fuentes, responda a las siguientes preguntas. En todas sus respuestas indique la referencia bibliográfica empleada.
1. Describa brevemente brevemente los conceptos de puerto y periférico, los métodos de transferencia paralela de datos, y las técnicas de entrada y salida. Puerto: circuito que forma parte del microcontrolador y sirve de interfaz con
algún dispositivo externo. Si lo vemos desde el ámbito de programación, los puertos se identifican por sus direcciones, ubicadas por lo general en la memoria de datos. Periférico: dispositivo externo conectado al microcontrolador. Algunos de
periféricos tenemos interruptores, teclados matriciales, displays de 7 segmentos o de cristal líquido. Por supuesto, todos estos periféricos deben incluir un circuito de interfaz que es necesario para conectar a los puertos del microcontrolador. Métodos de trans ferenci fer enci a paralel paralela a de datos datos : la transferencia de datos entre
un periférico y un puerto se realiza básicamente mediante uno de los métodos siguientes:
E/S simple: es caracterizada porque entre el puerto y el periférico solamente se transfieren los bits del dato, sin señales de control.
E/S controlada: en cambio en este método se establece una “conversación” entre el puerto y el periférico. Para realizar la E/S
controlada se necesitan de algunas señales de control y algún protocolo o reglas de entendimiento uno y otro dispositivo. Técnica Técnic as de entrada entrada y s alida: lida: posee dos técnicas las cuales son
E/S programada: esta técnica técnica es basada en software. Se considera considera la presencia de algún indicador de estado del periférico, el estado de este indicador es un bit cuyo valor se reconoce desde el programa que atiende al periférico.
E/S por interrupción: se se caracteriza porque porque el periférico notifica cuando cuando necesita atención. El aviso se lo realiza mediante la solicitud de interrupción al microcontrolador. microcontrolador. Al obtener obtener una solicitud solicitud de interrupción interrupción generada por el periférico, el microcontrolador interrumpe la ejecución del programa y ejecuta la subrutina de atención del periférico.
2. ¿Qué registros de funciones especiales están asociados asociados a un puerto paralelo cualquiera? Para la manipulación de los puertos paralelos hay dos registros de funciones especiales para cada uno de los puertos, que se denominan: a) PORT (PORTA, PORTB, etc): estos registros almacenan el dato de salida del puerto. b) TRIS (TRISA, TRISB, etc): estos registros registros sirven para programar programar cada línea del puerto correspondiente como entrada o salida. 3. ¿Cómo se programa que un terminal cualquiera cualquiera de un puerto paralelo sea entrada o salida? Utilizamos los registros TRIS ya que son los correspondientes puertos de entrada o salida. Cada bit de cualquier registro TRIS se programa de la siguiente manera: TRIS
= 1 programa la línea del puerto como entrada = 0 programa la línea del puerto como salida.
4. La instrucción movf PORTA, PORTA, W, ¿coloca en W el valor del registro de funciones especiales PORTA o coloca el valor lógico de los terminales del puerto A? En este caso coloca los valores lógicos de los terminales del puerto A, para usar el valor del registro de funciones tendríamos que usar la instrucción de la siguiente manera: movf TRISA,W 5. ¿Qué problemas puede presentar la modificación individual por programa de un bit de un puerto paralelo? Para modificar la configuración de un puerto paralelo es preferible hacerlo con una palabra en este caso, el pic 16F877A, de 8 bits puesto que si se modifica un único bit entonces en caso de estar precargada información externa en este
puerto, al cambiar por ejemplo de entrada a salida entonces un solo bit significa una sola patilla del microcontrolador por lo tanto puede existir un corto, porque si externamente se introduce un 0 lógico y desde el programa se está enviando un 1 entonces no se sabrá cuál es el estado del pin en ese instante. 6. Comente las técnicas de E/S programada e interrupción en cuanto a recursos necesarios y velocidad de la transferencia de datos. E/S programada: programada:
Cuenta con dos algoritmos por consulta y por espera. Por consulta el programa pasa a otra tarea si el periférico no está listo, mientras que por espera el programa que atiende al periférico espera a que esté listo para at enderle. Así el algoritmo por consulta aprovecha el tiempo del microcontrolador ya que pasa a otra tarea como podría ser atender a otro periférico. E/S interrupción:
Esta técnica interrumpe al programa que este ejecutando en curso y pasa a atender la subrutina de atención al periférico. Debido a que es una interrupción se debe utilizar hardware para tratar la interrupción es decir un circuito necesario para solicitar la interrupción y luego tratarla. En cuanto a velocidad, la velocidad de transferencia de datos de un periférico hacia el microcontrolador en ambos casos se encuentra limitada por la velocidad con la que se ejecuten las instrucciones de un programa elaborado para la comunicación entre el microcontrolador y el periférico 7. ¿Qué factor limita la velocidad velocidad de transferencia transferencia de datos en las las técnicas de E/S programada y por interrupción? ¿Qué solución hay para esto? El factor que limita la transferencia de datos es el CPU ya que los datos transferidos desde la memoria hacia los puertos de E/S tienen que pasar por el CPU del microcontrolador y esto limita la velocidad del proceso. La solución es utilizar una tercera técnica llamada DMA (acceso directo a memoria) la cual consiste en que la transferencia de datos se realiza directamente entre el periférico y la memoria. Se implementa por hardware logrando mayor velocidad en transferencia de datos, los microcontroladores PIC no la emplean mientras que los otros microcontroladores la usan muy poco.
ACTIVIDADES 3.2.1. Diseñe una Calculadora de 2 dígitos decimales, que sume, reste, multiplique y divida. El ingreso de Datos se realiza mediante el uso de un teclado matricial. En tanto que la visualización de la información tanto de los datos ingresados como de la respuesta se despliega en una pantalla LCD. 3.2.2 Implementar el código en lenguaje ensamblador. a) PIC 16F628A
list p=16f628a #include "p16F628A.inc" __config 3F18 org 0x00 bsf STATUS,RP0 movlw 0XF0 movwf TRISB clrf TRISA bcf OPTION_REG,NOT_RBPU bcf STATUS,RP0 movlw 0x00 movwf PORTA INICIO: movlw 0x0E movwf PORTB btfss PORTB,4 call UNO btfss PORTB,5 call DOS btfss PORTB,6 call TRES btfss PORTB,7 call LETRA_A movlw 0x0D movwf PORTB btfss PORTB,4 call CUATRO btfss PORTB,5 call CINCO
btfss PORTB,6 call SEIS btfss PORTB,7 call LETRA_B movlw 0x0B movwf PORTB btfss PORTB,4 call SIETE btfss PORTB,5 call OCHO btfss PORTB,6 call NUEVE btfss PORTB,7 call LETRA_C movlw 0x07 movwf PORTB btfss PORTB,4 call ASTERISCO btfss PORTB,5 call CERO btfss PORTB,6 call NUMERAL btfss PORTB,7 call LETRA_D goto INICIO CERO: movlw 0x80 movwf PORTA btfss PORTB,5 goto CERO movlw 0x00 movwf PORTA return UNO: movlw 0x81 movwf PORTA btfss PORTB,4 goto UNO movlw 0x01 movwf PORTA return DOS: movlw 0x82
movwf PORTA btfss PORTB,5 goto DOS movlw 0x02 movwf PORTA return TRES: movlw 0x83 movwf PORTA btfss PORTB,6 goto TRES movlw 0x03 movwf PORTA return CUATRO: movlw 0x84 movwf PORTA btfss PORTB,4 goto CUATRO movlw 0x04 movwf PORTA return CINCO: movlw 0x85 movwf PORTA btfss PORTB,5 goto CINCO movlw 0x05 movwf PORTA return SEIS: movlw 0x86 movwf PORTA btfss PORTB,6 goto SEIS movlw 0x06 movwf PORTA return SIETE: movlw 0x87 movwf PORTA btfss PORTB,4 goto SIETE movlw 0x07
movwf PORTA return OCHO: movlw 0x88 movwf PORTA btfss PORTB,5 goto OCHO movlw 0x08 movwf PORTA return NUEVE: movlw 0x89 movwf PORTA btfss PORTB,6 goto NUEVE movlw 0x09 movwf PORTA return LETRA_A: movlw 0x8A movwf PORTA btfss PORTB,7 goto LETRA_A movlw 0x0A movwf PORTA return LETRA_B: movlw 0x8B movwf PORTA btfss PORTB,7 goto LETRA_B movlw 0x0B movwf PORTA return LETRA_C: movlw 0x8C movwf PORTA btfss PORTB,7 goto LETRA_C movlw 0x0C movwf PORTA return LETRA_D: movlw 0x8D
movwf PORTA btfss PORTB,7 goto LETRA_D movlw 0x0D movwf PORTA return NUMERAL: movlw 0x8E movwf PORTA btfss PORTB,6 goto NUMERAL movlw 0x0E movwf PORTA return ASTERISCO: movlw 0x8F movwf PORTA btfss PORTB,4 goto ASTERISCO movlw 0x0F movwf PORTA return end628A b) PIC 16F877A
#include "p16F877A.inc" list p=16f877A __config(0x3f71) CBLOCK 0x20 RETARDO1 RETARDO2 RETARDO3 DATO RESPALDO OPERACION RESPUESTA FILA NUMERO1 NUMERO2
DSIGNO SIGUE N M VALOR endc ORG 0X00 #DEFINE RS PORTC,6 #DEFINE E PORTC,5 INICIO: bsf STATUS,RP0 movlw 0x00 movwf TRISC movlw 0x1F movwf TRISB bcf STATUS,RP0 movlw 0x00 movwf PORTC LCD: movlw 0x03 call ENVIO_CONTROL movlw 0x02 call ENVIO_CONTROL movlw 0x02 call ENVIO_CONTROL movlw 0x08 call ENVIO_CONTROL movlw 0x00 call ENVIO_CONTROL movlw 0x0E call ENVIO_CONTROL movlw 0x00 call ENVIO_CONTROL movlw 0x01 call ENVIO_CONTROL movlw 0x00 movwf RESPALDO movwf FILA movwf SIGUE movwf OPERACION movlw 0x08 movwf VALOR LECTURA: btfss PORTB,4
goto LECTURA L1: btfsc PORTB,4 goto L1 movf PORTB,0 andlw 0x0F movwf DATO movlw 0x0A subwf DATO,0 btfss STATUS,C call NUMEROS movlw 0x02 movwf SIGUE movlw 0x0A subwf DATO,0 btfsc STATUS,Z call BORRAR movlw 0x0B subwf DATO,0 btfsc STATUS,Z call SUMA movlw 0x0C subwf DATO,0 btfsc STATUS,Z call RESTA movlw 0x0D subwf DATO,0 btfsc STATUS,Z call IGUAL movlw 0x0E subwf DATO,0 btfsc STATUS,Z call NUEVA_OPERACION movlw 0x0F subwf DATO,0 btfsc STATUS,Z call SIGNO goto LECTURA NUMEROS: movlw 0x01 subwf SIGUE,0 btfsc STATUS,Z return movlw 0x02
subwf SIGUE,0 btfsc STATUS,Z return movlw 0x03 call ENVIO_DATO movf DATO,0 call ENVIO_DATO movf DATO,0 movwf DSIGNO addwf RESPALDO,1 swapf RESPALDO,1 movlw 0x02 movwf SIGUE return BORRAR: movlw 0x00 call ENVIO_CONTROL movlw 0x01 call ENVIO_CONTROL clrf RESPALDO clrf OPERACION clrf RESPUESTA clrf FILA clrf SIGUE clrf N clrf M movlw 0x08 movwf VALOR return SUMA: movlw 0x01 subwf SIGUE,0 btfsc STATUS,Z return movlw 0x02 call ENVIO_DATO movlw 0x0B call ENVIO_DATO movlw 0x01 movwf OPERACION movlw 0x00 movwf SIGUE return RESTA:
movlw 0x01 subwf SIGUE,0 btfsc STATUS,Z return movlw 0x02 call ENVIO_DATO movlw 0x0D call ENVIO_DATO movlw 0x02 movwf OPERACION movlw 0x00 movwf SIGUE return IGUAL: movlw 0x01 subwf SIGUE,0 btfsc STATUS,Z return movf VALOR,0 call ENVIO_CONTROL movlw 0x0A call ENVIO_CONTROL movlw 0x03 call ENVIO_DATO movlw 0x0D call ENVIO_DATO movf RESPALDO,0 andlw 0x0F movwf NUMERO1 swapf RESPALDO,0 andlw 0x0F movwf NUMERO2 movlw 0x01 subwf OPERACION,0 btfsc STATUS,Z call MAS movlw 0x02 subwf OPERACION,0 btfsc STATUS,Z call MENOS movlw 0x01 movwf SIGUE return MAS:
movlw 0x01 subwf N,0 btfsc STATUS,Z goto MAS1 movlw 0x01 subwf M,0 btfsc STATUS,Z goto MAS3 movf NUMERO1,0 addwf NUMERO2,0 movwf RESPUESTA movlw 0x0A subwf RESPUESTA,0 btfsc STATUS,C call MAYOR movlw 0x03 call ENVIO_DATO movf RESPUESTA,0 call ENVIO_DATO return MAS1: movlw 0x01 subwf M,0 btfsc STATUS,Z goto MAS2 movf NUMERO1,0 movwf RESPUESTA movf NUMERO2,0 movwf NUMERO1 movf RESPUESTA,0 movwf NUMERO2 clrf N call MENOS return MAS2: clrf M clrf N movlw 0x02 call ENVIO_DATO movlw 0x0D call ENVIO_DATO call MAS return MAS3:
clrf M call MENOS return MAYOR: movlw 0x0A subwf RESPUESTA,1 movlw 0x03 call ENVIO_DATO movlw 0x01 call ENVIO_DATO return MENOS: movlw 0x01 subwf N,0 btfsc STATUS,Z goto MENOS1 movlw 0x01 subwf M,0 btfsc STATUS,Z goto MENOS3 movf NUMERO2,0 subwf NUMERO1,0 movwf RESPUESTA btfss STATUS,C call MENOR movlw 0x03 call ENVIO_DATO movf RESPUESTA,0 call ENVIO_DATO return MENOS1: movlw 0x01 subwf M,0 btfsc STATUS,Z goto MENOS2 bsf M,0 goto MAS1 return MENOS2: clrf M goto MAS1 return MENOS3: clrf M
call MAS return MENOR: movlw 0x02 call ENVIO_DATO movlw 0x0D call ENVIO_DATO movf NUMERO1,0 subwf NUMERO2,0 movwf RESPUESTA return NUEVA_OPERACION: movlw 0x00 subwf FILA,0 btfsc STATUS,Z goto F2 movlw 0x01 subwf FILA,0 btfsc STATUS,Z goto F3 movlw 0x02 subwf FILA,0 btfsc STATUS,Z goto F4 movlw 0x03 subwf FILA,0 btfsc STATUS,Z goto F1 return F1: movlw 0x08 movwf VALOR movlw 0x00 call ENVIO_CONTROL movlw 0x01 call ENVIO_CONTROL clrf RESPALDO clrf OPERACION clrf RESPUESTA clrf FILA clrf SIGUE clrf N clrf M return
F2: movlw 0x0C movwf VALOR call ENVIO_CONTROL movlw 0x00 call ENVIO_CONTROL clrf RESPALDO clrf OPERACION clrf RESPUESTA clrf SIGUE clrf N clrf M incf FILA,1 return F3: movlw 0x09 movwf VALOR call ENVIO_CONTROL movlw 0x00 call ENVIO_CONTROL clrf RESPALDO clrf OPERACION clrf RESPUESTA clrf SIGUE clrf N clrf M incf FILA,1 return F4: movlw 0x0D movwf VALOR call ENVIO_CONTROL movlw 0x00 call ENVIO_CONTROL clrf RESPALDO clrf OPERACION clrf RESPUESTA clrf SIGUE clrf N clrf M incf FILA,1 return SIGNO: movlw 0x01
subwf SIGUE,0 btfsc STATUS,Z return movlw 0x00 subwf OPERACION,0 movlw 0x01 btfsc STATUS,Z movwf N btfss STATUS,Z movwf M movlw 0x01 call ENVIO_CONTROL movlw 0x00 call ENVIO_CONTROL movlw 0x02 call ENVIO_DATO movlw 0x08 call ENVIO_DATO movlw 0x02 call ENVIO_DATO movlw 0x0D call ENVIO_DATO movlw 0x03 call ENVIO_DATO movf DSIGNO,0 call ENVIO_DATO movlw 0x02 call ENVIO_DATO movlw 0x09 call ENVIO_DATO return ENVIO_DATO: MOVWF PORTC BSF RS BSF E CALL RETARDODP BCF E CALL RETARDODP RETURN ENVIO_CONTROL: MOVWF PORTC BCF RS BSF E CALL RETARDODP
BCF E CALL RETARDODP RETURN RETARDODP: movlw 0x0B movwf RETARDO3 RET3: movwf RETARDO2 RET2: movwf RETARDO1 RET: decfsz RETARDO1 goto RET decfsz RETARDO2 goto RET2 decfsz RETARDO3 goto RET3 return end
3.2.3 Realizar la simulación del programa.
3.2.4 Implementar el circuito electrónico correspondiente. 4. Bibliografía: Valdés, F., Pallas, R. “Microcontroladores: fundamentos y aplicaciones con PIC”. Ed. Marcombo. Barcelona. 2007.
Planteamiento del problema:
1.1 Programar el PIC 16F628A para que funcione como un decodificador de teclado matricial 4x4, emulando las funciones de un 74C922, en base a la siguiente distribución 1
2
3
4
5
6
7
8
9
Aceptar
0
Limpiar
_
_
T T
1.2 Integrar el LCD al microcontrolador 16F877A, en configuración de bus de datos multiplexado con las siguientes funciones. 0-9
Visualiza números 0 - 9 Desplaza hacia la derecha el cursor una _ posición. Desplaza hacia la izquierda el cursor una _ posición. Desplaza hacia la derecha el texto una T posición. Desplaza hacia la izquierda el texto una T posición. Aceptar Cambia entre filas del LCD Limpiar Limpia el contenido del LCD
2. Objetivos: -
Programar un microcontrolador para que funcione como un decodificador de teclado 4x4. Utilizar subrutinas para generar retardos por software. Aplicar las instrucciones del microcontrolador para generar la señal DA. Integrar un LCD de 16x2.
3. Materiales -
Microcontrolador PIC 16F877A Microcontrolador PIC 16F628 Teclado matricial 4x4 LCD 16x2 Fuente de alimentación Protoboard Multímetro Cristal 4Mhz Capacitores, resistencias, dipswitch, leds, Cables Computador Grabador de PICs
4. Contenido
FUNDAMENTO TEÓRICO
PIC16f877A: Es un microcontrolador con memoria de programa tipo FLASH, lo que representa gran facilidad en el desarrollo de prototipos y en su aprendizaje ya que no requiere borrarlo con luz ultravioleta como las versiones EPROM, sino que permite reprogramarlo nuevamente sin ser borrado con anterioridad. El encapsulado más común para este microcontrolador es el DIP (Dual In-line Package) de 40 pines, propio para usarlo en experimentación
Set de instrucciones reducidas (tipo RISC), pero con las instrucciones necesarias para facilitar su manejo. Frecuencia máxima: DX-20MHz Memoria de programa flash palabra de 14 bits: 8KB Posiciones RAM de datos: 368 Posiciones EEPROM de datos: 256 Puertos E/S: A,B,C,D,E Juego de instrucciones: 35 instrucciones Longitud de la instrucción : 14 bits Arquitectura: Harvard CPU: Risc
ASEMBLER: Es una lenguaje de programación de bajo nivel. Consiste en un conjunto de mnemónicos que representan instrucciones básicas para los microcontroladores, en el caso de la familia ‘16F’ solo posee 35 instrucciones.
Gracias a la miniaturización que permite incorporar cada vez más memoria dentro de un microcontrolador sin aumentar prácticamente su costo, han surgido compiladores de lenguajes de alto nivel como Basic y C.
MPLAB X IDE: Es un Entorno de Desarrollo Integrado por sus siglas en Ingles (IDE) implementado por la empresa de Microchip para desarrollar sistemas basados en microcontroladores PIC. Su distribución es libre y gratuita y se puede descargar directamente del sitio oficial de Microchip. Este editor es modular, permite seleccionar los distintos microcontroladores soportados, además de permitir la grabación de estos circuitos integrados directamente al programador. PIC16F628: El pic 16f628a es un microcontrolador de 8 bit, posee una arquitectura RISC avanzada así como un juego reducido de 35 instrucciones. Este microcontrolador es el remplazo del obsoleto pic16f84a, los pines del pic16f628a son compatibles con el pic16f84a, así se podrían actualizar proyectos que hemos utilizado con el pic16f84a.
TECLADO MATRICIAL 4X4
Conformado por una matriz de pulsadores conformado por cuatro filas y cuatro columnas, cuando no se ha oprimido ninguna tecla, no hay conexión entre filas y columnas. Cuando se oprime una tecla se hace una conexión entre la columna y la fila de la tecla. Muchos teclados comerciales ya traen incluido su decodificador, caso contrario se debe utilizar un chip decodificador.
INICIALIZACION LCD Si bien muchas aplicaciones donde debemos mostrar información podemos resolverlas con display de 7 segmentos, estos presentas algunas limitaciones importantes, por ejemplo: no muestran caracteres alfanuméricos ni ASCII, y tienen un elevado consumo de corriente (recordemos que estamos encendiendo LEDs). Los módulos LCD (display de cristal líquido) solucionan estos inconvenientes y tienen algunas ventajas adicionales como la facilidad que con que se pueden conectar a microprocesadores y microcontroladores, sumado a la óptima presentación de la información.
El display LCD para funcionar, debe ser inicializado, para lo que se debe recurrir a una secuencia de instrucciones en un orden especifico que solo se realizarán una vez para configurar el display. El display puede funcionar con un bus de datos de 8 bits y con uno de 4 bits por lo que su secuencia de inicialización es diferente según la forma en la que se va a trabajar. Para esto existen protocolos por parte del fabricante del controlador de los displays, que nos guían para inicializarlos, la inicialización de 8 bits se encuentra en el Anexo 1 y la correspondiente a 4 bits en el Anexo 2.
5. Diagrama de bloques Fuente de Alimentación 5V
BLOQUE DE ENTRADA TECLADO MATRICIAL 4X4
Uc Pic16F628A DECODIFICADOR TECLADO 4X4
Fuente de alimentación 5V
5
Uc Pic16F877A CONTROL DISPLAY LCD 16X4
Oscilador 4Mhz
6
BLOQUE DE SALIDA LCD 16X4
6. Tabla de asignación de variables PIC 16F628 N° 1
Descripción Registro de Configuración de bits Registro de configuración del puerto de entrada B del teclado matricial 4 bits menos significativos (filas). 4 bits más significativos (columnas). Registro de configuración del puerto de salida A. Registro de Lectura de Datos Registro de Escritura de Datos Registro de almacenamiento de datos (Almacena un dato auxiliar) Registro de almacenamiento de datos (Almacena el dato del boton presionado) Registro de almacenamiento de datos (Almacena el dato para el contador) Registro de almacenamiento de datos (Almacena el dato para el contador)
Registro CW
Dirección 2007h
Valor 3F71h
TRISB
86h
FFh
TRISA
87h
00h
PortB
06h
------
PortA
07h
------
AUX
20H
−−
BOTON
21H
−−
CONT0
22H
−−
CONT1
23H
−−
Registro CW
Dirección 2007h
Valor 3F71h
2
Descripción Registro de Configuración de bits Puerto de Entrada (5 bits)
TRISB
86h
FFh
3
Puerto de Salida (8 bits)
TRISC
87h
00h
4
Registro de Lectura de Datos Registro de Escritura de Datos Registro para generación del retardo Registro para generación
PortB
06h
------
PortC
07h
------
t1
20H
------
t2
21H
------
2
3 4 5 6
7
8
9
PIC 16F877A N° 1
5 6 7
8 9 10
11 12 13 14 15 16
17
del retardo Registro de Almacenamiento de Dato Registro de Almacenamiento de dato a enviar. Registro de Almacenamiento de comprobación para envío de datos Registro de asignación de valor para ir a funciones Registro de asignación de valor para ir a funciones Registro de asignación de valor para ir a funciones Registro de Almacenamiento de Dato Registro de Almacenamiento de Dato Registro de Almacenamiento de comprobación para envío de datos Registro de Almacenamiento de comprobación para envío de datos
7. Diagrama de flujo PIC 16F628 DIAGRAMA DE FLUJO INICIO DIAGRAMA DE FLUJO DETECCIÓN DIAGRAMA DE FLUJO REBOTE
nibble1
22H
------
nibble2
23H
------
Dato
24H
------
Cont
25H
------
Cont1
26H
------
Cont2
27H
------
linea1
28H
------
linea2
29H
------
Dato1
30H
------
Dato2
31H
------
DIAGRAMA DE FLUJO CODIFICACION
A
A
DIAGRAMA DE FLUJO SALIDA DIAGRAMA DE FLUJO d20ms (RETARDO)
PIC16F877A DIAGRAMA DE FLUJO INICIO (PROGRAMA PRINCIPAL)
B
B
C
C
D
D
DIAGRAMA DE FLUJO LCDint
E
E
DIAGRAMA DE FLUJO ENABLE DIAGRAMA DE FLUJO RETARDO
DIAGRAMA DE FLUJO FIN DE LINES DIAGRAMA DE FLUJO BLINK
DIAGRAMA DE DISPLAYDER DIAGRAMA DE DISPLAYIZQ DIAGRAMA DE CURSORIZQ
DIAGRAMA DE CURSORDER DIAGRAMA DE LIMPIAR DIAGRAMA DE ABAJO
8. Cálculos Calculo de Retardos:
PIC16F877A: Retardo movlw 0xC8 (1) movwf t1 (1) Ciclo1 movlw 0x0A (1) movwf t2 (1)
;
Ciclo2 decfsz goto decfsz goto return
t2,1 Ciclo2 t1,1 Ciclo1
(1, 2) (2) (1, 2) (2) (2)
[(3 ∗ 9) + 2] + [(34 ∗ 199) + 33] + 2 + 2 + 1 + 1 = 6834 = 6834 ∗ 1 = 6.8 []
PIC16F628A: d20ms MOVLW MOVWF
.255 (1) CONT0 (1)
MOVLW MOVWF
.18 (1) CONT1 (1)
DECF BTFSS GOTO DECF BTFSS GOTO RETURN
CONT1, 1 STATUS, Z LAZO2 CONT0, 1 STATUS, Z LAZO1
LAZO1 LAZO2 (1) (1, 2) (2) (1) (1, 2) (2)
[(4 ∗ 17) + 3] + (77 ∗ 254) + 76 + 2 + 2 + 2 = 19711 = 19711 ∗ 1 = 19,71 []
Error PIC16F628A =
PIC16F877A =
−
100 = 2.37%
−
100 =1.445%
9. Programa PROGRAMA DE DECODIFICACIÓN list p=16F628A ;Tipo de procesador INCLUDE "P16F628A.Inc" ;Librería con las direcciones del microcontrolador. __CONFIG(0x3f18) ;define las caracteristicas que se van a usar AUX BOTON CONT0 CONT1
INICIO
EQU 0x20 EQU 0x21 EQU 0x22 EQU 0x23 ORG GOTO ORG MOVLW MOVWF BSF MOVLW MOVWF CLRF BCF BCF CLRF
00 INICIO 05 0x07 CMCON STATUS,RP0 0xF0 TRISB TRISA OPTION_REG,NOT_RBPU STATUS,RP0 PORTA
;Activa el banco 1 ;entradas y salidas en RB ;asigna el valor de w a TRISB ;limpia TRISA para salida ; resistencias de pull-up ;Regresa al Banco 0 ;Limpia el puerto A
BCF MOVLW MOVWF CALL SUBWF BTFSS GOTO
PORTA,7 0xAA AUX DETECCION AUX,1 STATUS,Z EMPEZAR
;Apaga el bit DA ;carga un valor ;si se presiono o no una tecla ;Llama a DETECCION ;analiza el valor extraido ;para saber si es igual a AUX ;regresa a la direccion de
CALL
CODIFICACION
;asigna un codigo a la tecla
MOVWF
BOTON
;almacena el valor del codio
CALL GOTO
SALIDA EMPEZAR
;imprime el codigo presentado ;Subrutina DETECCION:
CLRF BTFSS GOTO
PORTB PORTB,7 REBOTE
;Limpia el Puerto B ;Lee la Fila1 "1,2,3,A" ;Lamo a subrutina para eliminar
BTFSS GOTO
PORTB,6 REBOTE
;Lee la Fila2 "4,5,6,B" ;Lamo a subrutina para eliminar
BTFSS GOTO
PORTB,5 REBOTE
;Lee la Fila3 "7,8,9,C" ;Lamo a subrutina para eliminar
BTFSS
PORTB,4
;Lee la fila4 "*,0,#,D"
;programa principal EMPEZAR
EMPEZAR presionada asignado
DETECCION
el rebote el rebote el rebote
GOTO
REBOTE
;Lamo a subrutina para eliminar
RETLW
0x00
;Regresa con W=0x00
el rebote ;Subrutina REBOTE: elimina el rebote REBOTE CALL BTFSS RETLW BTFSS RETLW BTFSS RETLW BTFSS RETLW RETLW
d20ms PORTB,7 0xAA PORTB,6 0xAA PORTB,5 0xAA PORTB,4 0xAA 0x00
;Retardo de 20ms ;Lee la Fila1 "1,2,3,A" ;Regresa con W=0x10 ;Lee la Fila2 "4,5,6,B" ;Regresa con W=0x10 ;Lee la Fila3 "7,8,9,C" ;Regresa con W=0x10 ;Lee la fila4 "*,0,#,D" ;Regresa con W=0x10 ;Regresa con W=0x00
;Subrutina CODIFICACION: asigna un código a cada tecla presionada CODIFICACION ;Primera columna MOVLW MOVWF BTFSS RETLW BTFSS RETLW BTFSS RETLW BTFSS RETLW
0xF7 PORTB PORTB,7 0x0D PORTB,6 0x0E PORTB,5 0x00 PORTB,4 0x0F
;Activa la Columna 1 ;agrega el valor de w PORTB ;analiza si se presiono la tecla 1 ;asigna el valor de 1 ;analiza si se presiono la tecla 6 ;asigna el valor de 4 ;analiza si se presiono la tecla 7 ;asigna el valor de 7 ;analiza si se presiono la tecla * ;asigna el valor de F
MOVLW MOVWF BTFSS RETLW BTFSS RETLW BTFSS RETLW BTFSS RETLW
0xFB PORTB PORTB,7 0x0C PORTB,6 0x09 PORTB,5 0x08 PORTB,4 0x07
;Activo la Columna 2 ;agrega el valor de w a PORTB ;analiza si se presiono la tecla 2 ;asigna el valor de 2 ;analiza si se presiono la tecla 6 ;asigna el valor de 5 ;analiza si se presiono la tecla 8 ;asigna el valor de 8 ;analiza si se presiono la tecla 0 ;asigna el valor de 0
MOVLW MOVWF BTFSS RETLW BTFSS RETLW BTFSS RETLW BTFSS RETLW
0xFD PORTB PORTB,7 0x0B PORTB,6 0x06 PORTB,5 0x05 PORTB,4 0x04
;Activo la Columna 3 ;agrega el valor de w a PORTB ;analiza si se presiono la tecla 3 ;asigna el valor de 3 ;analiza si se presiono la tecla 6 ;asigna el valor de 6 ;analiza si se presiono la tecla 9 ;asigna el valor de 9 ;analiza si se presiono la tecla # ;asigna el valor de E
MOVLW MOVWF BTFSS RETLW BTFSS RETLW BTFSS RETLW BTFSS RETLW RETURN
0xFE PORTB PORTB,7 0x0A PORTB,6 0x03 PORTB,5 0x02 PORTB,4 0x01
;Activo la Columna 4 ;agrega el valor de w a PORTB ;analiza si se presiono la tecla A ;asigna el valor de A ;analiza si se presiono la tecla B ;asigna el valor de B ;analiza si se presiono la tecla C ;asigna el valor de C ;analiza si se presiono la tecla D ;asigna el valor de D
;Subrutina SALIDA: imprime el valor extraido y enciende el bit DA SALIDA MOVF MOVWF BSF
BOTON,0 PORTA PORTA,7
;Carga el valor de la tecla a w ;agrega el valor de w a PORTA ;Enciende el bit DA
BTFSS GOTO BTFSS GOTO BTFSS GOTO BTFSS GOTO RETURN
PORTB,7 bitDA PORTB,6 bitDA PORTB,5 bitDA PORTB,4 bitDA
;Mantiene el bit ;encendido en caso ;de que se mantenga ;presionado alguna ;tecla de ;cualquier ;fila
MOVLW MOVWF
.255 CONT0
;crea un retardo ;de 20 ms
MOVLW MOVWF
.18 CONT1
;para elimnar el rebore ;en las teclas
DECF BTFSS GOTO DECF BTFSS GOTO RETURN
CONT1,1 STATUS,Z LAZO2 CONT0,1 STATUS,Z LAZO1
;presionadas
bitDA
;Subrutina RETARDO d20ms
LAZO1
LAZO2
end
;termina el ensamblaje
PROGRAMA CONTROL DISPLAY list p=16F877A INCLUDE "P16F628A.Inc" __CONFIG(0x3f18) t1 equ 0x20 t2 equ 0x21 nibble0 equ 0x22 nibble1 equ 0x23 Dato equ 0x24 cont equ 0x25 cont1 equ 0x26 cont2 equ 0x27 linea1 equ 0x28 linea2 equ 0x29 Dato1 equ 0x30 Dato2 equ 0x31 org 0x00 bsf STATUS,RP0 bcf STATUS,RP1 movlw 0x00 movwf TRISC movlw 0xFF movwf TRISB bcf STATUS,RP0 bcf STATUS,RP1 movlw 0x00 movwf PORTC movwf cont movwf cont1 movwf cont2 movlw 0x80 movwf linea1 movlw 0xC0 movwf linea2 CALL LCDint CALL Blink Ciclo: CALL Findelinea btfss PORTB,4 goto Ciclo movf PORTB,0 andlw 0x0F addlw 0x30 movwf Dato goto Decodificar Decodificar: bcf STATUS,C movlw 0x3A subwf Dato,0 btfss STATUS,C goto EnviarNum goto Instruccion Instruccion: bsf STATUS,Z
;Tipo de procesador ;Librería con las direcciones. ;define las caracteristicas que se van a usar
;Inicio del Programa ;Acceso al banco 1 ;Configuración del Puerto C como salida ;Configuración del Puerto B como entrada ;Acceso al banco 0
;PORTC en cont ;PORTC en cont1 ;PORTC en cont2 ;linea1 igual a 0x80 ;linea2 0X0CO
;llamado a findelinea ;ir a ciclo
;Ir a decodificador ;muevo 0X3A a w ;ir a EnviarNum ;Ir a Instruccion
movlw subwf btfsc goto bsf movlw subwf btfsc goto bsf movlw subwf btfsc goto bsf movlw subwf btfsc goto bsf movlw subwf btfsc goto bsf movlw subwf btfsc goto
0x3A Dato,0 STATUS,Z CursorDer STATUS,Z 0x3B Dato,0 STATUS,Z CursorIzq STATUS,Z 0x3C Dato,0 STATUS,Z DisplayDer STATUS,Z 0x3D Dato,0 STATUS,Z DisplayIzq STATUS,Z 0x3E Dato,0 STATUS,Z Limpiar STATUS,Z 0x3F Dato,0 STATUS,Z Abajo
incf movf sublw btfss goto goto
cont1,1 cont1,0 B'00000001' STATUS,Z signo dato1
;Ir a signo ;Ir a dato1
movf movwf goto
Dato,0 Dato1 Enviar
;Ir a Enviar
movf sublw btfss goto movf movwf goto
cont1,0 0x03 STATUS,Z Enviar Dato,0 Dato2 Enviar
movf movwf andlw movwf movlw andwf
Dato,0 nibble1 0x0F nibble0 0xF0 nibble1,1
;Ir a CursorDer ;Hacer uno a bit cero. ;Decremento lo que tengo en w.
;Decremento Dato y guardo en Dato.
;Hacer uno a bit cero. ;Decrementar Dato y guardar en Dato.
EnviarNum:
dato1:
dato2:
Enviar:
swapf movf movwf bsf CALL movf iorlw movwf CALL
nibble1,1 nibble1,0 PORTC PORTC,4 Enable nibble0,0 0x10 PORTC Enable
btfsc goto goto
PORTB,4 Espera1 Ciclo
;Ir a espera ;Ir a ciclo
movf movwf andlw movwf movlw andwf swapf movf movwf CALL movf movwf CALL
Dato,0 nibble1 0x0F nibble0 0xF0 nibble1,1 nibble1,1 nibble1,0 PORTC Enable nibble0,0 PORTC Enable
;Llamo a Enable
btfsc goto goto
PORTB,4 Espera2 Ciclo
movlw movwf Goto
0x10 Dato EnviarCom
;Ir a EnviarCom
movlw movwf Goto
0x14 Dato EnviarCom
;Ir a EnviarCom
decf decf movlw movwf Goto
cont1,1 cont2,1 0x18 Dato EnviarCom
;Ir a EnviarCom
incf incf movlw movwf Goto
cont1,1 cont2,1 0x1C Dato EnviarCom
;Ir a EnviarCom
incf movf subwf
cont,1 cont2,0 linea2,1
;muevo w a nibble ;or exclusive nibble y 0x10
Espera1:
EnviarCom:
Espera2:
CursorIzq:
CursorDer:
DisplayIzq:
DisplayDer:
Abajo:
movf movwf Goto
linea2,0 Dato EnviarCom
;Ir a EnviarCom
incf movf subwf movf movwf Goto
cont,1 cont2,0 linea1,1 linea1,0 Dato EnviarCom
;Ir a EnviarCom
movlw movwf movlw movwf movlw movwf Goto
0x00 cont1 0x00 cont 0x01 Dato EnviarCom
;Ir a EnviarCom
movlw movwf CALL movlw movwf Call movlw movwf Call movlw movwf Call movlw movwf Call movlw movwf Call movlw movwf Call movlw movwf Call bcf return
0x03 PORTC Enable 0x02 PORTC Enable 0x02 PORTC Enable 0x08 PORTC Enable 0x00 PORTC Enable 0x0C PORTC Enable 0x00 PORTC Enable 0x01 PORTC Enable PORTC,0
Call bsf CALL bcf return
Retardo PORTC,5 Retardo PORTC,5
;Hacer uno el bit 5 del Puerto C ;Llamo a retardo
movlw movwf
0xC8 t1
; 200 ; Iniciamos contador1.-
Arriba:
Limpiar:
LCDint: ;Llamo a Enable ;Llamo a Enable ;Llamo a Enable ;Llamo a Enable ;Llamo a Enable ;Llamo a Enable ;Llamo a Enable ;Llamo a Enable
Enable:
Retardo: Ciclo1
movlw movwf
0x0A t2
; Iniciamos contador2
decfsz goto decfsz goto return
t2,1 Ciclo2 t1,1 Ciclo1
; Decrementa Contador2 y si es 0 sale.; Si no es 0 repetimos ciclo.; Decrementa Contador1.; Si no es cero repetimos ciclo.-
movlw movwf movf movwf andlw movwf movlw andwf swapf movf movwf CALL movf movwf CALL return
0x0F Dato Dato,0 nibble1 0x0F nibble0 0xF0 nibble1,1 nibble1,1 nibble1,0 PORTC Enable nibble0,0 PORTC Enable
movlw subwf btfss return goto end
0x10 cont1,0 STATUS,Z
;Revisar bit z igual a uno
Abajo
;Ir a Abajo
Ciclo2
Blink:
;and entre nibble1 y 0X0F ;and entre nibble1 y 0XF0 ;Cambio de valores de nibble ;Llamo a Enable ;Llamo a Enable
Findelinea:
10. Diagrama electrónico
11. Conclusiones El manejo del PIC16F628 en cuanto a programación en ensamblador es igual al PIC16F877A por contener el mismo número de instrucciones, ya que pertenece a la gama media de microcontroladores de la microchip. Al utilizar el PIC16F628 y PIC16F877A para manejar el teclado matricial se puede asignar un valor y función correspondiente que se quiera a cada tecla, sin depender de las especificaciones del fabricante. Es necesario tener un conocimiento general de las funciones que se van a programar en cada uno de los microcontroladores, puesto que al formar solo un bloque de decodificación, estas funciones deben complementarse y usarse de manera correcta para obtener los resultados deseados. Se deben tomar muchas consideraciones en el manejo del LCD, pasando por la inicialización, la conexión correcta de sus pines de polarización para que este funcione correctamente. Los problemas que se generan en la lectura de datos por el puerto es el tiempo en que las teclas son presionadas, este aspecto se debe fijar, es decir que se debe de tomar en cuenta el tiempo en presionar un tecla en la programación y complementarlo con la implementación del circuito.
11. Conclusiones El manejo del PIC16F628 en cuanto a programación en ensamblador es igual al PIC16F877A por contener el mismo número de instrucciones, ya que pertenece a la gama media de microcontroladores de la microchip. Al utilizar el PIC16F628 y PIC16F877A para manejar el teclado matricial se puede asignar un valor y función correspondiente que se quiera a cada tecla, sin depender de las especificaciones del fabricante. Es necesario tener un conocimiento general de las funciones que se van a programar en cada uno de los microcontroladores, puesto que al formar solo un bloque de decodificación, estas funciones deben complementarse y usarse de manera correcta para obtener los resultados deseados. Se deben tomar muchas consideraciones en el manejo del LCD, pasando por la inicialización, la conexión correcta de sus pines de polarización para que este funcione correctamente. Los problemas que se generan en la lectura de datos por el puerto es el tiempo en que las teclas son presionadas, este aspecto se debe fijar, es decir que se debe de tomar en cuenta el tiempo en presionar un tecla en la programación y complementarlo con la implementación del circuito.
12. Bibliografía Microcontroladores: fundamentos y aplicaciones con PIC Programación de microcontroladores PIC
Fernando E. Valdés Pérez, Ramón Pallás Areny Ibrahim Dogan
PRIMERA
2007
Español
Marcombo
PRIMERA
2006
Español
Marcombo
13. Anexos
Anexo1. Inicialización LCD con 8 bits
View more...
Comments