Robots Móviles
Software y documentación para robots móviles

Conexión MC68HC11 y HP-48

En esta página se ofrecen unos programas y comentarios para conectar sistemas basados en el microcontrolador MC68HC11 y una calculadora HP-48 a través de los puertos serie. Principalmente se explican los conceptos básicos de funcionamiento de los programas que se necesitan en los dos sistemas aunque también se proporciona un programa para la HP-48 que muestra en el display lo que le llega por el puerto serie y envía los códigos asignados a cada tecla.

Materiales

Se supone que ya se dispone de un sistema basado en MC68HC11, una calculadora HP-48 y los cables de conexión de cada uno de ellos a un puerto serie del ordenador. En el caso de la tarjeta CT6811 de Microbótica, ya se incluye un cable con conexiones telefónicas RJ11 y un conversor a DB9; para las HP-48 es bastante sencillo adquirir un cable con un terminador DB9.

Además, necesitaremos un cable que nos permita conectar ambos sistemas por los teminadores DB9 en el que se permuten las líneas de envío y recepción (lo que se conoce como modem nulo). Por tanto, se necesitarán dos terminadores DB9 macho y cable (con uno de tres hilos es suficiente).

¿Cómo hacer el cable?

Tenemos que preparar un cable que una las señales de masa de los dos conectores (pin número 5 en los DB9) e intercambie las de recepción y envío (pines 2 y 3) para que un dispositivo reciba lo que el otro está enviando y viceversa. Las conexiones quedan como se muestra en la siguiente figura.

[ Conexiones entre los conectores ]

Programación en el MC68HC11

En el lado del MC68HC11 vamos a utilizar el SCI que es el interfaz serie asíncrono que dispone este microcontrolador. Su programación es muy sencilla si se tiene algo de cuidado para no machacar los valores que se están enviando y recibiendo.

Vamos a utilizar sólamente tres registros internos del MC68HC11 para controlar la comunicación:

Estas dos rutinas envían y reciben, respectivamente, lo que esté en el acumulador A del MC68HC11. Su utilización es muy sencilla, sólo comentar que en la recepción, el flujo del programa queda detenido esperando a que se reciba un dato un por puerto serie. Si no se desea esta espera, puede utilizarse un esquema basado en interrupciones para detectar cuándo ha llegado un dato y recogerlo en ese momento.

El siguiente programa que puede obtenerse directamente desde aquí, espera la pulsación del bumper izquierdo (en el bit 0 del puerto E). Una vez que se pulsa, el programa envía la cadena HOLA por el puerto serie y se queda a la espera de los caracteres que le llegan, haciendo eco por el mismo puerto de lo que le va llegando. Se incluye el fichero wait.inc que incorpora rutinas para efectuar pausas. Esta facilidad de ficheros include sólo puede utilizarse desde el ensamblador Ras, si se utiliza otro programa ensamblador siempre puede incluirse a mano desde el editor.


* -----------------------------------------------------------------------  
* hp48c.asm			2001/04/16
*
* Prueba de las comunicaciones serie asíncronas de HC11.
*	- Envía una secuencia de caracteres por el puerto serie.
*	- Hace eco de lo que le llega por el puerto serie y hace una
*	  pausa entre cada eco.
* -----------------------------------------------------------------------

PORTA	EQU $00			; Dirección del puerto A
PORTE	EQU $0A			; Dirección del puerto E

BAUD	EQU $2B			; Registro de velocidad
SCSR	EQU $2E			; Registro de estado del SCI
SCDR	EQU $2F			; Registro de datos del SCI

	ORG $0000		; Programa en RAM interna


	LDX #$1000		; Apunta a los registros de control

	LDAA #$30		; 9600 baudios
*	LDAA #$33		; 1200 baudios
	STAA BAUD,X		; Configura la velocidad

	BSET PORTA,X $40	; Enciende el LED de la CT6811
pulsa	BRCLR PORTE,X $01 pulsa	; Espera a que se pulse el bumper izq

	LDAA #'H		; Envía la cadena "HOLA"
	BSR sendc
	LDAA #'O'
	BSR sendc
	LDAA #'L'
	BSR sendc
	LDAA #'A'
	BSR sendc

eco	BSET PORTA,X $40	; Enciende el LED de la CT6811
	BSR readc		; Lee un carácter
	BSR sendc		; Lo vuelve a enviar

	BCLR PORTA,X $40	; Apaga el LED
	BSR f_wait		; Hace un pausa

fin	BRA eco


* -----------------------------------------------------------------------
* Envía el carácter del acumulador A por el puerto serie SCI
* -----------------------------------------------------------------------

sendc	BRCLR SCSR,X $80 sendc	; Espera a que termine un envío anterior
	STAA SCDR,X		; Envía el carácter
	RTS


* -----------------------------------------------------------------------
* Lee un carácter que llega por el puerto serie SCI en el acumulador A
* -----------------------------------------------------------------------

readc	BRCLR SCSR,X $20 readc	; Espera a que se reciba un carácter
	LDAA SCDR,X		; Lee el carácter recibido
	RTS


* -----------------------------------------------------------------------
* Incluye rutinas de pausa
* -----------------------------------------------------------------------

	include wait.inc

	END

Programación en la HP-48

La programación en el lado de la HP-48 es también muy sencilla. Vamos a utilizar estas cinco llamadas relacionadas con la utilización del puerto serie:

Antes de comenzar con las pruebas es recomendable que nos aseguremos que están bien los parámetros de comunicación de la HP-48. Se podría realizar también por programa pero es bastante común determinar los parámetros mediante variables. En cualquier caso, verifíquese que la comunicación se establece a través del cable y no con infrarrojos (opción Port: Wire), en formato binario a 9600 baudios (o la velocidad que cada uno prefiera) sin paridad.

Se han utilizado ocho variables (entre datos y programas) en la HP-48. A continuación se describe para qué sirve cada una de ellas.

Puede ver el código directamente en esta página o descargar el directorio completo que incluye los fuentes para la HP-48 en modo texto o en binario. Para instalarlo en la HP-48 siga el procedimiento habitual.


* -----------------------------------------------------------------------  
  HC11
* -----------------------------------------------------------------------
    « CLLCD OPENIO RCLF -40 CF DEPTH -> Z
      «
        IFERR -1
          WHILE 1
          REPEAT
            IF BUFLEN DROP
            THEN
	      LEE
	      440 .1 BEEP
	      SWAP 1 + "0" OVER
	      ->STR + DUP SIZE DUP 1 - SWAP SUB "->" +
	      ROT + OVER 7 MOD 1 + "" OVER 1 + DISP DISP
            ELSE
              IF KEY
              THEN
	        ->CAR XMIT
		IF NOT
		THEN
		  DROP
		END
              END
            END
          END
        THEN
	  DEPTH Z - DROPN
        END
      » STOF CLOSEIO
    »


* -----------------------------------------------------------------------
  SELTI
* -----------------------------------------------------------------------
    « "TIPO DE DATOS"
      { {"Caracteres" 1 } {"Números 8 bits" 2} { "Strings" 3 } }
      TIPO
      CHOOSE
      IF 0 <>
      THEN
        CASE
	  DUP 1 ==
          THEN
            « LCHR »
          END
	  DUP 2 ==
          THEN
	    « LNUM »
          END
	  DUP 3 ==
          THEN
            « LSTR »
          END
        END 'LEE' STO 'TIPO' STO
      END
    »


* -----------------------------------------------------------------------
  TIPO
* -----------------------------------------------------------------------
    3


* -----------------------------------------------------------------------
  LEE
* -----------------------------------------------------------------------
    « LSTR »


* -----------------------------------------------------------------------
  ->CAR
* -----------------------------------------------------------------------
    « IP 10 /
      IF DUP 4.6 <=
      THEN
        DUP IP 1 - 6 * SWAP FP 10 * 1 - + 65 + CHR
      ELSE
        DUP IP 5 - 5 * SWAP FP 10 * 1 - + "!YZ?#_789/_456*_123-_0. +"
	SWAP 1 + DUP SUB
      END
    »


* -----------------------------------------------------------------------
  LCHR
* -----------------------------------------------------------------------
    « 1 SRECV DROP »


* -----------------------------------------------------------------------
  LNUM
* -----------------------------------------------------------------------
    « 1 SRECV DROP NUM ->STR »


* -----------------------------------------------------------------------
  LSTR
* -----------------------------------------------------------------------
    « ""
      DO
        1 SRECV DROP +
      UNTIL BUFLEN DROP 0 ==
      END
    »

Enlaces

En el web de Microbótica puede encontrarse documentación complementaria y ejemplos para comunicar tarjetas CT6811 y calculadoras HP.

Download

Importante

Esto es software libre y como tal se distribuye bajo licencia pública GNU (GPL). El código fuente de la HP-48 no guarda los cometarios pero puede consultar las licencias en este enlace para las condiciones de copia. No hay NINGUNA garantía; ni siquiera de COMERCIABILIDAD o IDONEIDAD PARA UN FIN DETERMINADO.


© Javier de Lope Asiaín 2000-2002
Última modificación
17-Abr-2001

FastCounter by bCentral