UNIVERSIDAD AUTdNOMA METROPOLITANA UNIDAD IZTAPALAPA REPORTE DE PROYECTO TERMINAL " Sistema de Desarrollo Basado en el Microcontrolador 68HC11 " INGENIERIA ELECTRóNICA Área de concentración :COMUNICACIONES José Manuel Pérez Tovar 88326210 Asesor Mtro. Victor Hugo Téllez A r - t a Resumen El objetivo del presente proyecto fue diseñar un sistema que funcione como base para el desarrollo de proyectos mas grandes y complejos. El elemento principal del sistema es el microcontrolador68HC11 de Motorola. El sistema se diseñó con fines académicos, y se empleará en los cursos de Sistemas Digitales. Esta poderosa herramienta, permitirá al profesor mostrar de manerapráctica y tangible la conexión y operación de un microcontrolador. Para los alumnos será una base sólida con la cual puedan diseñar sistemas para aplicaciones tan diversas como su creatividad e ingenio se los permita. El proyecto se efectuó en dos etapas, en la primera se diseñó el hardware del sistema, para ello se emplearon las herramientas de diseñó de circuitos lógicos y los conocimientos adquiridos en los cursos de Sistemas Digitales. En la segunda etapa se programó el software decontrol para el hardware, en el desarrollo del software se utilizaron elementos de programación estructurada, algoritmos de búsqueda secuencial, algoritmos de conversión numérica, programación en lenguaje de alto nivel ( C++) y lenguaje de bajo nivel ( Ensamblador del 68HC11 ). El sistema por si solo es operativo, posee un conjunto de ocho displays siete segmentosy un teclado alfanumérico para desplegar e introducir información. Se diseño pensando en la escalabilidad, así que puede ser expandido de acuerdo a las necesidades del usuario, se agregó un puerto de comunicaciones seriales RS 232 para que el sistema pueda ser controlado y programado desde una PC. La integración del puerto serial, permitirá al alumno aprender a programar el microcontrolador, porque una vez ensamblado su programa lo enviará desde la PC al sistema, y después le ordenaráa este que ejecute elprograma. Una vez que el alumno comprenda la operación del microcontrolador estará en condiciones de construir un sistema similar o expandir este sistema conforme a sus necesidades. Concluimos que este sistema sería una herramienta de apoyo para que los profesores utilicen un método alterno en la enseñanza de Sistemas Digitales y para que los alumnos aprendan eficazmente estas materias. 2 Tabla de contenido Tablas 4 Figuras 4 Introducción 5 Etapas de Desarrollo del Proyecto 6 Resultados 13 Bibliografía 14 Anexo 15 3 Tablas Tabla de Códigos de Exploración del Teclado 7 Tabla Displays Códigos de de 8 Figuras Mapa de Memoria 6 Diagrama del Circuito 9 4 Introducción En los cursos de sistemas digitales se estudia y analiza el funcionamiento de Unidades Centrales de Procesamiento (CPU's ) y Unidades de Micro Control (MCU's) que forman la base para el funcionamiento de las computadoras actuales, estos dispositivos conocidos como microprocesadores y microcontroladores permiten crear sistemas tan diversos que van desde un sencillo control de sistemas de iluminación hasta un complejo sistema de digitalización y procesamiento de imagen en tiempo real. La operación de los microprocesadores y microcontroladores de tecnología ClSC es en esencia la misma independientemente de que familia se trate ( Intel, Motorola, Zilog etc. ) . Por ello es importante que el alumno comprenda las bases de operación de los mismos, así mas tarde comprenderá sistemas de mayor complejidad. El propósito de este proyecto es proporcionar una herramienta para profesores y alumnos que facilite el aprendizaje de la operación y programación de un microcontrolador; así como el diseño y prueba de módulos adicionales al sistema. Con ello el profesor podrá explicar al alumno de manera explícita,los conceptos básicos del funcionamiento de los dispositivos, para que este logre un aprendizaje práctico y eficaz. El sistema debe permitir al profesor mostrar al alumno: 1) La interconexión física al detalle de un microcontrolador,con sus periféricos básicos asociados (RAM, EPROM, reloj, circuito de reset displays y teclado.). 2) La ejecución de programas diversos almacenados en EPROM's del sistema. 3) lnterfaz del microcontrolador con una PC vía puerto serial RS-232para intercambio de información. 4) Una herramienta ágil de desarrollo y prueba de programas. 5) Una base probada para crear proyectos más complejos, agregando nuevos elementos al sistema. 5 Etapas de Desarrollo del Proyecto 1.- Análisis y diseño del hardware Se construyó un sistema mínimo con el 68HC11 constituido por los elementos siguientes Microprocesador 68HC11 Memoria RAM 2764 8KB. Memoria EPROM 6264 8KB. Teclado alfanuméricopara ingresar información hacia el sistema. Controlador de teclado y displays Intel 8279. Conjunto de 8 displays 7 segmentos para despliegue de información Una vez construido el sistema se agregó un puerto de comunicación RS-232 para conectarse vía serial con una PC. El elemento principal del hardware es el MCU 68HC11,el cual posee un bus de datos de 8 bits y un bus de direcciones de 16 bits capaz de direccionar un espacio de 64KB. El espacio de 64KB se dividió en bloques de 8KB al demultiplexar las últimas tres direcciones del bus, la utilización del espacio de memoria se muestra en el siguiente mapa. Mapa de Memoria REGISTROS INTERNOS I I I $FFFF I I EPROMEXTERNA I OCTAVO BLOQUE 8K DE 6 El 8279 genera códigos de exploración cuando se oprime una tecla, éstosdebían ser interpretados mas tarde por el software, así que se creó un una tabla de conversión para referencia, la tabla se muestra a continuación. Tabla de Códigos de Exploración del Teclado 7 Para escribir datos reales desde el MCU en los displays se requirió convertirlos en códigos de display siete segmentos, esta esla tabla de referencia utilizada para tal conversión : Tabla de Códigos de Displays S 1101 O I ESPACIO n i I o1 10 1O00 O000 0101 1100 O000 O000 O101 0100 O000 o 1O0 I $6D $80 $5C $00 $54 $04 I I =l I u r ~~ LOSdiagramas del circuito terminado se muestran en las siguientes paginas 8 L S-"- Ii I L I I -, , L ~ il I - 1- I? 2.- Diseño del software de control del sistema Se desarrolló el programa MONITOR en lenguaje ensamblador propio del microcontrolador del 68HC11, y el programa de comunicación desde la PC vía puerto serial, el código fuente de ambos programas se muestra en el Anexo. El programa MONITOR que le da servicio al sistema, realiza las siguientes funciones : Cuando a el sistema es encendido, primero hace un autodiagnóstico, que consiste en lo siguiente : a ) Ejecuta el CHECKROM de la EPROM para verificar su estado si se encuentra que el CHECKROM no es el correcto, envía un mensaje de error en los DISPLAYS del sistema. El CHECKROM se hace sumando byte a byte sin acarreo. b) Revisa la SRAM haciendo un CHECKRAM, el cual se hace escribiendo un byte en una localidad dada, para luego leer esa localidad y comparar lo que se escribió y lo que se leyó, si son iguales se pasa a la siguiente localidad hasta completar los 8 KBytes; si no es igual se envía un mensaje de error en los DISPLAYS del sistema. c ) Después de hacer CHECKSUM y CHECKRAM se va un menúprincipal que consta de los siguientes servicios o procedimientos que serán llamados presionandouna tecla especifica que posee una función especial: Funciones especiales implementadas en el programa monitor 1.- F1 (función 1 ) ó EJEC AI ser llamado este procedimiento que le da servicio a esta función, se ejecuta un programa que previamente se ha editado en la RAM externa (SRAM) o en la RAM interna (la que posee el micro) o un programa grabado previamente en la EPROM o cargados desde el puerto serie. 2.- F2 ( función 2 ) ó EDIT Mediante este procedimiento, es posible introducir por medio del teclado del 8279, un programa. Este programa puede ser editado en la memoria RAM externa o en la RAM interna. Cuando es llamada esta función, luego de ser escogida la RAM en la cual se va a editar, aparece en los DISPLAYS la información siguiente DISPLAYS ID7 D6 D5 D4 D3 DlRECClON EN HEXADECIMAL (D7...D4 ) D2 DI DO1 BYTE EN ESA DIRECCIóN (Dl, DO ) D3 & D2 PERMANECEN APAGADOS. 11 Luego de la edición, se debe presionar la tecla de ENTER, para ir a la siguiente dirección a editar, cuando se presiona ENTER se incrementa a la siguiente dirección. Cuando sequiera salir de la edición, se presiona una tecla con función específica que es la de SALIR 3.- F3 ( función 3 ) ó RECONFIGURACION DE REGISTROS INTERNOS En esta función se puede cambiar cualquier registro interno del 64HC1l. En ella se puede cambiar un registro, que previamente se ha escogido. La introducción del valor de ese registro se hace desde el teclado. 4.- F4 ( función 4 ) ó TRANSMISION POR PUERTO SERIAL Recepción de programas atraves del puerto serial RS-232 desde una PC. 5.- F5 (función 5 ) ó REVISAR Cuando es llamado a este procedimiento, en los DISPLAYS aparecelo siguiente: DISPLAYS [D7 D6 D5 D4 D3 DlRECClON EN HEXADECIMAL (D7 ...D 4 ) D3 & D2 PERMANECEN APAGADOS. D2 DI DO1 BYTE EN ESA DIRECCIóN (Dl, DO ) En este procedimiento se visualiza el contenido de las distintas memorias a.- RAM externa b.- RAM interna C.- EEPROM Para visualizar el contenido de cualquiera de las memorias se implementó un proceso paso a paso y otro por auto incremento. En el paso a paso el usuario del sistema visualiza la información mediante una tecla (ENTER), en auto incremento el mismo sistema hace el incremento dando el tiempo necesario para que el usuario vea el contenido de esa dirección. Este proceso permite revisar el contenido de las localidades de memoria RAM para verificar que un programa se ha cargado correctamente, si se esta utilizando utilizando la función 2. 12 Resultados Se diseñó y construyó el sistema en wire wrap. Se diseñó el software de control cumpliendo con las especificaciones del sistema. El sistema fue probadoy verificado en su funcionamiento. Finalmente se entregó el sistema funcionando. Recomendaciones Se sugiere montar el sistema en un circuito impreso para proporcionar unaflexibilidad en su uso, de esta forma se puede agregar una extensión del busde datos para interconectar todotipo de periféricos o interconectarse con otrastarjetas. 13 Bibliografía Manual de Borland C++ Chris H. Pappas, William H. Murray Mc Graw Hill. Solid State Electronic Devices Ben G. Streetman Electrónica de los dispositivos para C.I. Muller y Kamins Adisson Wesley. The TTL Data Book Texas Instruments,USA. ALSIAS Databook National Semiconductor, USA: Electrónica, Teoría de Circuitos Boylestad, Nashelsky Prentice Hall Linear and Integrated Circuits Motorola 1990, USA. 14 * * * PROYECTO TERMINAL PROGRAMA: SISTEMA MONITORDELMC68HC11 DECLARACION DE CONSTANTES CLEAR READ DISPY WRITE HDISP IRQVEC SA1 STACK EQU EQU EQU EQU EQU EQU EQU EQU $C1 Limpieza de buffersRAMDISPLAYS $40 Lectura FIFO SENSORRAM $08 Numero de displays $90 Comando de escritura en displaysdel 8279 $A0 Habilitacion de displays $FFF2 Vector de interrupcion IRQ $F000 Ubicación de la subrutina de atención a interrupción $DFFF Ubicación del tope de la PILA RAM externa. .................................. * Parámetros y variables del SCI ( Serial Comunication Interface .................................. ). EQU $30 Velocidad de transmisión del SCI A 9600. EQU $00 Parámetros de transmisión 1 bit de inicio, 8 de datos, * un bit de stop. RXTX EQU $OC Habilita laSCI paratransmitir y recibir. BAUD EQU $102B 9600 bauds SCCRl EQU $102C 1 bit de inicio, 8 de datos, 1 bit de stop. SCCR2 EQU $102D Habilita transmisor receptor. SCSR EQU $102E EstatusFlags SCDR EQU $102F Almacenamiento de datos ACK EQU $55 Reconocimiento de enlace con l a PC. IN1 EQU $7E Inicio de transmisión. FIN EQU $E7 Fin de transmisión. BAUDRATE SETTINGS ......................... * FUNCIONES ......................... FUNCl FUNC2 FUNC3 FUNC4 FUNC5 ESC FLAG EQU EQU EQU EQU EQU EQU EQU $DC F1 $D4 F2 $CC F3 $C4 F4 $84 F5 $C4 ESCAPE ESC $FO Banderaqueindica tecla de funcionpulsada * Localidades de memoria utilizadas como VARIABLES DE AMBIENTE. DCOMV NDATOS NDIRS CODIGO C-7seg DIREAL * DATORL * BYTES DIREXEC EQU $0001 Guarda datos convertidos A HEXADECIMALES (8 bits) EQU $0002 Guarda numero de caracteres de un dato (2) EQU $0003 Guarda numero de caracteres de una direccion (4) EQU $0004 Guarda Codigo producido por teclado del 8279 EQU $0005 Guarda codigo para desplegarse en 7 segmentos EQU $0006 Localidades donde se almacena una direccion leida de teclado y convertida a unadireccion real EQU $0008 Localidad donde se almacena un dato leido de teclado y convertido a un dato real EQU $000D Se guarda el numero de bytes a recibir EQU $0010 15 * Límites de los espacios ocupadospor l a RAM interna y externa del microcontrolador LimSup LimSupL LimInf LimInfL EQU EQU EQU EQU $0009 Limite superior $0000 A $0000 B Limite inferior $0000 C * MAPA DE MEMORIA INRAM FINRAM WAKEUP EQU $COO0 Inicio de la RAM EXTERNA EQU $DFFF Fin de l a RAMEXTERNA EQU $FFFE Direccion donde despierta el 68HC11 * modo en EXPANDIDO despues del RESET INRAMI EQU $0000Inicio de la RAMINTERNA. FINRAMI EQU $OOFF Fin de la RAM INTERNA INROM EQU $E000 Inicio ROM EXTERNA FINROM EQU $FFFF Fin de la ROMEXTERNA. INRAMIED EQU $0100 Inicio de RAM INTERNA para editar * CTDAT CTCOM CTCK CTMOD * * COMANDOS PARA PROGRAMAR EL CONTROLADOR DE TECLADO 8279 EQU $2000 Transferencia de datos al 8279 EQU $2001Transferencia de comandos al 8279 EQU $34 Programaciondel reloj del 8279 (1 00 Khz) EQU $02 Programaciondelmodo de operaciondel8279 (8 displays con entrada de los datos por la izquierda). ORGWAKEUP FILL$E0,1Salto alinicio de la EPROM FILL$00,1 ORG INROM Inicio de la EPROM LDS #FINRAM1 Cargado del SP (stack pointer) al final de la * RAM INTERNA INICIA:BSR PC8279 Inicializa 8279 BSR LIMPIA Apaga los displays BSR CHKRAM Revisala RAMEXTERNA LDX #HOLA BSR MENSAJE Escribe saludo " HOLA JSR ENTER LDS #STACK Cargado del SP (stack pointer) al final de la * RAM EXTERNA ES-INT:LDX #MENU Mensaje Funcion BSR MENSAJE Habilita interrupciones CLI NOP NOP WAI Espera interrupcion SEI Deshabilita interrupciones JSR TECLA Revisa si l a tecla pulsada es de FUNCION CMPA #FLAG Esta puesta l a bandera de FUNCION ? BNEES-INT Si no, espera otrainterrupcion JSR FUNCION Si esta entonces es tecla de funcion, la ejecuta JMP ES-INT Retorno a la espera de interrupciones END Termina programa MONITOR " " " 16 * > CheckRam < * Revisa si la RAM externa esta enbuenas condiciones. CHKRAM: LDX #INRAM Inicializa un apuntador X con l a direcccion de REVISA: LDAA #$SS inicio de la RAMEXTERNA LDAB #$DF Parte alta de la direccion de la RAM $SS enunalocalidad de memoria X STAA0,XEscribe CMPA 0,XComparael valor leido con el escrito BNE ERROR Si no sonigualeshaocurrido un error PSHX PULA CBA BNE' INCREl LDAB #$FF Parte baja de la direccion de la RAM PULA CBA BNE INCRE RTS INCREl : PULA INCRE: INX JMP REVISA ERROR: LDX #BAD BSR MENSAJE ALTO: NOP Ciclo infinito cuando ha detectado un error NOP laen RAM EXTERNA. JMP ALTO ............................................................................. * > Programacion delcontrolador de teclado8279 < PG8279: LDAA #CTCK STAA CTCOM Programa el reloj del 8279 LDAA #HDISP Habilita salida en displays STAACTCOM LDAA #CTMOD STAA CTCOM Programa el modo de operacion del 8279 * 8 a bits 8 displays entrada por la izquierda. RTS ............................................................................. * > Retardo < DELAY: PSHX LDX #$FFFF DLOOP: DEX BNE DLOOP PULX RTS 17 * > Procedimiento de borrado de la FIFO/SENSORRAMDISPLAYS LIMPIA: LDAA#CLEAR STAA CTCOM ESPERA: LDAA CTCOM ANDA #$80 CMPA #$80 BEQ ESPERA RTS < Comando de limpieza Retardo paraborrarFIFO/SENSORRAM ............................................................................. * * * > Escritura de mensajes en displays < Antes de llamar a MENSAJE se debe cargar el registro X con la direccion del mensaje que se desea desplegar, el cual es de 8 caracteres MENSAJE: BSR LIMPIA LDY#DISPYNumero de displays LDAB #WRITE Coloca al 8279 en modo de ESCRITURA STAB CTCOM ESCRIBE: BEQ REGRESA Termina si desplego los 8 caracteres LDAB 0,X STAB CTDAT INX DEY JMP ESCRIBE REGRESA:RTS ............................................................................. * > Revision de la teclapulsada < TECLA: LDAB CODIGOCargaelcodigoleido del8279 LDX #TABFNES Direccion de tabla de funciones Numero de funciones LDY #$O5 COMPARA:BEQ BACK CMPB0,X BEQ BACKl INX DEY JMP COMPARA BACKl: LDAA #FLAG Bandera que indica que el codigo pertenece a una BACK: RTS funcion ............................................................................. * > Comparaciones para ver QUE FUNCION SE EJECUTARA < FUNCION:CMPB#FUNCl BNE F-2 JSR FN1 BRA HECHO F-2: CMPB #FUNC2 BNE F-3 JSR FN2 BRA HECHO 18 F-3: CMPB #FUNC3 BNE F-4 JSR FN3 BRA HECHO F-4: CMPB #FUNC4 BNE F-5 JSR FN4 BRA HECHO F-5: CMPB #FUNC5 JSR FN5 HECHO: RTS * > Ejecucion de la Funcion 1 < FNI: LDX #DFNI JSR MENSAJE JSR ENTER JSR DIREXEC RTS ............................................................................. * > Ejecucionde l a Funcion 2 e FN2: LDX #DFN2 JSR MENSAJE de funcion F2 JSR ENTER RTS ............................................................................ * > Mensaje de fallas graves < BAD: FILL $79,1Mensajede"ERROR" FILL $50,2 FILL $5C,1 FILL $50,1 FILL $08,3 GUION .............................................................................. * > Mensaje de opcion para F1 o F2 e AoB FILL $77,1 A FILL $5C,1 o FILL$7C,1 B FILL $00,5 ............................................................................ * > Mensaje de ejecucion en A (RAM interna) < ESC-A: FILL $79,1 E FILL $IE,l J FILL $79,1 E 19 FILL $39,1C FILL $08,1 FILL$77,1A FILL $00,2 ............................................................................ * > Mensaje de ejecucion en B (RAM externa) < ESC-B: FILL $79,1 E FILL $1E,I J FILL $79,1E FILL $39,1C FILL $08,1 FILL$7C,1 B FILL $00,2 ............................................................................ * > Mensaje de edicion en A (RAM interna) < EDI-A: FILL $79,1 E FILL$5E,1 d FILL $06,1I FILL $78,1 t FILL $08,1 FILL$77,1 A FILL $00,2 ........................................................................... * > Mensaje de edicion en B (RAM Externa) < EDI-B: FILL $79,1 E FILL$5E,1 FILL $06,1 FILL $78,1 FILL$08,1 FILL$7C,1 FILL $00.2 d I t - b ........................................................................... * > Mensaje de fin de funcion MENSFIN: FILL $71,1 F FILL$06,1I FILL $54,1 n FILL $08.5 - ........................................................................... * > Mensaje COSA < COSA: FILL $39,1 C FILL $3F,1 O FILL $6D,1 5 FILL $77,1 A FILL $08,4 - * > Ejecucion de la Funcion 3 < * La funcion F3 permite visualizarel contenido de los registros del 68HC11 * y cambiar su contenido si asi se desea. FN3: LDX #DFN3 20 JSRMENSAJE JSR ENTER Escribe - _ _ F3 _ _ - REGBAS: LDX #REGBASE JSR MENSAJE Escribe 1000 en displays Localidad dondese iniciara el despliege en LDAA #$96 STAA NDATOS los displays ( 06 ) LDAA $1000 LDAB $1000 JSR HEX-7SEG Se despliega el contenido de la dir = $1000 JSR ENTER * LDX#DIRINI Se pide la direcciondelregistro a ver o JSR MENSAJE cambiar JSR ENTER JSR Dir-Real Se lee direccion LDX DIREAL Se valida que la direccionesteen el CPX #$1 O00 intervalo correcto queesdesde BLT NOREG la localidad lOOOh ala 103Fh CPX #$103F BGT NOREG Sila direccion noes valida se envia un mensaje informando, se y direccion otra pide LDAA #$96 Se desplegarael contenido de DIREAL STAA NDATOS Localidad dondese iniciara el despliegeen LDAA 0,X los displays ( 06 ) LDAB 0,X JSR HEX-7SEG Se despliega el contenido de DIREAL ES-TEC: CLI NOP WAI Se espera que a se oprima la tecla que indicara que se alterara el contenido del registro seleccionado. SEI * LDAA CODIGO CMPA #FUNCl Si se desea cambiar el contenidodelregistro BEQ CAMBIO Se oprime F1 CMPA #ESCCon F4 se deja el registrosincambio BEQEXITysesaledela funcion JMP ES-TEC Si se oprimeotrateclaseregresa a esperar F1 o F 4 CAMBIO: LDAA #$96 STAA CTCOM LDAA #$O8 STAACTDAT STAA CTDAT Se escriben - - en los displays 06 y 07 JSR DatoReal Se lee el nuevo valor del registro elegido JSR ENTER Se acepta el dato LDAA DATORL Dato a introducir al registro selecionado LDX DIREAL STAA 0,X Se colocaeldato en la direccionelegida LDAA 0,X CMPA DATORL Se compara el contenido del registro con BNE NOREG el dato que se deseaba introducir,sino es * igual se informa con ERROR un JSRSALIR Presionar F4 para salir de la funcion RTS EXIT: NOREG: LDX #BAD JSR MENSAJE en JSRENTER Mensaje de error indicando que el cambio el registro selecionado no fue posible 21 JMPEXITSesaledela funcion ............................................................................. * > Ejecucion de laFuncion4 < * Transmision atraves del puerto serial SCI. FN4: LDX #DFN4 JSR MENSAJE JSR ENTER JSRONSCI SEI M1: LDAA CODIGO Verificasisedesea salir de la funcion CMPA#ESCTecla F4 BNE OUT Salir de l a funcion JSR INSCIEspera IN1 LDAA SCDR Lee el dato recibido en el COMMl CMPA #IN1 Verifica si es IN1 = inicio de transmision. IF1: BEQ STOP NoTx la PC no estalista paratransmitir. LDAB #ACK JSROUTSCI Envia reconocimiento de enlace. LDX #$O000 STXDIREXEC M2:JSR INSCIEn espera delnumero de bytes de datos a recibir. LDAA SCDRLee el dato recibido CMPA #FINFin de trasnmision. BNE OK Si fin de transmision salir. STAA BYTES Guarda numero de bytes a recibir. JSR INSCI LDAA SCDR Lee parte alta de la direccion de inicio. JSR INSCI LDAB SCDR Lee parte baja de l a direccion de inicio. STD DIREAL LDX DIREXEC BNE SIGUE STD DIREXEC SIGUE: LDX DIREAL Se obtiene l a direccioncompleta de dosbytes. LDAA BYTES Se obtiene el numero de bytes que faltan por recibir DECA DECA DECA Coneste decremento seevita recibir el checksum M3: BEQM2Sise recibio una tramacompleta salta a esperarlasiguiente, JSR INSCIEspera mas datos. LDAB SCDRLee byte. STAB 0,X Lo almacena en la direccion de memoria especificada por X INX X apunta a lasiguiente localidad de memoria. DECA Decrementa el contador de bytes. BRA M3 STOP: OK: OUT: LDX #BAD JSR MENSAJE Se despliega el mensage de error si l a PC no esta lista JSRENTER BRA OUT LDAB #ACK Se desconectaelenlace JSR OUTSCI RTS satisfactoriamente. ............................................................................... * > Ejecucion de 1aFuncion 5 < 22 FN5: LDX #DFNS JSR MENSAJE JSR ENTER SELMEM: LDX $0000 Se colocan en cero ambos limites STX LimSup STX LimInf LDX #MABC Despliega A o b o C JSR MENSAJE CLI NOP WAI SEI LDAA CODIGO A CMPA #$DB BEQ RAMI LDAA CODIGO b CMPA #$D3 BEQRAME LDAA CODIGO C CMPA #$CB BEQ EPROM BRA SMEM " SMEM: " " " RAMI: LDX #INRAM1 STX LimInf LDX #FINRAM1 STX LimSup JMP LIMITS RAME: LDX #INRAM STX LimInf LDX #FINRAM STX LimSup JMP LIMITS EPROM: LDX #INROM STX Limlnf LDX #FINROM STX LimSup JMP LIMITS MALINF: * LIMITS: " " " LDX #BAD JSR MENSAJE JSR ENTER Limite inferior LDX #DIRINI Se establecen los limites para visulizar JSR MENSAJE JSR ENTER JSR Dir-Real JSR ENTER LDX DIREAL CPX LimInf BLT MALINF STX LimInf JMP ESCFN MALSUP: " en los displays el contenido de las memorias LDX #BAD JSR MENSAJE 23 JSR ENTER superior Limite ESCFN: LDX #DIRFN JSR MENSAJE JSR ENTER JSRDir-Real JSR ENTER LDX DIREAL CPXLimSup BGT MALSUP STXLimSup * LDX LimSup Si el CPX LimInfinferior BLTINVIERTE JMP MODO limitesuperioresmenor se invierten. que el limite INVIERTE: LDY LimInf STY LimSup STX LimInf MODO: LDX #AUTO-PAS JSR MENSAJE Se seleciona el modo de ejecucion dela visualizacion CLI NOP WAI SE1 LDAA CODIGO CMPA #$DB BNE PASOFl AUTOMAT: PASOFl:CMPA PASS: JSR SALFS: " A " LDY LimInf Apuntador a la direccion inicial, limite inferior JSR AUT-PAS Ejecucion automatica JSRDELAY JSR DELAY JSR DELAY JSR DELAY JSR DELAY JSR DELAY JSR DELAY JSR DELAY JSR DELAY JSR DELAY INY Se incrementa el apuntador de direcciones CPY LimSup Si todavia no se alcanza el limite superior BLE AUTOMAT se continua desplegando. BRA SALFS Si se alcanzo. se sale de la funcion. #$DC F1 BNE MODO " " Ejecucion paso a paso LDY LimInf Apuntador a l a direccion inicial, limite inferior AUT-PAS JSR ENTER INY Se incrementa el apuntador de direcciones CPY LimSup Si todavia no se alcanza el limite superior se continua desplegando. BLE PASS se alcanzo se sale de la funcion. BRASALFSSi JSR SALIRPresionar RTS F4 para salir de la funcion 24 ............................................................................. * * > ONSCI() - lnicializa el SCI para 9600 bauds con un criztal de 8 MHz. ONSCI:LDAA#BAUDRATE STAA BAUD 9600 bauds LDAA #SETTINGS STAA SCCRl 1 bit de inicio, 8 de datos, 1 de stop. LDAA #RXTX STAA SCCR2 Habilita trasmisor receptor. RTS ............................................................................... * > INSCIO - lee desde SCI.< * El dato se recibe en el registro A. INSCI: * * LDAA SCSR lee status reg ANDA #$20 revisa RDRF BEQ INSCI Espera si noexisten datos lee dato en direccion $102F SCDR LDAA ANDA #$7F mascara de paridad RTS ............................................................................... * OUTSCIO - Salida del COMMl. * Antes de llamar a esta funcion, se debecolocar el dato a transmitir * el registro B. OUTSCI: LDAA SCSR ANDA #$80 BEQ OUTSCI * ANDA #$7F STAB SCDR envia RTS lee status loop hasta tdre=l mascara de paridad un caracter ............................................................................. * > Mensajes que se despliegan cuando se oprimeuna tecla de funcion < DFN 1: FILL $08,3 - - - - F 1 - - FILL $71,1 F 1 FILL $06,1 FILL $08,3 - DFN2: FILL $08,3 - - - - F 2 - - FILL$71,1 F FILL $5B,1 2 FILL $08,3 - DFN3: FILL $08,3 - - - - F 3 - - FILL $71,1 F FILL $4F,1 3 FILL $08,3 - DFN4: FILL $08,3 - - - - F 4 - - FILL$71,1 F FILL$66,1 4 FILL $08,3 - 25 FILL $08,3 _ _ _ - F 5 - _ _ FILL$71,1 F 5 FILL$6D,1 FILL $08,3 _ DFNS: ............................................................................ * > TabladeValoresutilizados TABFNES para comparar funciones < FILL $DC,l F1 FILL$D4,1F2 FILL $CC, 1 F3 FILL $C4,1F4 FILL $84,1F5 Shift + F4 ............................................................................. * > Mensaje de HOLA < " HOLA " FILL$76,1 H H O L A _ _ _ _ FILL $3F,1 O FILL $38,1 L FILL $77,1 A FILL $08,4 - GUION ............................................................................. * > Mensaje de Funcion < MENU: " FILL $71,1 " F FILL $1C,1 FILL $54,1 FILL $58,1 c FILL $04,1 FILL $5C,1 FILL $54,1 FILL$00,1 u n i o n ............................................................................. * > ENTER : Es un ciclo del cualsolo se sale si se oprimela tecla F1 < ENTER: CLI NOP WAI SEI LDAB CODIGO CMPB#FUNCl BNE ENTER RTS ............................................................................. * > SALIR : Es un ciclo del cual solo se salesi se oprimeESC = tecla F4 < SALIR: CLI Lee TECLA NOP NOP WAI Espera que una tecla sea oprimida 26 SE1 LDAA #ESC CMPACODIGO BNE SALIR Si RTS la tecla pulsada es F4 se sale de la rutina ............................................................................. *> Funcion Dato-Val, verifica si la tecla pulsada es Alfanumerica < Dato-Val: LDAB #$O0 Contador de codigoscomparados STAB DCOMVLimpiaregistro de datos convertidos LDX #ALFANUM Tabla de codigosalfanumericosDEL TECLADO REPITE: CLI direccion Lee NOP NOP WAI Espera oprimida tecla SEI RET: LDAA 0,X CMPA CODIGO Compara codigoleido con la tabla BEQ VALIDO Tecla valida INCB Incrementa contador INX Incrementa apuntador a la tabla Verificasitermino de comparar CMPB #$I 1 BNE RET JMP Dato-Val DCOMV DCOMV = Direccion $01 STAB DCOMV Datotecleado CONVERTIDO Ahexadecimalreal en guarda se DCONV RTS VALIDO: ADDB * ............................................................................. * > Generacion de la direccion real a partir de los codigos del 8279 < Dir-Real: Lee-Dir: JSR LIMPIA Limpia dispalys LDY #$O4 Numero de teclasaleer (O a 4) LDAA #$O0 STAA NDIRS CPY #$O000 BEQ OTRO JSR Dato-Val Valida el dato tecleado LDAB CODIGO Si CMPB #ESCoprime BEQ Dir-Real se ha cometido un error en la direccion se F4 y se escribe nuevamente JSR HEXACOD Convierte el dato en codigo de 7 segmentos JSR DESPDIR Despliega el datotecleado LDAA DCOMV PSHA Guarda Carga eldato convertido en un NUMEROHEX el dato en la pila 27 DEY JMP Lee-Dir OTRO: * PULB Obtiene la direccion real STAB INRAMI Se utilzaINRAMI como registroauxiliar PULB ASLB ASLB ASLB ASLB ADDBINRAMI PULA STAAINRAMI PULA ASLA ASLA ASLA ASLA Real ADDA INRAMI D <-- Direccion STD DIREAL DIREAL <-- Direccion Real = $0006:$0007 DIREAL RTS MSB = A = $0006, LSB =B = $0007 ............................................................................. * > Generacion del dato real a partir de los codigos del 8279< DatoReal:LDY #$O2 Numero de teclas a leer (O a 2) LDAA #$O6 STAA NDATOS Lee-Dato: CPY #$O000 BEQ ELSE JSR Dato-Val LDAB CODIGO CMPB#ESCoprime BEQ DatoReal JSR HEXACOD JSR DESPDATO Si se ha cometido un error en los datos se F4 y se escribenuevamente Despliega el dato tecleado LDAA DCOMV Cargaeldato convertido PSHA Guarda el dato en la pila DEY JMP Lee-Dato ELSE: PULA STAAINRAMI PULB ASLB ASLB ASLB ASLB ADDBINRAMI STAB DATORL B <-- DatoReal DATORL <-- DatoReal RTS ............................................................................. 28 * > DESPDIR: Despliega los caracteres de una DIRECCION en los displays * 00,01,0203. y < * * Antes de llamar esta rutina se debe inicializar el registro NDIRS con el numero de caracteres de una direccion DESPDIR: LDAB NDIRSNDIRS CMPB #$O0 BNE UNO INCB STABNDIRS LDAA #80 STAA CTCOM LDAAC-7seg STAACTDAT JMP LISTO UNO: CMPB #$O1 BNE DOS INCB STABNDIRS LDAA #$81 STAACTCOM LDAA C-7seg STAACTDAT JMP LISTO DOS: CMPB #$O2 BNE TRES INCB STABNDIRS LDAA #$82 STAACTCOM LDAA C-7seg STAACTDAT JMP LISTO TRES CMPB #$O3 = Numero de caracteres de una direccion BNE LISTO LDAA #$83 STAA CTCOM LDAAC-7seg STAACTDAT LISTO: RTS ............................................................................. * > DESPDATO: Despliega los caracteres de un DATO en los displays * 06 y 07. < * * Antes de llamar esta rutina se debeinicializar el registro NDATOS con el numero de caracteres de un dato DESPDATO: LDAB NDATOS CMPB #$O6 BNE SIETE! INCB STABNDATOS LDAA #$86 29 STAA CTCOM LDAAC-7seg STAACTDAT JMP READY SIETE: CMPB #$O7 BNE READY LDAA #$87 STAA CTCOM LDAA C-7seg STAACTDAT READY: RTS ............................................................................. * * > Tabla de caracteres alfanumericos < Conversion de codigosdel teclado a hexadecimales ALFANUM:FILL $CO, 1 O FILL $C8,1 1 FILL $C9,1 2 FILL $CA,l 3 FILL $D0,1 4 FILL $D1,1 5 FILL $D2,1 6 FILL $D8,1 7 8 FILL $D9,1 FILL $DA,l 9 FILL $DB,l A FILL $D3,1 B FILL $CB,1 C FILL $C3,1 D FILL $C2,1 E F FILL $C1,1 FILL $C4,1 F4 CODIGOS OBTENIDOS DEL TECLADO ............................................................................. * > funcion HEXACOD: convierte un codigo producido por el teclado del 8279 * en un codigo que representa su caracter en displays 7 segmentos < HEXACOD: LDX #ALFANUMDireccion de la tabla de codigosproducidos PSHY por el teclado del 8279 LDY#HEX-CODDireccion de la tabla de codigosen 7 CMV-COD: LDAB 0,X segmentos para desplegar en el 8279 CMPB CODIGO BNE AUMENTA LDAB 0,Y STABC-7seg Obtineel codigoen 7 segmentos PULY correspondiente laa tecla pulsada. lo almacena C-7seg en RTS y AUMENTA: INX INY BRA CMV-COD Saltoa convertir a codigo de 7 segmentos ............................................................................. * * > Tabla de caracteres alfanumericos < Conversion de hexadecimales a codigos en 7 segmentos 30 HEX-COD: FILL$3F,1 FILL $06,1 FILL $5B,1 FILL $4F,1 3 FILL $66,1 4 FILL $6D,1 FILL $7D,1 FILL $07,1 7 FILL $7F,1 FILL $6F,1 FILL $77,1 FILL $7C,l FILL $39,1 C FILL $5E,1 FILL $79,1 FILL $71,1 F O CODIGOS DE DISPLAYS 7 SEGMENTOS 1 2 5 6 8 9 A b d E ............................................................................. MABC: FILL $77,1 FILL $5C,1 FILL $7C,1 FILL $5C,1 FILL $39,1 C FILL $00,3 A o b o ............................................................................. DIRINI: FILL $5E,1 FILL $04,1 FILL $50,1 FILL $00,1 d i FILL $04,1 FILL $54,1 FILL $04,1 FILL$00,1 i n i r ............................................................................. DIRFN: FILL $5E,1 FILL $04,1 FILL $50,1 FILL $00,1 FILL $71,1 F FILL $04,1 FILL $54,1 FILL $00,1 d i r i n ............................................................................. AUTO-PAS FILL $77,1 A FILL $00,2 FILL $5C,1 o FILL $00.2 FILL $71,1 F FILL $06,1 1 31 ............................................................................. * > Despliega el contenido de los registros del 68HC11 del 1000h a 103F < * Antes de llamar a esta funcion se debeinicializar el registro Y * con la direccion INICIAL. Despuesde ejecutada la subrutina * se debe incrementar Y. AUT-PAS: STY LimInf LDAA #WRITE STAA NDATOS LDAALimInf LDABLimInf JSRHEX-7SEGDespliega la parte alta de la direcciondel registro selecionado LDAA #$92 STAA NDATOS LDAA LimInfL LDAB LimInfL JSRHEX-7SEGDespliega la partebaja de la direcciondel LDAA #$96 registro selecionado STAA NDATOS LDAA 0,Y LDAB 0,Y JSR HEX-7SEGDespliega el contenidodelregistro. RTS ............................................................................. * > HEX-7SEG : Convierte un numero de un byte en 2 codigos de displays a 7 * segmentos correspondientes a doscaracteres que representan el valor * * contenido en el byte < Antes de llamar a esta funcion se deben inicializar los acumuladores * * A y B con el mismo valor, el cual corresponde al byte que se transformara a dos codigos de 7 segmentos. HEX-7SEG: LSRB LSRB LSRB LSRB PSHA LDX #HEX-COD Carga tabla de codigos de displays 7 segmentos LDAA #$O0 CODUNO: CBA Cuenta hasta ubicar el apuntador de la tabla BEQ DUNO HEX-CODenel codigo de 7 segmentos INX correspondiente numero al hexadecimal que se desplegara. INCA JMPCODUNO DUNO: LDAA NDATOS STAA CTCOM LDAA O,X STAACTDAT Despliega el primercaracterdelBYTEen PULA cuestion. LSLAEjemplo: si el BYTE = 1 1 10000 = FO LSLA Se depliega primero F en el display correspondiente LSLA LSLA LSRA LSRA LSRA LSRA 32 LDX #HEX-COD LDAB #$O0 CODDOS CBA BEQ DDOS INX INCB JMP CODDOS DDOS: LDAB 0,X STAB CTDAT Despliege del segundo, que seria O en el ejemplo RTS ............................................................................. REGBASE: FILL $06,1 FILL $3F,3 FILL $00,4 1 O ............................................................................. * > Subrutina de Atencion de interrupcion < ORG SA1 Subrutina de atencion de interrupciones SUB-INT:LDAA #READ Modo de lectura del 8279 STAACTCOM LDAA CTDAT Lee el codigo generado por el 8279 STAA CODIGO Guarda el codigo LEIDO EN RAM INTERNA RTI ............................................................................. ORG IRQVEC Vector de interrupcion IRQ FILL $F0,1 Salto a SUB-INT (subrutina de atencion de FILL $00,1 interrupcion) Direccion de SUB-INT = $F000 33 Programa de transmisión desde una PC. #include #include #include #include #include #include #include <string.h> <fstream.h> <dos.h> <bios.h> <stdio.h> <stdlib.h> <conio.h> char NomArch[80]; char CadCodigo[80],Cad[80],aux[2]; void LeeS19(char "NomArch); void Serialcorn(); main() { clrscr(); tout<<" Nombre del archivo a transmitir: "; cin.getline(NomArch,80); cout<<NomArch; delay( 1000); ifstream ENTRADA (NomArch); if (ENTRADA != NULL) { LeeS19(NomArch); Serialcorn(); else { clrscr(); tout<<" Archivo no encontrado "<<"\n"; delay(2000); I return O; ) 11 Termina Main() 34 void LeeS19(char *NomArch) ( intNumDatos; int cuenta,i,j; ofstream SALIDA ("C:\\SALIDA.DAT"); ifstream ENTRADA (NomArch clrscr(); while (ENTRADA) ( ); // Archivo a trasmitir con extension ".S19" ENTRADA.getline(CadCodigo,SO);/ L e e una linea del archivo *.s19 cuenta = ENTRADA.gcount(); // Obtiene longitud de l a cadena //tout<< cuenta <<" // cout<<CadCodigo<<"\"; if ((CadCodigo[O]=='S') && (CadCodigo[ 1]=='1')) [ // Si es una cadenade datos la escribe en el archivo salida.dat 'I; for (i=O,j=2;i<(cuenta - 2);i++j++) Cad[i] = CadCodigoQ]; //cout<<CadCodigo[i]; 1 SALIDA<<Cad<<"\n"; I* cout<<"\n"; // para depuración cout<<(DATO = atoi(aux))<<" \"; cout<<sizeof(DATO)<< " h"; delay(500);*/ 1 } // fin del while } // Termina Lees 190 ........................................................................ void SerialCom(void) (// SerialCom : Transmite por el COMMl // del 68hc l1. el archivo *.S19 hacia el sistema const unsigned char ACK = 0x55; // Reconocimiento const unsigned char NACK = 0x22; // Desconocimiento const unsigned char IN1 = Ox7E; // Inicio de trasmision const unsigned char FIN = OxE7; // Fin de trasmision const char COM1 = O; const int DATA-READY = 0x100; const int TRUE= 1; const int FALSE= O; const char SETTINGS = ( C O M - 9 6 0 0 I -COM_CHR8 I -COM-STOP 1 I -COM-NOPARITY); unsignedcharDATO; I/ Caracteratransmitir unsigned char in,data; unsigned int status,MSB,LSB; int cuenta, i j ; 35 char auxl[l],aux2[1]; clrscr(); COM 1, SETTINGS); tout<<" ...TRANSMITE & RECIBE [ESC] para salir..."<<"h"; -bios-serialcorn(-COM-INIT, ifstream SALIDA ("C:\\SALIDA.DAT"); while (SALIDA) SALIDA.getline(CadCodigo,80); //Lee una linea del archivo *.s19 cuenta = SALIDA.gcount(); /I Obtiene longitud de la cadena for (i=Oj=l;i<(cuenta - l);i++j++) { /* auxl[O] = CadCodigo[i]; auxl[ 11 = 1x0'; aux2[0] = CadCodigolj]; aux2[1] = 1x0'; MSB = atoi(aux1); LSB = atoi(aux2); MSB = MSB<<4; DATO = MSBILSB;*/ DATO = CadCodigo[i]; /I cout<<DATO<<hex; 11 cout<<sizeof(DATO)<< " h"; /I for (;;) 11 { status = -bios-serialcorn(-COM-STATUS,C O M l , O); I/ cout<<"status "<<status <<hex<<"\n"; delay( 100); if (kbhit()) if ((in = getch()) == 1xlB') break; -bios-serialcorn(-COM-SEND,COMl ,DATO); cout<<"enviado "<<DATO<<hex<<"h"; cout<<sizeof(DATO)<< " \n"; if(status & DATA-READY) { /I status = -bios-serialcom(-COM-STATUS,COM1, O); I/ cout<<"status "<<status <<hex<<%"; I/ delay( 1000); if ((data = -bios-serialcorn(-COM-RECEIVE,COM1, O) & Ox7F) != O) cout<<"recibido "<<data<<hex<<"\n"; 1 } N findelfor"bios-serialcom ) /I fin for aux ) N fin del while } N Termina SerialCom /I 36