Control de la CT6811 desde el PC

download Control de la CT6811 desde el PC

If you can't read please download the document

description

Comunicaciones serie, carga de programas y programación desde el PC utilizando el servidor CTSERVER. Junio 1997

Transcript of Control de la CT6811 desde el PC

CONTROL DE LA CT6811 DESDE EL PCComunicaciones serie, carga de programas y programacin desde el PC utilizando el servidor CTSERVER.

GRUPO J&J. JUNIO 1997

Control de la CT6811 desde el PC

2

Control de la CT6811 desde el PC

INDICE

INTRODUCCION CAPITULO 1: COMUNICACIONES SERIE ASINCRONAS EN EL PC1.- INTRODUCCION 2.- COMUNICACIONES SERIE ASINCRONAS 2.1.- Tipos de comunicaciones 2.2.- El formato de las tramas: Bit de Start y bits de Stop 2.3.- Parmetros que caracterizan las comunicaciones serie asncronas 2.4.- Seales implicadas en una comunicacin serie asncrona FULL-DUPLEX 3.- LA NORMA RS-232C 3.1.- Introduccin 3.2.- Seales de norma RS-232C 3.3.- Conectores de 25 y 9 pines 3.4.- Caractersticas elctricas de las seales RS-232C 3.5.- La norma RS-232C y el PC. 4.- UARTS: Transmisores/receptores universales 4.1.- Introduccin 4.2.- Modelo genrico de una UART 4.3.- Seales de una UART 5.- LA UART DEL PC 5.1.- Introduccin 5.2.- Patillaje y conexionado de la UART 8250 5.3.- Diagrama de bloques de la UART 8250 5.4.- Los registros de la UART 8250 5.5.- Acceso a la UART en el PC 6.- RUTINAS DE COMUNICACIONES SERIE PARA EL PC 6.1.- Introduccin 6.2.- Interfaz 6.2.1.- Apertura y cierre del puerto serie 6.2.2.- Funciones de configuracin 6.2.3.- Funciones de lectura/escritura 6.2.4.- Otras funciones 6.2.5.- El interfaz completo 6.3.- Implementacin 6.4.- Manejo de la librera SERIE.C 6.4.1.- Ejemplo 1: Un pequeo terminal de comunicaciones 6.4.2.- Ejemplo 2: Utilizacin de accion_rxcar y accion_break 6.4.3.- Ejemplo 3: Terminal de comunicaciones con TIMEOUT 6.4.4.- Ejemplo 4: Terminal con reset 6.4.5.- Ejemplo 5: Autodeteccin de la tarjeta CT6811 7.- LA CONEXION DE LA CT6811 Y EL PC 7.1.- Introduccin 7.2.- Las seales de interconexion 7.3.- La seal de RESET 7.4.- Los problemas de interconexin 8.- CONCLUSIONES 11 12 12 13 14 14 15 15 15 16 17 17 19 19 19 19 21 21 21 22 23 25 27 27 27 27 28 28 28 28 31 32 32 33 34 35 37 39 39 39 39 39 40

CAPITULO 2: CARGA DE PROGRAMAS EN LA CT6811

3

Control de la CT6811 desde el PC

1.- INTRODUCCION 2.- EL FORMATO S19 DE MOTOROLA 2.1.- Introduccin 2.2.- Estructura interna de los fichero .S19 2.3.- Ejemplos de archivos .S19 3.- LIBRERIA S19.C PARA LA GESTION DE ARCHIVOS .S19 3.1.- Introduccin 3.2.- El interfaz de la libreria S19.C 3.3.- Implementacin 3.3.1.- El tipo abstracto S19 3.3.2.- Rutinas de conversin de datos: Libreria ASCBIN.C 3.4.- Ejemplo de utilizacion de la libreria S19.C 3.4.1.- Ejemplo 1: Programa LEERS19.C 3.4.2.- Ejemplo 2: Programa DUMPS19.C 3.5.- El interfaz de la libreria S19UTIL.C 3.6.- Ejemplos de manjejo de la libreria S19UTIL.C 4.- CARGA DE PROGRAMAS: EL PROGRAMA BOOTSTRAP 4.1.- Introducin 4.2.- El protocolo implementado en el Bootstrap 4.3.- Listado del programa de arranque Bootstrap 4.4.- Carga de programas en la RAM interna 5.- LIBRERIA BOOTSTRP.C PARA CARGA DE PROGRAMAS EN LA RAM INTERNA 5.1.- Introduccin 5.2.- Interfaz 5.3.- Implementacin 5.4.- Dependencias de la libreria BOOTSTRAP.C 5.5.- Ejemplos 5.5.1.- Ejemplo 1: Programa LEDP.C 5.5.2.- Ejemplo 2: Programa RAMINT.C 6.- CONCLUSIONES

41 42 42 42 43 44 44 44 45 45 46 47 47 48 49 51 52 52 52 55 56 57 57 57 57 58 58 58 59 60

4

Control de la CT6811 desde el PC

CAPITULO 3: EL SERVIDOR DE PROPOSITO GENERAL CTSERVER1.- INTRODUCCION 2.- EL SERVIDOR CTSERVER 2.1.- Introduccin 2.2.- Los servicios ofrecidos 2.3.- Parmetros de los diferentes servicios 2.4.- Limitaciones del servidor 3.- EL PROTOCOLO JJLINK 3.1.- Introduccin 3.2.- Formato de las tramas de dilogo 3.3.- Dilogos entre cliente-servidor 3.4.- Discusin sobre protocolo JJLINK 4.- IMPLEMENTACION DEL CTSERVER 4.1.- Diagramas de flujo 4.1.1.- Bucle principal 4.1.2.- Transferencia de bloques del 68HC11 al PC 4.1.3.- Transferencia de bloques del PC al 68HC11 4.1.4.- Grabacin de bloques en la memoria EEPROM 4.1.5.- Servicio de salto y ejecucin 4.1.6.- Control de supervivencia 4.2.- Listado del servidor CTSERVER 5.- LIBRERIA CTSERVER.C 5.1.- Introduccin 5.2.- Interfaz 5.3.- Dependencias 5.4.- Ejemplos de utilizacin 5.4.1.- Ejemplo 1: Programa CHECKCON.C 5.4.2.- Ejemplo 2: Programa CTLEDP.C 5.4.3.- Ejemplo 3: Programa CTDUMPEE.C 5.4.4.- Ejemplo 4: Programa CTSAVEE.C 5.4.5.- Ejemplo 5: Programa CTGOEE.C 6.- CONCLUSIONES 61 62 62 62 62 63 63 63 63 65 65 66 66 55 66 67 67 67 67 68 72 72 72 73 73 73 74 75 77 78 79

5

Control de la CT6811 desde el PC

CAPITULO 4: PROGRAMACION DE CLIENTES PARA EL CTSERVER1.- INTRODUCCION 2.- LA LIBRERIA CTCLIENT.C 2.1.- Introduccin 2.2.- Interfaz 2.3.- Clasificacin de las funciones 2.3.1.- Funciones que hacen uso de los servicios del CTSERVER 2.3.2.- Funciones de bucle abierto y bucle cerrado 2.4.- Implementacin 2.5.- Dependencias 2.6.- Ejemplos 2.6.1.- Ejemplo 1: Programa KLEDP.C 2.6.2.- Ejemplo 2: Programa KAD.C 3.- HERRAMIENTAS DE PROGRAMACION DE CLIENTES 3.1.- Introduccin 3.2.- El fichero R6811PC.H 3.3.- La librera CTSERVER.LIB 3.3.1.- Libreras incluidas en el fichero CTSERVER.LIB 3.3.2.- Interfaz completo de la librera CTSERVER.LIB 4.- PROGRAMACION DE CLIENTES 4.1.- Introduccin 4.2.- La estructura de los clientes 4.3.- Ejemplos de clientes 4.3.1.- Ejemplo 1: Programa PCLIENT1.C 4.3.2.- Ejemplo 2: Programa PCLIENT2.C 4.3.3.- Ejemplo 3: Programa PCLIENT3.C 4.3.4.- Ejemplo 4: Programa SPI1.C 4.3.5.- Ejemplo 5: Programa SPI2.C 5.- CONCLUSIONES 80 81 81 81 82 82 82 82 82 83 83 84 86 86 86 87 87 87 90 90 90 91 91 92 93 95 97 99

6

Control de la CT6811 desde el PC

APENDICE A: IMPLEMENTACION DE LAS DISTINTAS LIBRERIASA.1.- SERIE.C A.2.- ASCBIN.C A.3.- S19.C A.4.- S19UTIL.C A.5.- BOOTSTRP.C A.6.- CTSERVER.C A.7.- CTCLIENT.C 101 107 109 115 118 121 124

7

Control de la CT6811 desde el PC

8

Control de la CT6811 desde el PC

INTRODUCCIONEl objetivo de este libro es mostrar cmo es posible controlar la tarjeta CT6811 desde el PC. En muchas aplicaciones lo importante no es la autonoma de los sistemas, sino la monitorizacin en un PC de lo que est ocurriendo. Con este documento se pretende ensear una manera de realizar sistemas de control desde el PC. En la tarjeta CT6811 se ejecuta un programa servidor que controla los recursos y ofrece unos servicios a las aplicaciones que corren en el PC. La comunicacin entre el PC y la tarjeta CT6811 se realiza a travs de la norma RS-232C. En los diferentes capitulos del libro se va explicando detalladamente el modelo presentado en la figura de abajo, as como tambin se van desarrollando las distintas libreras en lenguaje C para su implementacin.PC

CLIENTE TARJETA CT6811 SERVICIOS Carga de Programas en la RAM interna Comunicaciones serie

SERVIDOR Bootstrap

RECURSOS

RS-232C

El primer problema a resolver es el de la comunicacin entre la CT6811 y el PC. En el captulo 1 se introducen los distintos tipos de comunicaciones y se explica con detalle en qu se basan las comunicaciones serie asncronas y las norma RS-232C. Se presenta la librera SERIE.C para la gestin de las comunicaciones serie desde el PC. Una vez que es posible transmitir bytes entre el PC y la CT6811 y vice-versa, en el captulo 2 se aborda el tema de la carga de programas en la RAM interna del 68HC11. Para ello es necesario conocer el formato .S19 de motorola y el modo de arranque BOOTSTRAP del 68HC11. En este captulo se muestran las libreras S19.C y S19UTIL.C para la gestin de archivos en este formato y la libreria BOOTSTRP.C para la carga de programas en la ram interna de la CT6811. En el captulo 3 se explica en detalle un servidor de propsito general: el CTSERVER. Este servidor nos proporciona una serie de servicios bsicos que nos permiten acceder a los recursos del 68HC11: puertos, memoria, conversores... En este mismo capitulo se explica el formato de las tramas utilizadas para transmitir la informacin y se muestra la libreria CTSERVER.C para el dilogo con el CTSERVER desde el PC. Finalmente, el captulo 4 se dedica a la programacin de clientes en el PC. Este es el captulo ms interesante y del que el lector puede sacar mayor provecho pues es en el que se puede apreciar la potencia y facilidad de manejo del sistema. A partir de este captulo el lector ya dispone de todas las herramientas y ejemplos necesarios para la realizacin de cualquier tipo de clientes. La nica limitacin es la imaginacin.... Todas las libreras se han programado en lenguaje C utilizando el compilador TURBO C++ V.1.00. Se debe configurar el compilador para asumir C++ para todos los programas.

9

Control de la CT6811 desde el PC

10

Control de la CT6811 desde el PC

CAPITULO 1:

COMUNICACIONES SERIE ASINCRONAS EN EL PC

1.- INTRODUCCIONEl objetivo final de este captulo es presentar el funcionamiento de la libreria SERIE.C para realizar comunicaciones serie asncronas con la tarjeta CT6811 desde el PC. Antes de poder enviar programas a la CT6811, programar la CT6811 desde el PC utilizando el servidor CTSERVER o realizar una red de tarjetas CT6811 ser necesario disponer de una librera en el PC que nos permita intercambiar caracteres con la tarjeta CT6811. La librera SERIE.C precisamente lo que nos permite es eso: intercambiar caracteres con la CT6811, adems algunas otras funciones. Si el lector slo est interesado en realizar programas de comunicaciones serie utilizando la librera SERIE.C puede saltar directamente a la seccin 6. Si adems de saber manejar la librera pretende comprender cmo ha sido implementada deber leer a partir de la seccin 4, donde se explican las UARTS y en particular la UART del PC. En las secciones 2 y 3 se trata sobre los conceptos de comunicaciones serie asncronos y la norma RS232C. Son dos apartados de culturilla general. En la seccin 4 se presenta un modelo genrico de la UART ms sencilla posible. En el apartado 5 se trata en particular sobre la UART del PC y sobre cmo hay que programarla. La seccin 6 contiene el interfaz de la librera SERIE.C as como una serie de ejemplos de utilizacin. Finalmente en la seccin 7 se muestra qu seaes estn implicadas al conectar la CT6811 con el PC, cmo se realiza el reset software y que problemas hay derivados de utilizar este sistema de reset.

11

Control de la CT6811 desde el PC

2.- COMUNICACIONES SERIE ASINCRONAS2.1.- TIPOS DE COMUNICACIONES El problema que se quiere solucionar es el de la comunicacin entre dos dispositivos digitales. Estos dispositivos pueden ser cualquiera: ordenadores, calculadoras, impresoras, ratones... Puesto que lo que se quiere es que ambos dispositivos intercambien bits, la clave de las comunicaciones est en cmo transportar estos bits. As aparecen dos tipos de comunicaciones: las comunicaciones serie y las comunicaciones paralelo. En las primeras, los bytes de informacin se transmiten bit a bit por un nico cable mientras que en las segundas se transmiten varios bits simultaneamente por cables diferentes. En la figura 1 se muestra un ejemplo de la transmisin del byte 10011010 del dispositivo A al B mediante comunicaciones serie y mediante comunicaciones paralelo a 8 cables (un cable por bit).Bit 7 BYTE A TRANSMITIR 1 Bit 6 0 Bit 5 0 Bit 4 1 Bit 3 1 Bit 2 0 Bit 1 1 Bit 0 0

COMUNICACIONES SERIE Bit 0 DISPOSITIVO A 0 Bit 1 1 Bit 2 0 Bit 3 1 Bit 4 1 Bit 5 0 Bit 6 0 Bit 7 1 DISPOSITIVO B

COMUNICACIONES PARALELO Bit 7 (1) DISPOSITIVO A Bit 6 (0) Bit 5 (0) Bit 4 (1) Bit 3 (1) Bit 2 (0) Bit 1 (1) Bit 0 (0) DISPOSITIVO B

Figura 1: Ejemplo de transmisin del byte 10011010 del dispositivo A al B tanto en serie como en paralelo. Las comunicaciones serie presentan una ventaja muy importante y es que necesitan muchos menos cables que las comunicaciones paralelas. Por el contrario, la velocidad de transmisin es menor y los transmisores y receptores son mas complejos que en el caso paralelo. Si se quiere una comunicacin entre los dispositivos A y B en ambas direcciones (full-duplex) se necesitaran 16 cables para el caso de las comunicaciones paralelo: 8 cables para los 8 bits en sentido A-B y 8 cables para los 8 bits en sentido B-A. Las comunicaciones en paralelo se utilizan mucho en la conexin del PC a impresoras. Dentro de las comunicaciones serie existen otros dos tipos: las comunicaciones serie asncronas y las comunicaciones serie sncronas. En las comunicaciones sncronas debe existir una sincronizacin entre el emisor y el receptor. Es decir, deben tener una seal de reloj comn. El emisor enva una seal cuadrada que le indica al receptor en qu instantes debe capturar la informacin que le llegan por el canal serie. En el caso de las comunicaciones asncronas es el propio receptor el que debe extraer la informacin de sincronizacin a partir de los datos recibidos. Para conseguir esto, la informacin se divide en tramas, existiendo unos bits que delimitan el comienzo de la trama y unos bits que determinan el final de la trama. El emisor transmite las tramas con una velocidad binaria que es conocida por el receptor.

12

Control de la CT6811 desde el PC

COMUNICACIONES SERIE SINCRONAS DISPOSITIVO A Datos Bit 0 Bit 1 Bit 2 Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 DISPOSITIVO B Datos

Reloj

Reloj

COMUNICACIONES SERIE ASINCRONAS Bits de Stop Datos XXXX Bit 0 Bit 1 Bit 2 Bits de Datos Bit 3 Bit 4 Bit 5 Bit 6 Bit 7 Bits de Start XXXX

DISPOSITIVO A

DISPOSITIVO B Datos

Figura 2: Transmisin de 8 bits del dispositivo A al B por medio de comunicaciones serie sncronas y asncronas. En la figura 2 se muestra la diferencia entre estos dos tipos de comunicaciones. En el caso de las comunicaciones sncronas es necesario una lnea especfica que una el dispositivo A con el B para transportar la seal de reloj. Por cada periodo de esta seal de reloj se transmite un bit. Por ello la frecuencia de esta seal determina la velocidad de transmisin. En el caso de las comunicaciones serie asncronas no es necesario transportar la seal de reloj. Sin embargo, como se ve en la figura, hay que transmitir primero unos bits de start que determinan el comienzo de la trama y al final unos bits de stop que determinan el final de la trama. Resumiendo lo visto hasta ahora, las comunicaciones serie asncronas se caracterizan porque los bits se transmiten en serie, uno detrs de otro y los datos se dividen en tramas formadas por bits de start, bits de datos y bits de stop. 2.2.- EL FORMATO DE LAS TRAMAS: Bit de start y bits de stop. Los datos a transmitir se insertan en tramas con la BIT DE BITS DE BITS DE DATOS estructura mostrada en la figura 3. Primero se encuentra el bit de START STOP start, despus los bits de datos, que pueden ser 7 8 y finalmente Figura 3: Formato de las tramas en los bits de stop. comunicaciones serie asncronas El bit de start es siempre un nico bit, aunque podran ser ms de uno. Simplemente se utiliza un bit por comodidad. Los bits de datos pueden variar segn la aplicacin: 5, 6, 7, 8,9.... aunque normalmente lo que se transmiten son 8 bits (un byte). Los bits de stop normalmente son 1 2. En las comunicaciones serie con el PC y con la tarjeta CT6811 siempre se utilizarn 8 bits de datos y 1 bit de stop. En la figura 4 se muestra un ejemplo de la transmisin de los bits 10011010 (8 bits de datos) y un bit de stop. Por ser una transmisin binaria la linea puede estar en dos estados que se han llamado nivel alto y nivel bajo. Segn la norma utilizada, cada nivel estar representado por una tensin diferente. Antes de llegar el dato al receptor la linea se encuentra en reposo. Al llegar el bit de start la linea cae a nivel bajo y a partir de ah se van recibiendo los siguientes bits. Con el bit de stop el receptor detecta el final de la trama y se prepara para recibir la siguiente. Si el bit de stop que se recibe tiene un nivel distinto al que le corresponde se produce un error de serializacin.Bit de Start Bits de Datos Bit de Stop

Linea en reposo Nivel Alto Nivel Bajo

Linea en reposo

1

0

0

1

1

0

1

0

13Tiempo

Figura 4: Transmisin del dato 10011010 utilizando un bit de stop

Control de la CT6811 desde el PC

En algunas ocasiones el dispositivo que transmite quiere indicar al receptor alguna situacin anmala. En este caso se puede enviar una seal de BREAK. Esta seal se enva manteniendo la lnea serie a nivel bajo durante ms tiempo del que le correspondorera si se hubiese enviado un carcter normal. De esta forma, el receptor detecta que la lnea ha estado durante ms tiempo del normal a nivel bajo y lo entiende como una seal de BREAK. 2.3.- PARAMETROS QUE CARACTERIZAN LAS COMUINCACIONES SERIE ASINCRONAS Para que la comunicacin serie asncronas entre dos dispositivos tenga xito, tanto el emisor como el receptor deben conocer los parametros que caracterizan esa comunicacin. Estos parmetros son: VELOCIDAD (BAUDIOS): Especifca el nmero de bits por segundo que se van a transmitir. Las velocidades ms utilizadas son 1200, 2400 y 9600 baudios. (Al ser transmisiones binarias, un baudio equivale a un bit por segundo). En las comunicaciones con la tarjeta CT6811 tambin se emplear la velocidad de 7680 Baudios. NUMERO DE BITS DE STOP: Normalmente se usan 1 2 bits de Stop. En las comunicaciones con el PC y la tarjeta CT6811 se utilizar 1 bit de stop. NUMERO DE BITS DE DATOS: En las comunicaciones con el PC y la CT6811 se utilizarn siempre 8 bits de datos. PARIDAD: La paridad se utiliza para detectar errores en la transmisin de datos. Si se est utilizando paridad se aade un bit ms a los bits de datos, llamado bit de paridad. Para las comunicaciones serie se puede utilizar paridad par, impar o no utilizar paridad. En las comunicaciones con el PC y la CT6811 no se utilizar ningn bit de paridad. Para especificar todos estos parmetros se suele utilizar la siguiente notacin: (Baudios)-(bits de datos)(paridad)(bits de Stop) En las comunicaciones entre el PC y la Tarjeta CT6811 se utilizarn comunicaciones serie asncronas del tipo: 1200-8N1, 7680-8N1 y 9600-8N1. La N quiere decir que no se usa paridad. 2.4.- Seales implicadas en una COMUNICACION SERIE ASINCRONA FULL-DUPLEX Todos los dispositivos que intercambian informacin mediante comunicaciones serie asncronas disponen al menos de un pin de Salida denominado TX y de un pin de entrada denominado RX. Por TX se envan datos al otro dispositivo y por RX se reciben las tramas del otro dispositivo. En la figura 5 se muestra un esquema de conexin del dispositivo A con el B. La seal TX del dispositivo A se conecta a la seal RX del dispositivo B. La seal TX de B se conecta con RX de A. Las masas (GND) de ambos dispositivos deben estar tambin unidas. Como se muestra en el ejemplo de la figura 5 slo son necesarios tres cables de interconexin entre los dispositivos A y B. Estos cables siempre van a estar presentes en las comunicaciones serie asincrnas. Sin embargo, en muchas interconexiones entre dispositivos, adems de las comunicaciones serie se aaden seales especiales de control. Por ejemplo, al interconectar un MODEM con un PC adems de TX, RX y GND se encuentran las seales DTR, CTS, DSR... Estas seales extra no forman partes de las comunicacion serie en s sino que forma parte de una norma que utiliza comunicaciones serie asncronas para la transferencia de datos. La norma ms utilizada y adems soportada por los PCs es la RS-232C.

14

Control de la CT6811 desde elTX PC

TX Dispositivo B RX

Dispositivo A RX

GND

GND

Figura 5: Conexin serie asncrona full-duplex entre dos dispositivos A y B

3.- LA NORMA RS-232C3.1.- INTRODUCCION La norma RS-232C fue definida fundamentalmente para conectar un ordenador con un modem. En la comunicacin con un modem adems de transmitir los datos de una forma serie asncrona son necesarias una serie de seales adicionales para controlar el modem y saber en qu estado se encuentra. En la norma RS-232C se especifica cules son estas seales adicionales, cmo son los conectores, qu caractersticas elctricas deben cumplir las seales y un sin fin de parmetros electromecnicos en los que no se entrar en detalle. El dispositivo que genera los datos a transmitir (Ordenador) se denomina en la norma DTE (Data Terminal Equipment) y el equipo que enva los datos a la lnea (Modem) se denomina DCE (Data Comunication Equipment). En la figura 6 se representa la interconexin entre dos ordenadores mediante modems. Los ordenadores se comunican con sus modems correspondientes a travs de la norma RS-232C.Norma RS232C Linea telefnica Norma RS232C

DTE Ordenador A

DCE Modem A

DCE Modem B

DTE Ordenador B

Figura 6: Comunicacin entre dos ordenadores(DTE) utilizando modems (DCE) 3.2.- SEALES DE LA NORMA RS-232C En esta norma se utilizan comunicaciones serie asncronas por lo que son precisas las seales TX, RX y GND como se ha indicado en el apartado 2.4. Adems de estas seales la norma incluye algunas ms para controlar el modem. Las ms importantes y ms comnmente utilizadas son: RTS (Request To Send): Solicitud de envo. Esta seal se utiliza en comunicaciones half-duplex, en las cuales las comunicaciones se pueden realizar en ambos sentidos pero no a la vez. Cada vez que el ordenador tiene algo que transmitir activa esta seal para indicar su intencin de transmitir cuando la lnea se quede libre. CTS (Clear To Sendo): Listo para enviar. Indica al ordenador que la lnea le ha sido concedida y que puede comenzar a transmitir. (Slo en comunicaciones half-duplex) DSR (Data Set Ready): Equipo de datos listo. La activa el modem para indicar que est listo para establecer la conexin con otro modem. DCD (Data Carrier Detect). Deteccin de portadora. La activa el modem para indicar que se ha establecido el enlace con otro modem. Permanecer activa durante toda la conexin. DTR (Data Terminal Ready). Terminal de Datos listo. El ordenador activa esta seal para indicar al modem que est listo para comunicarse. Al desactivarla se le indica al modem que termine con la conexin en curso. RI (Ring Indicator). Indicador de Timbre. Se activa cuando aparecen tonos de llamada en la lnea. Es decir, que cada vez que se reciba una llamada telefnica y est conectado el modem se activar esta seal. TX. Transmisin de datos. Esta seal contiene los datos que se quieren transmitir al ordenador remoto. RX. Recepcin de datos. Por esta seal se reciben los datos del ordenador remotor. GND: Seal de masa entre modem y ordenador.

15

Control de la CT6811 desde el PC

seales.

En la figura 7 se han representado los sentidos(ordenador-modem; modem-ordenador) de las diferentes

TX RX RTS ORDENADOR CTS DSR DCD DTR RI GND MODEM

Figura 7: Seales ms importantes de la norma RS232 y su sentido. 3.3.- CONECTORES DE 25 Y 9 PINES La norma RS-232C es soportada por toda la familia de ordenadores PC. La norma define para el ordenador (DTE) un conector de 25 pines macho. No obstante, existen muchas seales de la norma que para las aplicaciones normales no se utilizan. Por ello existen en los PCs conectores macho de 9 pines. En la figura 8 se muestra la numeracin de los conectores macho de 9 y 25 pines as como la seal que se transporta por cada pin. Estos conectores se denomina DB9 y DB25. La mayoria de los PCs disponen por lo menos de un conector DB9 en el que se conecta el ratn. En otros existe un segundo conector del tipo DB9 DB25. Es conveniente saber que las diferentes seales de la norma RS-232C se pueden utlizar para otros fines distintos de lo que fueron creados. Por ejemplo, la seal DTR ser utilizada para realizar un RESET de la tarjeta CT6811 antes de cargar algn programa.

16

Control de la CT6811 desde el PC

CONECTOR DB9 MACHO

CONECTOR DB25 MACHO

1 6

2 7

3 8

4 9

5

1

2

3

4

5

6

7

8

9

10 11 12 13

14 15 16 17 18 19 20 21 22 23 24 25

SEAL DCD RX TX DTR GND DSR RTS CTS RI

CONECTOR DB9 1 2 3 4 5 6 7 8 9

CONECTOR DB25 8 3 2 20 7 6 4 5 22

Figura 8: Conectores DB9 y DB25 y las seal que transporta cada pin. 3.4.- CARACTERISTICAS ELECTRICAS DE LAS SEALES Las seales elctricas de la norma RS-232 deben estar dentro del rango de 15 voltios. Las seales de salida tienen diferentes especificaciones que las de entrada. Para las salidas, las tensiones entre 5 y 15 voltios son consideradas como un 1 lgico. Las tensiones entre -5 y -15 voltios representan un 0 lgico. Las tensiones entre -5 y 5 voltios estn indefinidas. Para las seales de entrada se utiliza un margen de ruido de 2 voltios por lo que las tensiones entre 3 y 15 voltios se consideran un 1 lgico y las tensiones entre -3 y -15 un 0 lgico. No es necesario conocer las especificaciones elctricas de las seales. Sin embargo lo importante es saber que estas seales NO SON TTL. Las seales TTL se define entre 0 y 5 voltios mientras que las seales RS-232C se definen entre -15 y +15 voltios. Existe pues una incompatibilidad elctrica entre estos dos tipos de seales. Si se quiere conectar un PC, que tiene la norma RS-232C, directamente al microcontrolador 68HC11, que tiene tensiones TTL, ser necesario utilizar un convertidor de niveles. En la tarjeta CT6811 en convertidor se encuentra dentro de la propia placa por lo que se puede conectar directamente al PC sin ningn problema. 3.5.- LA NORMA RS-232C Y EL PC En el PC se proporcionan las seales de la norma RS-232 para controlar un modem. Estas seales cumplen las caractersticas elctricas. Sin embargo es posible utilizar las seales para realizar aplicaciones que no cumplan la norma RS-232. Por ejemplo la seal RI (Ring Indicator) es una seal de entrada que activa el modem para indicar al ordenador que estn llamando por telfono. Sera posible utilizar esta seal de entrada para otros propsitos definidos por el usuario. Por tanto en los conectores DB9 y DB25 se dispone de bits de entrada y salida (Ojo! que no son TTL) que pueden ser utilizados por el usuario para conectar diferentes circuitos. Si con estas seales se pretende controlar un modem habr que seguir las indicaciones de la norma. Si por el contrario se pretende controlar otro perifrico diferente de un modem se pueden dar diferentes usos a las seales. Al comunicar el PC con la tarjeta CT6811 se utilizarn los pines TX y RX para las comunicaciones serie asncronas. La seal DTR se utilizar para realizar un reset de la CT6811. Cuando se enve un pulso por DTR la tarjeta CT6811 se resetear.

17

Control de la CT6811 desde el PC

A efectos de comunicar el PC con la CT6811 lo nico que interesa saber de la norma RS-232C es que los niveles no son TTL y que se van a utlizar los pines TX y RX para las comunicaciones serie asncronas y la seal DTR para el reset. El resto de las seales de la norma no se van a utilizar.

18

Control de la CT6811 desde el PC

4.- UARTS: TRANSMISORES/RECEPTORES UNIVERSALES4.1.- INTRODUCCION Hasta ahora se han explicado los fundamentos de las comunicaciones serie asncronas. Pero realmente Cmo se podra construir un dispositivo que se comunicase con otro utilizando comunicaciones serie asncronas?. Para poder implementar este tipo de comunicaciones exiten unos circuitos integrados conocidos bajo el nombre de UART (Universal Asynchronous Receiver Transmitter). Estos integrados tienen la ventaja de que nos permiten programar los parmetros relacionados con las comunicaciones serie asncronas (Apartado 2.3): Velocidad, paridad, bits de stop y bits de datos. Con una misma UART podemos conseguir comunicaciones del tipo 1200-8N1, 9600-7N1 etc... La propia UART tambin nos informa de si se ha producido algn error en la recepcin de datos. 4.2.- MODELO GENERICO DE UNA UART En esta seccin se va a presentar un modelo de UART muy simple. En la figura 9 se muestra el diagrama de bloques.

Circuito de Reloj

TXInterfaz con exterior Transmisor

Receptor

RX

Registros de control Registros de estado Gestin interrupciones

Figura 9: Diagrama de bloques de una UART genrica La UART consta de un circuito transmisor para enviar los datos serie y un circuito receptor para recibir los datos de una lnea serie. Un circuito de reloj se encarga de generar la seal cuadrada a partir de la cual se obtendrn las seales de temporizacin para transmitir y recibir con distintas velocidades. Los registros de control permiten configurar los distintos parmetros de las comunicaciones: paridad, bits de datos, bits de estop, velocidad... Los registro de estado indican en todo momento qu es lo que est pasando: se ha recibido un dato, circuito transmisor listo para enviar siguiente dato, error en la recepcin de un dato... Finalmente existe una parte que se encarga de generar interrupciones externas para realizar un control ms eficaz de la UART. La clave de las UARTs es la facilidad de manejo. Para programarlas slo habr que conocer los registros internos y saber cmo configurarlos. Una vez configurada una UART para enviar un dato simplemente habr que escribir el dato deseado en un registro determinado. La UART ya se encarga de mandar el dato y aadir los bits necesarios para configurar la trama. (Bits de parada, stop y paridad). Igualmente para recibir

19

Control de la CT6811 desde el PC

datos es muy sencillo. Habr que leer de un registro el dato recibido. Un bit situado en un registro de estado indicar que se ha recibido un dato nuevo y que est listo para ser ledo. Algunas UARTs, como por ejemplo las del PC, adems de integrar todo lo anterior para realizar comunicaciones serie asncronas, incorporan registros de estado y control para controlar un modem mediante la norma RS-232C. Por ello estas UARTS disponen de las seales de la norma RS-232C: DTR, CTS, DCD..... 4.3.- SEALES DE UNA UART Una UART normal, como la que se encuentra dentro del microcontrolador 68HC11, dispone nicamente de dos seales: TX para transmitir los datos serie y RX para recibir datos serie. Otras UARTS ms complejas, por ejemplo las del PCs, incorporan las dems seales de la norma RS232C. En la figura 10 se muestra un diagrama con las seales normales y las aadidas por la norma RS-232C.TX RX GND UART RTS CTS DTR DSR DCD RI Seales de la norma RS-232C Seales en todas las UARTS

Figura 10: Seales en UARTs normales y UARTs que soportan la norma RS-232C.

20

Control de la CT6811 desde el PC

5.- LA UART DEL PC5.1.- INTRODUCCION Las UARTS que se encuentran en un PC suelen ser alguna de las siguientes: 8250, 8250A, 164650 16550A. La UART ms bsica es la 8250, siendo las dems compatibles con ella. Cualquier programa realizado para esta UART es compatible con las dems por ello en esta seccin se estudiar la UART 8250. La UART 8250 adems de comunicaciones serie asincronas dispone de todas las seales de la norma RS-232C necesarias para controlar un modem. Por ello, adems de contener los registros necesarios para el control y configuracin de las comunicaciones serie dispone de unos registros de control y configuracin del modem, que son los que controlan las seales DTR, DSR, CTS... 5.2.- PATILLAJE Y CONEXIONADO DE LA UART 8250 En la figura 11 se muestra el patillaje de la UART 8250. No hace falta conocerlo para programarla. Se incluye aqu para completar la informacin. En la figura 12 se muestra el conexionado de la UART 8250 en un PC compatible. Obsrvese que la UART es una pastilla TTL por lo que para adaptarse a la norma RS-232 es necesario un adaptador de niveles TTL a RS-232. De la figura 12 hay que destacar lo siguiente. La frecuencia de reloj de la UART es de 1.8432. Con esta frecuencia se pueden conseguir velocidades estndares de comunicacin de 1200, 2400 y 9600 baudios. La salida de interrupcin de la UART en el PC est controlada por la seal de salida OUT2. Cuando esta seal est activa las interrupciones estarn permitidas. Cuando la seal est desactivada no se producirn interrupciones.D0 D1 D2 D3 D4 D5 D6 D7 RCLK SIN SOUT CS0 CS1 CS2 BAUDOUT XTAL1 XTAL2 DOSTR DOSTR VSS 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 8250 40 39 38 37 36 35 34 33 32 31 30 29 28 27 26 25 24 23 22 21 VCC RI DCD DSR CTS MR OUT 1 DTR RTS OUT2 INTRPT NC A0 A1 A2 ADS CSOUT DDIS DISTR DISTR

Figura 11: Patillaje de la UART 8250

IRQ 3 IRQ 4 D0..D7 A3..A9 Lgica Seleccin

OUT 2 INTR DTR RTS SOUT CS2 DCD DSR CTS RI SIN BAUDOUT RCLK DTR RTS TX DCD DSR CTS RI RX

Reloj 1.8432 MHZ

XIN

21

Figura 12: Conexiodado de la UART 8250 en el PC

Control de la CT6811 desde el PC

5.3.- DIAGRAMA DE BLOQUES DE LA UART 8250TXTransmisor

Interfaz con exterior

Receptor

RX

Registro de control de linea

Registro de estado de lnea

Latch generador de baudios

Registro de control del modem Logica control del modem Registro de estado del modem

RTS CTS DTR DSR

DCD RI OUT 1 OUT 2

Registro de activacin de interrupciones

Logica de control de interrupcion

Registro de identificacin de interrupcin

Figura 13: Diagrama de bloques de la UART 8250 Hay dos grupos importantes de registros en la UART 8250. Los registros de lnea controlan y configuran las transmisiones serie asncronas. Los registros del modem actan sobre las seales del interfaz RS-232. Adems de estos registros existe un latch de 16 bits que sirve para configurar la velocidad de transmisin, un registro de activacin de interrupciones y un registro que indentifica qu interrupcin es la que se ha producido en la UART. En la seccin 5.4 se explican detalladamente los diferentes registros. 5.4.- LOS REGISTROS DE LA UART

22

Control de la CT6811 desde el PC

La UART 8250 dispone de un total de 10 registros de 8 bits. De ellos se puede acceder directamente a 8. Para acceder a los otros dos registros hay que activar el bit 7 del registro de control de lnea, como se explicar ms adelante. Los registros se van a ir describiendo uno por uno y ordenados del que ocupa la direccin ms baja a la ms alta. Las direcciones de los registros se van a dar en forma de desplazamiento (offset). Para obtener la direccin completa habr que sumar el desplazamiento a la direccin base en la que se encuentra situada la UART (Apartado 5.5). OFFSET 0: Registro buffer de Transmisin/Recepcin Todo lo que se escribe en este registro es enviado a travs de la salida serie. Todo lo que se recibe a travs de la lnea serie puede ser ledo a travs de este registro. OFFSET 1: Registro de activacin de interrupciones 7Siempre 0

6Siempre 0

5Siempre 0

4Siempre 0

3Entrada RS232

2Error de receptor o BREAK

1Buffer de transmisor vaco

0Dato recibido

Los bits 7,6,5 y 4 siempre se encuentra a 0. Cuando los bits 0,1,2 3 se encuentren a nivel alto se generar una interrupcin. Bit 0: Se genera interrupcin cuando se ha recibido un dato nuevo Bit 1: Se genera interupcin cuando la UART est lista para enviar otro carcter Bit 2: Se genera interrupcin cuando se ha producido un error en el receptor o se ha recibido una seal de BREAK. Bit 3: Se genera interrupcin cuando se produzca algn cambio en cualquiera de las entradas RS232. OFFSET 2: Registro de indentificacin de interrupciones Cuando aparece una interrupcin, este registro se utiliza para identificar cal es la que se ha producido. Un 0 en el bit 0 indica que la interrupcin est pendiente. Un 1 significa que no hay interrupcines pendientes. En la siguiente tabla se muestra el significado de los bits 0,1 y 2. Los dems bits no se utilizan. Bit 2 Bit 1 Bit 0 Prioridad Interrupcin producida 0 0 1 Ninguna Ninguna 1 1 0 0 Error de serializacin o BREAK 1 0 0 1 Dato recibido 0 1 0 2 Buffer de transmisin vaco 0 0 0 3 Entrada RS-232 Si se producen varias interrupciones a la vez tiene la de prioridad 0 prevalecer sobre las dems. OFFSET 3: Registro de control de lnea 7 6Control BREAK DLAB 0 = OFF 1 = ON

5Paridad:

4

3

2Bits de Stop 0 = 1 bit 1 = 2 Bits

1Bits de Datos 00 = 5 bits 01 = 6 10 = 7 11 = 8

0

000 = Sin paridad 001= Paridad impar 011= Paridad par 101= Bit a 1 111= Bit a 0

Con este registro se configuran los distintos parmetros de las comunicaciones serie asncronas: Tipo de paridad, Bits de datos y bits de Stop. Al activar el bit 6 se manda una seal de BREAK. El bit 7 se utiliza para configurar la velocidad de transmisin. Cuando se pone a 1 se utilizan los registros 0 y 1 para almacenar el valor de la velocidad deseada. Ms adelante se darn ms detalles. OFFSET 4: Registro de control del Modem

23

Control de la CT6811 desde el PC

7Siempre 0

6Siempre 0

5Siempre 0

4Test Local Loopback

3Salida de propsito general 2

2Salida de propsito general 1

1RTS

0DTR

Con este registro, adems de controlar las seales RTS y DTR de la norma RS-232C, se pueden controlar dos salidas de propsito general. En los ordenadores PC la salida de propsito general 2 (Bit 3) se utiliza para habilitar las interrupciones. El bit 4 se utiliza para realizar pruebas en el software de comunicaciones sin tener que conectar dos ordenadores. No se va a entrar en detaller. OFFSET 5: Registro de estado de lnea 7Siempre 0

6Transmisor vaco

5Buffer de transmisor vaco

4Deteccin de BREAK

3Error de trama

2Error de paridad

1Error de sobreescritura

0Dato listo

Bit 0: Se pone a uno cuando se ha recibido un dato est listo para ser ledo Bit 1: Se activa cuando se ha recibido un dato nuevo y no se haba ledo el anterior Bit 2: Indica que se ha producido un error de paridad Bit 3: Se ha recibido una trama serie con el bit de Stop incorrecto Bit 4: Indica que se ha detectado una seal de Break Bit 5: Indica que se ha desplazado un byte desde el buffer del transmisor al registro de desplazamiento del emisor Bit 6: No existen bytes en el buffer del transmisor ni en su registro de desplazamiento. OFFSET 6: Registro de estado del modem 7DCD

6RI

5DSR

4CTS

3Delta DCD

2Delta RI

1Delta DSR

0Delta CTS

Los bits 4-7 informan sobre el estado de las seales CTS, DSR, RI y DCD. Los bits 0-3 indican si se ha producido algn cambio en el estado de las respectivas seales. La aparicin de un 1 indica que la entrada ha sido modificada desde la ltima vez que se ley. OFFSET 7: Este registro se reserva para futuras ampliaciones

SELECCION DE LA VELOCIDAD La UART en los ordenadores PC tiene conectado un cristal de 1.8432MHZ. Esta frecuencia es dividida por 16 dentro de la UART. Adems, la frecuencia puede ser dividida por un valor de 16 bits contenido en un Latch para obtener la velocidad en baudios deseada para la transmisin y recepcin. El valor N que habr que almacenar en el latch divisor para obtener la velocidad en baudios deseada es: N = 1843200 / (16*baudios) As, para obener las velocidades de 9600, 2400 y 1200 habr que almacenar los valores respectivos de N: 12, 48 y 96. El latch divisor es un registros de 16 bits al que se accede de una forma especial. Primero hay que activar el bit DLAB que se encuentra en el bit 7 del registro de control de lnea. Despus se almacena en el registro 0 el valor menos significativo de N y en el registro 1 el valor ms significativo. Finalmente se vuelve a poner a 0 el bit DLAB. En la siguiente tabla se muestran valores del divisor para diferentes velocidades en baudios: Velocidad en baudios 50 75 Valor de DIVISOR 2304 1536

24

Control de la CT6811 desde el PC

110 150 300 600 1200 2400 4800 7680 9600 14400 19200 28800 38400 57600 115200 5.5.- ACCESO A LA UART EN EL PC

1047 768 384 192 96 48 24 15 12 8 6 4 3 2 1

En la siguiente tabla se muestra la direccin base de la UART para los diferentes puertos serie. PUERTO SERIE COM1 COM2 COM3 COM4 DIRECCION BASE UART 0x3F8 0x2F8 0x3E8 0x2E8

Para acceder por ejemplo al registro de control de lnea del puerto COM1 habr que acceder a la direccin del puerto 0x3F8 (direccin base COM1) + 3 (Offset registro control de lnea) = 0x3FB Para utilizar de una manera eficiente las comunicaciones serie es muy interesante utilizar las interrupciones. En la tabla siguiente se muestran las interrupciones y los vectores asociados a los distintos puertos serie.

PUERTO SERIE COM1 COM2 COM3 COM4

INTERRUPCION IRQ4 IRQ3 IRQ4 IRQ3

VECTOR INTERRUPCION 0x0B 0x0C 0x0B 0x0C

Para habilitar la interrupcin IRQ3 IRQ4 hay que modificar el registro de mscara de interrupcin del controlador de interrupciones 8259. Este registro se encuentra en el puerto 0x21. Los 8 bits de este puerto habilitan o deshabilitan las interrupciones hardware. Un 1 indica que la interrupcin est DESHABILITADA. Un 0 indica que est habilitada. Registro de mscara de interrupcin 7 LPT1 6 Disquete 5 LPT2 4 COM1 3 COM2 2 -----1 Teclado 0 Timer

Para habilitar la interrupcin del COM1 habr que un 0 en el bit 4. Para habilitar la del COM2 se pondr a 0 el bit 3. La informacin que se ha proporcionado en este apartado es til cuando se est programando la UART bajo MS-DOS. Si se utiliza LINUX no se podr acceder directamente a la UART ni se podrn controlar directamente las interrupciones.

25

Control de la CT6811 desde el PC

6.- RUTINAS DE COMUNICACIONES SERIE PARA EL PC6.1.- INTRODUCCION El objetivo de esta seccin es disponer de unas rutinas para manejar el puerto serie del PC para poderse comunicar con la tarjeta CT6811. La implementacin se va a hacer utilizando el compilador Turbo C ++ V1.0 bajo MS-DOS. En un futuro se implementar con el GCC bajo LINUX. Para las comunicaciones con la tarjeta CT6811 se van a utilizar 8 bits de datos, ninguno de paridad, 1 bit de Stop y velocidades de 1200, 7680 y 9600 baudios. Por ello las rutinas aqu presentadas son unas rutinas de propsito general sino que est orientadas hacia la comunicacin con la CT6811. La implementacin final se va a realizar mediante interrupciones. La librera desarrollada se denomina SERIE.C. En el fichero SERIE.H se encuentran todos los prototipos de las funciones de interfaz de la librera SERIE.C as como algunas definiciones. 6.2.- INTERFAZ 6.2.1.- Apertura y cierre del puerto serie Antes de utilizar un puerto serie habr que abrirlo. Para ello hay que llamar a la funcin: void abrir_puerto_serie(int puerto);

Esta funcin toma como argumento el nmero del puerto serie que se quiere utilizar: 1 para COM1, 2 para COM2, 3 para COM3 y 4 para COM4. Al abrir el puerto serie se activan las rutinas de servicio de interrupcin del puerto serie especificado y se inicializa el puerto serie para poder funcionar adecuandamente. El puerto se configura para trabajar con 8 bits de datos, 1 bit de Stop y ningn bit de paridad. La velocidad por defecto es de 9600 baudios. La seal DTR por defecto se deja a OFF. Una vez que se ha terminado de trabajar con el puerto serie, se debe cerrar. Al cerrarse el puerto serie se desactivan las rutinas de servicio de interrupcin. Si no se sale de un programa sin haber cerrado el puerto serie pueden ocurrir errores imprevisibles. Para cerrar el puerto serie se utiliza la funcin: void cerrar_puerto_serie();

No hace falta especificar el nmero de puerto serie. Se cierra el ltimo que se ha habierto. Es importante hacer notar que estas rutinas slo sirven para trabajar con un nico puerto abierto a la vez. No sirven para trabajar a la vez por ejemplo con los puertos COM1 y COM2. Siempre hay que abrir un puerto, usarlo y despus cerrarlo antes de abrir otro. 6.2.2.- Funciones de configuracin Puesto que estas rutinas estn pensadas para trabajar con la tarjeta CT6811 slo se pueden configurar la velocidad a 1200, 7680 y 9600 Baudios. Si se quieren otras velocidades habr que modificar la funcin de cambio de velocidad (Tarea que no es difcil). La velocidad se configura con la siguiente funcin: void baudios(int velocidad);

El parmetro velocidad slo puede tomar los valores 1200, 7680 9600. Si se especifica otro valor se configura el puerto a 9600 baudios. Existe una rutina para limpiar el buffer de recepcin. Si exista algn carcter en el buffer es eliminado. void vaciar_buffer(void);

6.2.3.- Funciones de lectura/escritura void enviar_car(char car);

Esta funcin enva un carcter por el puerto serie.

26

Control de la CT6811 desde el PC

Indicacin de si existen caracteres en el buffer de recepcin. Si existen caracteres pendientes de ser ledos la funcin devuelve un 1. En caso contrario devuelve un 0.int car_waiting(void);

Leer un carcter del buffer de recepcin. Si este buffer se encuentra vaco se espera a que se reciba algn carcter. Esta funcin es peligrosa puesto que se queda esperando hasta que llegue algn carcter. Si el carcter no llega por alguna razn el nuestro programa quedar bloqueado. Para solucionar esto se puede utilizar la siguiente funcin:char leer_car(void);

Leer un carcter con un plazo de tiempo mximo. Si no se ha recibido ningn carcter dentro del plazo previsto se devuelve un 1 en timeout. En caso de que se llegue el carcter se devuelve un 0 en timeout. El plazo se especifica en tics de reloj. Cada tic equivale aproximadamente a 55 milisegundos.char leer_car_plazo(int plazo,int *timeout);

6.2.4.- Otras funciones Con esta funcin se activa la seal DTR de la norma RS-232. Cuando la seal DTR se encuentra activa la tarjeta CT6811 se encuentra en estado de reset.void dtr_on(void);

Desactivar la seal DTR. Para realizar un reset completo de la tarjeta CT6811 hay que activar el DTR, mantenerlo a ON durante 200 milisegundos aproximadamente y luego desactivar el DTR.void dtr_off(void);

Se devuelve un 0 si no se ha recibido una seal de BREAK. Se devuelve un 1 cuando se ha recibido. Cuando se recibe un BREAK se activa una seal interna. Con la funcin ok_break se devuelve el estado de esta seal. Si la seal estaba activa se desactiva. Por tanto, la funcin ok_break nos devuelve el estado de la seal de BREAK desde la anterior llamada a ok_break.int ok_break(void); int wait_break(int plazo);

Esperar a que se reciba una seal de break. Si se sobrepasa el plazo y no se ha recibido la seal de BREAK se devuelve un 1. El plazo est especificado en tics de reloj.

6.2.5.- El interfaz completo A continuacin se muestran todas las funciones de interfaz:/* +-----------------------------+ APERTURA DEL PUERTO SERIE +-----------------------------+ */ void abrir_puerto_serie(int puerto); /* +----------------------------------------------------------------------+ Antes de comenzar a trabajar con el puerto serie hay que llamar a esta funcin. En el argumento se le pasa el nmero de COM con el que se quiere trabajar. Asi por ejemplo para abrir el COM1 habr que llamar a la funcin: abrir_puerto_serie(1); Los puertos soportados son COM1, COM2, COM3 y COM4. Si se especifi- ca como argumento un nmero distinto de 1,2,3 4 se abrir el COM1 Despus de llamar a esta rutina el puerto especificado queda con- figurado para trabajar con 8 bits de datos, 1 bit de Stop y ninguno de paridad. La velocidad es el 9600 baudios. +----------------------------------------------------------------------+*/ /* +-----------------------------+ RUTINAS DE CONFIGURACION

27

Control de la CT6811 desde el PC

+-----------------------------+ */ void baudios(int velocidad); /* +----------------------------------------------------------------------+ Establecer la velocidad en baudios especificada. Slo se permiten tres velocidades: 1200, 7680 y 9600 baudios. Si se especifica otra velocidad diferente se tomaran 9600 baudios. que llamar a la funcin: Ejemplo de utilizacin: baudios(1200); +----------------------------------------------------------------------+*/ void vaciar_buffer(void); /* +----------------------------------------------------------------------+ Vaciar el buffer de recepcin. Si existan caracteres se desechan +----------------------------------------------------------------------+*/ /* +-------------------------------+ RUTINAS DE LECTURA/ESCRITURA +-------------------------------+ */ void enviar_car(char car); /* +-----------------------------------------------------+ Enviar un carcter por el puerto serie abierto. +-----------------------------------------------------+*/ int car_waiting(void); /* +----------------------------------------------------------------------+ Esta funcin devuelve un valor 0 si no existe ningn carcter pen- diente de ser ledo en el buffer de recepcin. Se devuelve un valor distinto de 0 si existe algn carcter pendiente de ser ledo. +----------------------------------------------------------------------+*/ char leer_car(void); /* +----------------------------------------------------------------------+ Leer un carcter del buffer de recepcin. Si no hay ningn carcter pendiente de ser ledo se espera indefinidamente hasta que llegue algn carcter. +----------------------------------------------------------------------+*/ char leer_car_plazo(int plazo,int *timeout); /* +----------------------------------------------------------------------+ Leer un carcter del buffer de recepcin. Si el carcter no se ha recibido dentro del plazo establecido se devuelve un valor distin- to de 0 en timeout. En caso de llegar un carcter dentro del plazo indicado se devuelve el carcter y se devuelve 0 en timeout. El valor del plazo se especifica en tics de reloj. Cada Tic equi- vale aproximadamente a 55ms. +----------------------------------------------------------------------+*/ /* +-----------------------+ OTRAS RUTINAS +-----------------------+ */ void dtr_on(void); /* +---------------------------+ Activar la seal DTR

28

Control de la CT6811 desde el PC

+---------------------------+*/ /*void dtr_off(void);*/ /* +---------------------------+ Desactivar la seal DTR +---------------------------+*/ int ok_break(void); /* +----------------------------------------------------------------------+ Se devuelve un valor 0 si no se ha recibido ninguna seal de BREAK Se devuelve un valor distinto de 0 si se ha recibo un BREAK +----------------------------------------------------------------------+*/ int wait_break(int plazo); /* +----------------------------------------------------------------------+ Esperar a que venga una seal de BREAK en el plazo indicado. Si es as se devuelve un valor distinto de 0. Si transcurre el plazo y no se ha recibido un BREAK se devuelve 0. El plazo se especifica en tics de reloj. Cada tic equivale a 55 milisegundos. +----------------------------------------------------------------------+*/ /* +------------------------------+ TERMINAR CON EL PUERTO SERIE +------------------------------+ */ void cerrar_puerto_serie(); /*+-------------------------------------------------------+ Antes de terminar el programa es necesario llamar a este procedimiento para desactivar las rutinas de interrupcin. +-------------------------------------------------------+ */

29

Control de la CT6811 desde el PC

6.3.- IMPLEMENTACION En la figura 14 se muestra la estructura de las distintas funciones que conforman el interfaz de la librera SERIE.Cabrir_puerto_serie() cerrar_puerto_serie

TX RX DTR

enviar_car() Control DTR Configuracin velocidad dtr_on() dtr_off baudios() accion_rxcar()

UART

vaciar_buffer BUFFER DE RECEPCION SEAL BREAK ok_break() wait_break leer_car() leer_car_plazo() car_waiting

Rutina de interrupcin

Accin al recibir carcter Accin al recibir BREAK

accion_break()

Figura 14: Estructura de las rutinas de manejo del puerto serie. LIBRERIA SERIE.C El grueso de la librera lo forma la rutina de atencin a las interrupciones. Cada vez que se abre un puerto serie con la funcin abrir_puerto_serie() se instala la rutina de servicio de interrupcin de las interrupciones de la UART. Esta rutina se va ejecutar cada vez que se reciba un carcter por el puerto serie o una seal de BREAK. Cuando se recibe un carcter lo primero que se hace es llamar a la rutina accion_rxcar() que debe ser definida por el usuario. En esta rutina el usuario programa lo que quiere que ocurra cara vez que se ha recibido un carcter. Por ejemplo en el programa MCBOOT 2.0 cada vez que se recibe un carcter se gira un palito situado en la esquina superior derecha de la pantalla. Si el usuario no quiere realizar ninguna accin especial al recibirse un carcter simplemente deber declarar la funcin accion_rxcar() y dejarla en blando: void accion_rxcar() { } Despus de ejecutarse est rutina se procede a meter el carcter recibido en el buffer de recepcin. El tamao por defecto de este buffer es de 512 bytes. Si el buffer se llenase todos los caracteres recibidos despus de que se hubiese llenado seran perdidos. Al recibirse una seal de BREAK lo primero que se hace es ejecutar la rutina de usuario accion_break(). En ella el usuario puede especificar lo que quiere que su programa realiza en cuanto se reciba una seal de BREAK. En el MCBOOT 3.0 cada vez que se recibe alguna seal de este tipo se muestran unos dibujitos en la esquina superior derecha de la pantalla. Despus de ejecutar accion_break() se modifica una variable interna para sealizar que se ha detectado BREAK. Las rutinas accion_rxcar() y accion_break() son definibles por el usuario y son totalmente opcionales. Si el usuario dejase estar rutinas en blanco no pasara nada. Todo funcionara sin problemas. Si el usuario quiere utilizar estas funciones debe tener en cuenta lo siguiente: Estas funciones son llamadas desde dentro de la rutina de atencin a la interrupcin. Por ello estas rutinas deben ser lo ms cortas y simples posibles. No se puede acceder a servicios de DOS en estas funciones: Si desde dentro de una rutina de atencin a una interrupcin se llama a algn servicio del DOS el programa se colgar. Conviene dejar claro que mcuhas de las funciones del compilador de Turbo C acceden a servicios del dos, como por ejemplo: printf, scanf... Por ello estas funciones no se pueden usar.

30

Control de la CT6811 desde el PC

Lo normal es utilizar las rutinas accion_rxcar() y accion_break() para actualizar alguna variable o escribir directamente en la memoria de pantalla para generar algn tipo de animacin (Como la animacin del MCBOOT de los palitos giratorios). En el apartado 6.4 se muestran ejemplos de utilizacin de la libreria SERIE.C y ejemplos de las funciones accion_rxcar() y accion_break(). 6.4.- MANEJO DE LA LIBRERIA SERIE.C En este apartado se pretenden dar ejemplos de la utilizacin de la librera SERIE.C. Se van a ir realizando distintos terminales de comunicaciones, cada uno con una pequea diferencia. Para que funcionen los ejemplos mostrados es necesario crear un PROYECT en el que se incluya la libreria SERIE.C junto con el ejemplo concreto. 6.4.1.- Ejemplo 1: Un pequeo terminal de comunicaciones El siguiente programa se trata de un terminal de comunicaciones. Todo lo que se teclee se enva por el puerto serie y todo lo que se reciba por el puerto serie se imprime en pantalla./* +--------------------------------------------------------------------------+ TERMINAL.C (c) GRUPO J&J. Julio 1997. -------------------------------------------------------------------------- Ejemplo de manejo de las rutinas de comunicaciones serie. El programa hace de terminal de comunicaciones. Todo lo que se lee del teclado se envia por el puerto serie y todo lo que se lee del puerto serie se imprime en pantalla +--------------------------------------------------------------------------+ */ #include "serie.h" #include "conio.h" #include "stdio.h" #define ESC 27

/* +----------------------------------------------------------------------+ No se realiza ninguna accin especial al recibir un caracter o de- tectar una seal de BREAK. +----------------------------------------------------------------------+*/ void accion_rxcar() { } void accion_break() { } main() { char c; char d; clrscr(); printf ("Terminal de comunicaciones. Pulse ESC para terminar\n\n"); abrir_puerto_serie(COM2); baudios(7680); do { if (kbhit()) { c=getch(); enviar_car(c); } if (car_waiting()) { /* Abrir sesion con puerto serie COM2 */

/* Si se ha pulsado una tecla ... /* Leer tecla pulsada /* Enviar la tecla por el puerto serie /* Si llega caracter por puerto serie

*/ */ */ */

31

Control de la CT6811 desde el PC

} }while (c!=ESC);

d=leer_car(); printf ("%c",d);

/* leer caracter que llega /* Imprimirlo por la pantalla /* Cuando se pulsa ESC se termina /* Cerrar la sesin con el COM2 */

*/ */ */

}

cerrar_puerto_serie(); return 0;

Lo importante de este programa es ver cmo se utilizan las rutinas de comunicaciones serie. Lo primero que se hace es abrir el puerto COM2 que va a ser el puerto de trabajo. Si se quiere utilizar el puerto COM1 habr que definirse una constante llamada COM1 con el valor 1 y llamar a abrir_puerto_serie con el parmetro COM1. Una vez abierto se establece la velocidad a 7680 baudios, que es la velocidad a la que se configura el 68HC11 al arrancar en modo Bootstrap. Para enviar caracteres a la CT6811 se utiliza la rutina enviar_car. Para detectar si ha llegado algn carcter proveniente de la CT6811 se utiliza la funcin car_waiting() que devuelve 1 cuando ha llegado algn carcter por el puerto serie y se ha introducido en el buffer de recepcin. Los caracteres contenidos en el buffer son ledos mediante la funcin leer_car(). Finalmente se cierra el puerto serie con la funcin cerrar_puerto_serie(). 6.4.2.- Ejemplo 2: Utilizacin de accion_rxcar y accion_break; El siguiente programa es exactamente igual que el anterior pero con la diferencia de que se implementan las rutinas accion_break y accion_rxcar para realizar acciones especiales. Cada vez que se recibe un carcter se hace girar un palito situado en la esquina superior derecha de la pantalla. Cada vez que se recibe una seal de BREAK se dibuja un caracter al lado del palito./* +--------------------------------------------------------------------------+ TERM2.C (c) GRUPO J&J. Julio 1997. -------------------------------------------------------------------------- Ejemplo de manejo de las rutinas de comunicaciones serie. El programa hace de terminal de comunicaciones. Se han implementado las funciones accion_break y accion_rxcar para realizar acciones al re- cibir una seal de BREAK y al recibir un caracter por el puerto serie. +--------------------------------------------------------------------------+ */ #include "serie.h" #include "stdio.h" #include "conio.h" #define ESC 27

/* Puntero para acceder directamente a la memoria de Video */ char far *punt = (char far *) 0xb800009A; void accion_break() /* +----------------------------------------------------------------------+ Cada vez que se recibe un BREAK se escribe un caracter en la esqui- na superior derecha de la pantalla. +----------------------------------------------------------------------+*/ { static char faseb[4] = {2,1,'o','.'}; static char pfb = 0; *(punt+4)=faseb[pfb]; pfb=(pfb+1) % 4; } void accion_rxcar() /* +----------------------------------------------------------------------+ Cada vez que se recibe un carcter se hace girar un 'palito' situado en la esquina superior derecha de la pantalla. +----------------------------------------------------------------------+*/ { static char fase[4] = {'-','\\','||','/'};

32

Control de la CT6811 desde el PC

static char pf1 = 0; *(punt+4)=' '; *punt=fase[pf1]; pf1= (pf1 + 1) % 4;

}

main() { char c; char d; clrscr(); printf ("Terminal de comunicaciones. Pulse ESC para terminar\n\n"); abrir_puerto_serie(COM2); baudios(7680); do { if (kbhit()) { c=getch(); enviar_car(c); } if (car_waiting()) { d=leer_car(); printf ("%c",d); } }while (c!=ESC); cerrar_puerto_serie(); return 0; /* Abrir sesion con puerto serie COM2 */

/* Si se ha pulsado una tecla ... /* Leer tecla pulsada /* Enviar la tecla por el puerto serie /* Si llega caracter por puerto serie /* leer caracter que llega /* Imprimirlo por la pantalla /* Cuando se pulsa ESC se termina /* Cerrar la sesin con el COM2 */

*/ */ */ */ */ */ */

}

Obsrvese que las dos funciones accion_rxcar() y accion_break() son muy cortas y en ninguna se realizan llamadas a los servicios del DOS. En ellas simplemente hay asignaciones de variables. Para escribir caracteres en pantalla se accede directamente a la memoria de video. 6.4.3.- Ejemplo 3: Terminal de comunicaciones con TIMEOUT El programa TERM3.C es igual que el programa TERMINAL.C del primero ejemplo pero los caracteres procedentes del puerto serie no se leen con la funcin leer_car() sino que se leen con la funcin leer_car_plazo(). Si no se recibe ningn carcter dentro del plazo establecido por la constante TIEMPO se imprime en pantalla el carcter T indicando que se ha producido TIMEOUT. La mejor forma de probar este programa es cargado con el Downmcu el programa SCITEMP.S19. Este programa envia un mensaje cada 3 segundos aproximadamente./* +--------------------------------------------------------------------------+ TERM3.C (c) GRUPO J&J. Julio 1997. -------------------------------------------------------------------------- Ejemplo de manejo de las rutinas de comunicaciones serie. El programa hace de terminal de comunicaciones. Se establece un periodo de tiempo para recibir un carcter. Si no se recibe nada dentro de ese plazo se imprime en pantalla el caracter 'T'indicando TIEMOUT. Para probar este terminal lo mejor es cargar en la CT6811 primero el programa SCITEMP.ASM que emite un mensaje cada 3 segundos aprox. Cuando se reciben los caracteres del mensaje, como entran dentro del plazo establecido se imprimen. Entre mensaje y mensaje, como no se recibe nada dentro del plazo establecido se imprime una 'T' +--------------------------------------------------------------------------+ */ #include "serie.h" #include "stdio.h" #include "conio.h" #define ESC 27 /* Plazo de tiempo */

#define TIEMPO 5

33

Control de la CT6811 desde el PC

/* +----------------------------------------------------------------------+ No se realiza ninguna accin especial al recibir un caracter o de- tectar una seal de BREAK. +----------------------------------------------------------------------+*/ void accion_rxcar() { } void accion_break() { } main() { char c; char d; int timeout; clrscr(); printf ("Terminal de comunicaciones. Pulse ESC para terminar\n\n"); abrir_puerto_serie(COM2); baudios(7680); do { if (kbhit()) { c=getch(); enviar_car(c); } /* Abrir sesion con puerto serie COM2 */

/* Si se ha pulsado una tecla ... /* Leer tecla pulsada /* Enviar la tecla por el puerto serie

*/ */ */

d=leer_car_plazo(TIEMPO,&timeout); /* Leer un carcter con plazo de */ /* tiempo. */ if (timeout) printf ("T"); /* Si no se recibe nada dentro del plazo */ else /* se imprime el carcter 'T' */ printf("%c",d); }while (c!=ESC); cerrar_puerto_serie(); return 0; /* Cuando se pulsa ESC se termina /* Cerrar la sesin con el COM2 */ */

}

6.4.4.- Ejemplo 4: Terminal con RESET Con este ejemplo se pretende mostrar cmo es posible realizar un reset de la tarjeta CT6811. El programa TERM4.C es un terminal de comunicaciones como los anteriores con la salvedad de que al apretar la tecla R (maysculas) se realiza un RESET de la tarjeta CT6811. Obsrvece que cada vez que se realiza un reset se recibe una seal de BREAK de la CT6811 y por tanto se puede ver cmo se escriben unos caracteres en la esquina superior derecha de la pantalla./* +--------------------------------------------------------------------------+ TERM4.C (c) GRUPO J&J. Julio 1997. -------------------------------------------------------------------------- Ejemplo de manejo de las rutinas de comunicaciones serie. El programa hace de terminal de comunicaciones. Cada vez que se pulsa la tecla 'R' se realiza un reset de la CT6811. +--------------------------------------------------------------------------+ */ #include #include #include #include "serie.h" "stdio.h" "conio.h" "dos.h" 27

#define ESC

34

Control de la CT6811 desde el PC

/* Puntero para acceder directamente a la memoria de Video */ char far *punt = (char far *) 0xb800009A; void accion_break() /* +----------------------------------------------------------------------+ Cada vez que se recibe un BREAK se escribe un caracter en la esqui- na superior derecha de la pantalla. +----------------------------------------------------------------------+*/ { static char faseb[4] = {2,1,'o','.'}; static char pfb = 0; *(punt+4)=faseb[pfb]; pfb=(pfb+1) % 4; } void accion_rxcar() /* +----------------------------------------------------------------------+ Cada vez que se recibe un carcter se hace girar un 'palito' situado en la esquina superior derecha de la pantalla. +----------------------------------------------------------------------+*/ { static char fase[4] = {'-','\\','||','/'}; static char pf1 = 0; *(punt+4)=' '; *punt=fase[pf1]; pf1= (pf1 + 1) % 4;

}

void reset(void) /* +---------------------------------+ Realizar un RESET de la CT6811 +---------------------------------+*/ { dtr_on(); delay(200); dtr_off(); } main() { char c; char d; clrscr(); printf ("Pequeo terminal de comunicaciones. Pulse ESC para terminar\n\n"); abrir_puerto_serie(COM2); baudios(7680); do { if (kbhit()) { c=getch(); enviar_car(c); if (c=='R') reset(); } if (car_waiting()) { d=leer_car(); printf ("%c",d); } }while (c!=ESC); cerrar_puerto_serie(); return 0; /* Abrir sesion con puerto serie COM2 */

/* /* /* /*

Si se ha pulsado una tecla ... Leer tecla pulsada Enviar la tecla por el puerto serie Si tecla 'R' se hace un reset

*/ */ */ */ */ */ */ */

/* Si llega caracter por puerto serie /* leer caracter que llega /* Imprimirlo por la pantalla /* Cuando se pulsa ESC se termina /* Cerrar la sesin con el COM2 */

}

35

Control de la CT6811 desde el PC

La rutina reset() mantiene la seal DTR activada durante 200ms y luego se desactiva. Esto provoca que la seal de reset del 68HC11 se mantenga a nivel bajo durante ese tiempo con lo que se inicializa. Al volver a colocar el DTR a estado de off el 68HC11 queda listo para funcionar. 6.4.5.- Ejemplo 5: Autodeteccin de la tarjeta CT6811 El programa CTDETECT.C escanea los puertos COM1 y COM2 en busca de la tarjeta CT6811. El criterio para detectar la CT6811 es muy simple. Se realiza un reset y se espera a que se reciba una seal de BREAK. Si cada vez que se hace el reset se recibe el BREAK es que la tarjeta CT6811 se encuentra conectada a ese puerto. (Ojo! La tarjeta CT6811 debe estar configurada en modo BOOTSTRAP o de lo contrario no se detectar)./* +--------------------------------------------------------------------------+ CTDETECT.C (c) GRUPO J&J. Julio 1997. -------------------------------------------------------------------------- Programa para detectar el puerto en el que se encuentra la tarjeta CT6811 Para ello se exploran los puerto COM1 y COM2. La exploracin consiste en hacer reset hasta que se detecte que se reciben seales de BREAK. +--------------------------------------------------------------------------+ */ #include "serie.h" #include "stdio.h" #include "dos.h" /* +----------------------------------------------------------------------+ No se realiza ninguna accion especial al recibir un caracter o una seal de BREAK. +----------------------------------------------------------------------+*/ void accion_rxcar() { } void accion_break() { } void reset() /* +-----------------------------------------+ Realizar un RESET de la tarjeta CT6811 seal de BREAK. +-----------------------------------------+*/ { dtr_on(); delay(300); dtr_off(); } main() { int puerto; int ok=0,nok=0; int intento; printf ("Autodeteccin de la tarjeta CT6811\n\n"); /* Bucle de exploracin: COM1 y COM2 */ for (puerto=1; puertotype ledpe.s19 S119B600B610008840B7100018CE80001809188C000026F820EA88 S9030000FC C:\6811\CT6811>_

41

Figura 17: Los ficheros LEDP.S19 y LEDPE.S19

Control de la CT6811 desde el PC

Ambos programas estn constituidos nicamente por dos registros. En las siguientes tablas se muestran los registros descompuestos en campos: Programa LEDP.S19 TipoS1 S9

Tamao19 03

Direccin0000 0000

Cdigo/DatosB610008840B7100018CEFFFF1809188C000026F820EA ---------------------------------------------------------------

ChecksumC0 FC

Programa LEDPE.S19 TipoS1 S9

Tamao19 03

DireccinB600 0000

Cdigo/DatosB610008840B7100018CE80001809188C000026F820EA ---------------------------------------------------------------

Checksum88 FC

En la figura 18 se muestra el programa SCIHOLA.S19 que contiene 3 registros:C:\6811\CT6811>type scihola.s19 S1230000CE10008D0818CE00298D1020F61F2E10FCA62F391F2E80FCA72F3918A600810029 S11E002027068DF0180820F339486F6C6120636F6D6F2065737461732E2E00BD S9030000FC

Dividiendo en campos:Checksum 29 BD FC

Tipo Tamao Direccin Cdigo/Datos C:\6811\CT6811>_ S1 23 0000 CE10008D0818CE00298D1020F61F2E10FCA62F391F2E80FCA72F3918A6008100 Figura 18: El 0020 fichero SCIHOLA.S19 S1 1E 27068DF0180820F339486F6C6120636F6D6F2065737461732E2E00 S9 03 0000 ---------------------------------------------------------------

3.- LIBRERIA S19.C PARA LA GESTION DE ARCHIVOS .S193.1.- INTRODUCCION El objetivo de esta libreria es el de poder leer fcilmente los diferentes campos de los registros que componen los archivos en formato S19. Esta librera junto con la librera de comunicaciones serie permite que se puedan leer archivos .S19 y que se puedan enviar a travs del puerto serie a la CT6811. El manejo de estas libreras pretende ser lo ms simple posible. Los archivos S19 se van a tratar como tipos abstractos de datos. En la librera existen una serie de funciones que nos permiten trabajar con este tipo de datos: abrir ficheros en formato S19, leer los diferentes campos etc... 3.2.- EL INTERFAZ DE LA LIBRERIA S19.C Antes de trabajar con un fichero S19 habr que abrirlo utilizando la funcin abrir_s19(). Con las funciones leerdir_s19() y leercod_s19() se pueden leer los campos de direccin y codigo/datos de cualquier registro. Con getnregs19() se obtiene el nmero de registros totales que componen el archivo S19 especificado y con getnbytes19() el nmero de bytes que ocupan todos los campos de cdigo/datos. Una vez se ha terminado de trabajar con el archivo S19 habr que cerrarlo con cerrar_s19(). En todas las funciones se trabaja con un tipo abstracto de datos llamado S19 que se encuentra definido en el fichero S19.H. int abrir_s19(char *fich,S19 *ss19,int modo); 42

Control de la CT6811 desde el PC

Esta funcin se utiliza para abrir un fichero en formato S19 con el que trabajar. Los parmetros de entrada son los siguiente: fich : Nombre del fichero en formato S19. Si se especifica sin extensin por defecto se toma la extensin .S19. Se puede especificar la ruta completa del fichero. ss19: Variable del tipo S19 que va a ser modificada por la rutina. Si la apertura es correcta esta variable contendr toda la informacin del archivo abierto. modo: Modo de apertura del fichero .S19. Existen dos modos 0 y 1. En el modo 1 se comprueba el checksum de todos los registros del fichero.Si alguno es incorrecto se devolver un error.. En el modo 0 no se comprueba el checksum. La funcin devuelve 0 si no ha podido abrir el fichero por existir algn error. En caso de xito se devuelve un 1. A continuacin se muestra un pequeo ejemplo de uso:S19 f; /* Declarar variable del tipo abstracto S19 */

if (abrir_s19(LEDP,&f,1)==0) { printf (Error al abrir el archivo especificado\n); exit(0); }

En este ejemplo se abre el archivo LEDP.S19 en el modo 1. Si se produce un error se imprime un mensaje en pantalla. En caso contrario el archivo LEDP.S19 es ledo y la informacin depositada en la variable f del tipo S19. void cerrar_s19(S19 ss19);

Dejar de trabajar con el archivo S19 especificado. En el siguiente ejemplo se abre un fichero y luego se cierra:/* Declarar variable del tipo S19 */

S19 f;

abrir_s19(LEDP,&f,0); /* Abrir fichero LEDP.S19 en el modo 0 */ ... ... /* Trabajar con archivo */ ... cerrar_s19(f); /* Cerrar el archivo antes abierto */ int leerdir_s19(S19 ss19,int nreg, unsigned int *dir);

Leer el campo direccin del fichero especificado. Con el parmetro nreg se especifica el nmero de registro al que se quiere acceder. En dir se devuelve el campo direccin.S19 f; unsigned int dir; abrir_s19(LEDP,&f,1); leerdir_s19(f,1,&dir); cerrar_s19(f); /* Abrir fichero S19 */ /* Leer campo direccin del primer registro */

int leercod_s19(S19 ss19,int nreg, unsigned short int *cod, unsigned short int *tam);

Leer el campo codigo/datos del registro especificado. Tambin se devuelve el tamao de este campo.S19 f; unsigned int tam; unsigned short int codigo[4); abrir_s19(LEDP,&f,1); leercod_s19(f,1,codigo,&tam); cerrar_s19(f);

unsigned int getnbytes19(S19 ss19);

Devolver el nmero de bytes de todo el cdigo del fichero S19

especificado.unsigned int getnregs19(S19 ss19); char *geterrors19();

Devolver el nmero de registros del fichero S19 especificado.

Devolver la cadena del error producido en la ltima apertura del fichero S19. Esta funcin se usa para la presentacin en pantalla de los errores.

43

Control de la CT6811 desde el PC

3.3.- IMPLEMENTACION 3.3.1.- El tipo S19 El tipo S19 se utiliza para representar los archivos del tipo S19. Est constituido internamente por una estructura con tres campos: el nmero de bytes del codigo/datos del archivo, el nmero de registros del tipo 1 que lo forman y un puntero a la cabeza de una lista que contiene los diferentes registros. En la figura 19 se muestra la estrutura interna del tipo S19.N de Bytes N de registros Lista registros Tamao campo codigo/datos Campo direccin Codigo/datos Siguiente registro REGISTRO 1 Tamao campo codigo/datos Campo direccin Codigo/datos Siguiente registro REGISTRO 2 Tamao campo codigo/datos Campo direccin Codigo/datos Siguiente registro REGISTRO N

Figura 19: Estructura interna del tipo S19 Cada registro est constituido por otra estructura con 4 campos: el tamao del campo codigo/datos, el campo de direccin el campo de cdigo/datos y un puntero al siguiente registro. Todos los registros se encuentran formando una lista encadenada. Al llamar a la funcin abrir_s19() lo que se hace es leer el archivo .S19 especificado y crear la estructura de la figura 19 con los datos del fichero S19. Las dems funciones de la librera S19.C lo nico que hacen es moverse por los diferentes nodos de la lista encadenada y devolver los datos solicitados. 3.3.2.- Rutinas de conversin de datos utilizadas: Libreria ASCBIN.C. Los ficheros S19 se encuentran codificados en ASCII. Por ello es necesario disponer de una serie de funciones que realicen la conversin de ASCII a su correspondiente valor binario (de 1 2 bytes). En la librera ASCBIN.C se encuentran las rutinas que realizan estas conversiones y las inversas. Antes de describir las funciones de la librera ASCBIN.C se va a aclarar la notacin Los digitos en ASCII se les asigna el tipo CHARX siendo X el nmero de digitos ASCII. As por ejemplo el tipo CHAR1 est constituido por los caracteres ASCII 1,2,...,A...F. El tipo CHAR2 est formado por cadenas de 2 dgitos ASCII: 3F, 12, AB.... Del tipo CHAR4 son las siguientes cadenas: FFFF, 1000, 0000, 12DE.... Finalmente BYTE se refiere a nmero comprendidos entre 0-255, es decir, nmero que se representan mediante 2 dgitos hexadecimales y el tipo INT se refiere a nmeros comprendidos entre 0-65525, que son representables mediante 4 dgitos hexadecimales. Las funciones de la librera ASCBIN.C realizan conversiones entre estos tipos. Todas las funciones son enteras y devuelve 0 si no se puede realizar la conversin y 1 si se ha realizado correctamente. int char1tobyte(char car,unsigned short int *dec); Convertir un dgito ASCII hexadecimal en su nmero correspondiente (entre 0-15). Ej. unsigned short int x; char1tobyte(A,&x); Se devolvera el valor 10 en x. int char2tobyte(char *cad,unsigned short int *dec); Convertir una cadena de 2 digitos ASCII hexadecimales en su correspondiente valor entre 0-255. Ej. unsigned short int x; char2tobyte(FF,&x);

44

Control de la CT6811 desde el PC

Se devolvera el valor 255 en x. int char4toint(char *cad,unsigned int *dec); Convertir una cadena de 4 digitos ASCII hexadecimales en su correspondiente valor entre 0-65535. Ej. unsigned int x; char4toint(123C,&x); Devolvera en x el nmero 4668 (que es la representacin decimal de 0x123C). int bytetochar1(unsigned short int byte, char *car); Convertir un nmero entre 0-15 a su correspondiente dgito ASCII hexadecimal correspondiente. Ej. char cad[2]; bytetochar1(12,cad); Se devuelve la cadena 12 en cad. int bytetochar2(short num, char *cad); Convertir un numero entre 0-255 a su correspondiente cadena de digitos ASCII hexadecimales. Ej. char cad[3]; bytetochar2(127,cad); Se devuelve en cad la cadena 7F. int inttochar4(long num, char *cad); Convertir un nmero entre 0-65535 en la cadena con digitos ASCII hexadecimales. Ej. char cad[5]; inttochar4(14563,cad); Se devuelve en cad la cadena 38E3. 3.4.- EJEMPLOS DE UTILIZACION DE LA LIBRERIA S19.C Los ejemplos presentados a continuacin para ser probados deben ser incluidos en un PROYECT en el que se encuentren las libreras ASCBIN.C y S19.C. 3.4.1.- Ejemplo 1: Programa leers19.C Este programa abre un archivo .S19 y devuelve una serie de datos: nmero de bytes, nmero de registros que lo componen y situacin del programa en el mapa de memoria. Para saber si se trata de un programa para la RAM interna, EEPROM o ram externa simplemente se examina el campo direccin del primer registro. Segn la direccin se toma una decisin u otra./* +--------------------------------------------------------------------------+ LEERS19 (c) GRUPO J&J. Julio 1997. -------------------------------------------------------------------------- Ejemplo de utilizacion de la libreria S19.C. Este programa lee un archivo en formato .S19 y devuelve el numero de bytes que ocupa el cdigo, el numero de registros del tipo 1 y la direc- cin de comienzo del codigo/datos. +--------------------------------------------------------------------------+ */

45

Control de la CT6811 desde el PC

#include "stdio.h" /* ---- Librerias del Grupo J&J ---- */ #include "s19.h" main() { S19 mi_s19; char cad[80]; char *caderror; unsigned int dir;

/* /* /* /*

Fichero S19 Nombre del fichero Cadena de error Direccin comienzo

*/ */ */ */

/* ------------------------------- */ /* ---- ABRIR EL FICHERO S19 ----- */ /* --------------------------------*/ printf ("\nNombre fichero: "); gets(cad); if (abrir_s19(cad,&mi_s19,1)==0) { /* Si se ha producido un error */ caderror=geterrors19(); /* Leer la cadena de error */ printf ("Error: %s\n",caderror); /* Imprimir mensaje de error */ return 0; } printf ("\n"); /* -------------------------------------------- */ /* ---- MOSTRAR LA INFORMACION DEL FICHERO ---- */ /* -------------------------------------------- */ printf ("Numero de registros : %u\n",getnregs19(mi_s19)); printf ("Tamao en Bytes : %u\n",getnbytes19(mi_s19)); leerdir_s19(mi_s19,1,&dir); /* Leer direccin del primer registro */ printf ("Direccin de comienzo: %X\n",dir); printf ("Situacin programa : "); if (dir Leer otro dato STAR JMP $0000 ; Ejecutar el programa cargado

; +------------------------------------------------------------------------+ ; VECTORES DE INTERRUPCION DEL MODO BOOTSTRAP ; +------------------------------------------------------------------------+ ORG $BFD4 FDB FDB FDB FDB FDB FDB $00C4 $00C7 $00CA $00CD $00D0 $00D3 ; ; ; ; ; ; SCI SPI Flanco subido en acumulador de pulsos Desbordamiento en acumulador de pulsos Desbordamiento del temporizador Comparador 5

53

Control de la CT6811 desde el PC

FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB FDB END

$00D6 $00D9 $00DC $00DF $00E2 $00E5 $00E8 $00EB $00EE $00F1 $00F4 $00F7 $00FA $00FD #begin

; ; ; ; ; ; ; ; ; ; ; ; ; ; ;

Comparador 4 Comparador 3 Comparador 2 Comparador 1 Capturador 3 Capturador 2 Capturador 1 Interrupcin de tiempo real IRQ XIRQ SWI Cdigo de instruccin ilegal Fallo en el sistema COP Monitor del reloj Reset

4.4.- CARGA DE PROGRAMAS EN LA RAM INTERNA

PROGRAMA EN EL PC

Esperar BREAK

En la figura 22 se muestra el diagrama de flujo que debe seguir el programa de carga para la RAM interna. Se utiliza la velocidad de 7680 Baudios. El programa debe esperar a que se reciba la seal de BREAK En la libreria SERIE.C existe la funcin wait_break que espera a que se reciba esta seal. Despus se enva el carcter $FF para dejar configurado el 68HC11 para trabajar a la velocidad de 7812 Baudios. Mediante la librera S19.C se lee el archivo .S19 que se quiere enviar a la RAM interna. Habr que enviar secuencialmente los bytes de los campos de cdigo del archivo S19. Finalmente si el programa ocupa menos de 256 bytes habr que completar hasta esa cantidad enviado un byte cualquiera, por ejemplo el byte 0.

Enviar $FF

Bucle i=1 hasta 256

Enviar byte i

Esperar byte i

Eco diferente? NO NO

SI

ERROR

i =256?

SI Programa cargado

Figura 22: Diagrama de flujo para la carga de programas en la RAM interna

54

Control de la CT6811 desde el PC

5.- LIBRERIA BOOTSTP.C PARA CARGA DE PROGRAMAS EN LA RAM INTERNA5.1.- INTRODUCCION La librera BOOTSTRP.C permite al usuario dialogar con el 68HC11 a travs del protocolo implementado en el programa Bootstrap. Las funciones de esta librera van a permitir cargar programas en la RAM interna, saltar a la memoria eeprom, saltar a la memoria RAM y realizar un reset de la tarjeta CT6811. Con esta librera se cierra la etapa de programacin a bajo de nivel de la tarjeta CT6811. Una vez que es posible cargar programas en la CT6811, se pueden enviar programas servidores y en el PC se ejecutan los clientes. Desde el punto de vista software es posible ver la CT6811 como una abstraccin y no hace falta conocer sus detalles internos. 5.2.- INTERFAZ Para manejar todas las siguientes funciones el puerto serie DEBE ESTAR ABIERTO por medio de la funcin abrir_puerto_serie() de la libreria SERIE.C. void resetct6811(); Funcin para realizar un reset de la tarjeta CT6811. int okreset(); Hacer un reset de la CT6811. La funcion devuelve 0 si se ha hecho el reset correctamente (se ha recibido la seal de BREAK). Se devuelve 0 si no se recibe el BREAK. int jump_eeprom(); Funcin para saltar al comienzo de la memoria EEPROM. Primero se realiza un reset y luego se enva en cdigo necesario para que el 68HC11 salta a la memoria EEPROM. La funcin devuelve 1 si se ha recibido el BREAK y por tanto se ha saltado a la EEPROM. Devuelve 0 en caso contrario. int jump_ram(); Funcin para saltar al comienzo de la memoria RAM. Primero se realiza un reset y despus se enva el codigo necesario para saltar a la RAM. Es responsabilidad del usuario que en la RAM del 68HC11 exista previamente algo cargado. La funcin devuelve 0 en caso de no recibirse la seal de BREAK al realizar el reset. 1 Si ha saltado correctamente a la RAM. int cargar_ramint(byte *ramint, void (*car)()); Funcin para cargar un programa en la ram interna de la tarjeta CT6811. Los 256 bytes del programa se toman de la matriz ramint. Cada vez que se ha enviado un byte a la CT6811 se llama a la funcin car que se pasa como parmetro. Esto permite que el usuario defina lo que quiera en esa funcin, como por ejemplo imprimir en pantalla algn tipo de carcter o calcular los porcentajes que quedan para terminar de cargar el programa. int cargars19_ramint(S19 fs19, void (*car)()); Funcin para cargar un fichero .S19 en la ram interna de la CT6811. El archivo .S19 debe estar previamente abierto llamando a la funcin abrir_s19(). Cada vez que se ha enviado un byte a la CT6811 se ejecuta la funcin car para que el usuario implemente alguna accin. char *getloaderror(); Devolver la cadena de error del ltimo error producido al llamar a la funcin cargar_ramint() o cargars19_ramint(). 5.3.- IMPLEMENTACION La funcin ms importante es cargar_ramint(). Esta funcin va recorriendo la matriz del programa y va enviando los bytes. Los bytes se envan con un timeout de tal forma que si ha transcurrido el tiempo especificado y no se ha recibido eco se sealiza error. Por cada byte enviado se espera recibir un eco igual. Si el eco es distinto es que se ha producido un error en la transmisin. La funcin cargars19_ramint() comprueba si el programa S19 especificado es para la RAM interna. Si no es as se produce un error. Despus se introduce el archivo S19 en una matriz de datos, utilizando la funcin s19toramint() de la librera S19UTIL.C y finalmente se llama a la funcin cargar_ramint().

55

Control de la CT6811 desde el PC

5.4.- DEPENDENCIAS DE LA LIBRERIA BOOTSTRP.C En la figura 23 se muestran las libreras de las que dependen la librera BOOTSTRP.C. Por ello si que realiza un programa que utilice la librera BOOTSTRP.C ser necesario incluir en el PROYECT todas las libreras mostradas en la figura 23: SERIE.C, ASCBIN.C, S19.C, S19UTIL.C y BOOTSTRP.C.SERIE.C ASCBIN.C

S19.C

5.5.- EJEMPLOS 5.5.1.- Ejemplo 1: Programa LEDP.C

S19UTIL.C

Este programa carga directamente en la TARJETA CT6811 el programa del ledp parpadeante, que no se encuentra en un archivo .S19 sino que se BOOTSTRP.C encuentra insertado dentro del propio cdigo en C. Para ello se ha utilzado el programa S19TOC.EXE que se ha Figura 23: Libreras de las que depende la desarrollado con las librerias S19.C y S19UTIL.C. librera BOOTSTRP.C/* +--------------------------------------------------------------------------+ LEDP.C (c) GRUPO J&J. Agosto 1997. -------------------------------------------------------------------------- Ejemplo de prueba de la libreria BOOTSTRP.C. Se carga en la CT6811 un programa que hace parpadear el LED. Este programa no se toma de un archivo .S19 sino que se encuentra dentro del propio cdigo. +--------------------------------------------------------------------------+ */ #include "stdio.h" #include "serie.h" #include "bootstrp.h" int i; void accion_rxcar() { } void accion_break() { } void prueba() { static int n=0; static int p=0; if (n==24) { n=0; p+=10; printf ("%3u%%\b\b\b\b",p); } n++; i++;

}

main() { /* Matriz que contiene el programa a enviar a la CT6811 */ unsigned short int programint[256]={ 0xB6,0x10,0x00,0x88,0x40,0xB7,0x10,0x00,0x18,0xCE,0x5F,0xFF,0x18,0x09,0x18, 0x8C,0x00,0x00,0x26,0xF8,0x20,0xEA,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

56

Control de la CT6811 desde el PC

0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,}; abrir_puerto_serie(COM2); /* Abrir sesion con puerto serie COM2 */

printf ("\nCargando programa: "); i=1; if (cargar_ramint(programint,prueba)==0) { printf ("\nError: %s",getloaderror()); cerrar_puerto_serie(); return 0; }; printf ("\nOK!\n"); cerrar_puerto_serie(); return 0; /* Cerrar la sesin con el COM2 */

} 5.5.2.- Ejemplo 2: Programa RAMINT.C Este programa carga el programa LEDP.S19 en la RAM INTERNA de la tarjeta CT6811. Es una versin cutre del conocido programa DOWNMCU./* +--------------------------------------------------------------------------+ RAMINT.C (c) GRUPO J&J. Agosto 1997. -------------------------------------------------------------------------- Versin 1.0. Ejemplo de prueba de la libreria BOOTSTRP.C. Se carga en la ram interna de la CT6811 el fichero LEDP.S19. +--------------------------------------------------------------------------+ */ #include "stdio.h" #include "serie.h" #include "bootstrp.h" typedef unsigned short int byte; typedef unsigned int uint; int i=0; int n=0; void accion_rxcar() { } void accion_break() { } void carga() {

57

Control de la CT6811 desde el PC

if (n==16 || i==255) { n=0; printf ("_"); } i++; n++;

}

main() { char cad[80]; char *caderror; S19 fs19; if (abrir_s19("ledp.s19",&fs19,1)==0) { caderror=(char *)geterrors19(); printf ("Error: %s\n",caderror); return 0; } printf ("\n"); abrir_puerto_serie(COM2); printf ("0% 50% 100%\n"); printf ("________________\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b\b"); if (cargars19_ramint(fs19,carga)==0) { printf ("\nError: %s",getloaderror()); } else { printf (" OK!!\n\n"); } cerrar_s19(fs19); cerrar_puerto_serie(); } return 0;

6.- CONCLUSIONESA partir de este captulo el lector debe ser capaz de comunicarse perfectamente con la CT6811 as como cargar cualquier programa en la