Está en la página 1de 22

Sistemas Digitales

Ttulo: Mouse Century para el microcontrolador MC68HC11.


Profesor: Fernando lvarez Alumna: Mnica Kudzu

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

ndice:
Datos personales...................................................................................... 1 Objetivos..................................................................................................... 1 Conexionado del proyecto.......................................................................... 1 Descripcin del proyecto............................................................................. 1 Hardware........................................................................................ 1 Microcontrolador.................................................................... 1 Mouse.................................................................................... 2 Cable para comunicacin PC-microcontrolador.................... 2 Cable serie cruzado............................................................... 3 Estructura interna del mouse................................................. 4 Software........................................................................................... 4 Datos del mouse.................................................................... 5 Procesamiento de datos........................................................ 5 Diagramas de estados........................................................... 6 Diagrama de estados de la interrupcin......................6 Diagramas de flujo................................................................. 7 Diagrama de flujo principal.......................................... 7 Rutinas e interrupciones........................................................ 8 Rutinas........................................................................ 8 Filtrado.............................................................. 8 Reconstruccin de datos.................................. 8 Interrupcin RS-232.................................................... 9 Cdigo....................................................................................9 Variables................................................................................ 12 Variables volatile...............................................12 Variables globales............................................ 13 Variables locales...............................................13 Registros del microcontrolador.............................................. 14 SCSR................................................................ 14 BAUD...14 SCCR2 15 SCDR................................................................16 Mapa de memoria.................................................................. 16 Diagrama de flujo de la interrupcin...................................... 17 Interface con la PC-Programa mouse.exe............................. 18 Cdigo......................................................................... 18 Conclusiones............................................................................................... 20

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

Informe Sistemas Digitales


Datos Personales:
Alumna: Mnica Kudzu N de Legajo: 4553

Objetivo:
El objetivo de este proyecto es implementar un mouse Century para el microcontrolador MC68HC11, la posicin del mismo deber mostrarse por display, y en la pantalla de la PC se podr dibujar mediante el programa mouse.exe, desarrollado en Borlandc. Esquema de conexionado del proyecto:

Descripcin del proyecto:

Hardware
Kit Microcontrolador MC68HC11 de Motorola (fig. 1) Cable serie cruzado (fig. 4) Cable para alimentacin del mouse, conexin entre el mouse, el microcontrolador y la PC (fig. 3) Display WM-C0801M PC

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

Se utilizar el Kit con el microcontrolador MC68HC11 (fig. 1), de este Kit usaremos el microcontrolador; el conector DB9, para la comunicacin por RS-232; el puerto A y el puerto F, para el pasaje de datos al Display.

Fig.1

El conector DB9 del mouse Century (fig. 2) esta configurado de la siguiente forma: Pin 7 +5V Pin 3 5V Pin 2 datos Pin 5 masa

Fig. 2

La conexin del mouse con el microcontrolador se realizar mediante un cable que consta de tres conectores DB9. (fig. 3)

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

Fig. 3

Conector A (macho): del microcontrolador al mouse y al cable serie cruzado. El pin 3 va conectado al pin 2 y el pin 5 al pin 5, del conector B. El pin 2 va conectado al pin 3, y el pin 5 al pin 5, del conector C. Conector B (macho): del mouse al microcontrolador. Los pines 2 y 5 van conectados al conector A, el pin 5 va conectado a +5 V de la fuente de tensin, el pin 7 a +5V del Kit y el pin 3 a la masa de la fuente. Al conectar el pin 5 a +5 y el pin 3 a masa de la fuente se logra que al mouse lleguen 5V. Conector C (macho): del cable serie cruzado al microcontrolador. Los pines 3 y 5 van conectados al conector A.

El cable serie cruzado (fig. 4) tiene dos DB9 hembra, uno para la conexin con el COM1 de la PC y el otro para la conexin con el cable de tres conectores DB9.

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

Fig. 4

El Display se conecta al port A para el pasaje de datos, y al port F para la configuracin. Estructura interna del mouse:

Fig. 5

Software
Descripcin general de los datos enviados por el mouse

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

El mouse enva tres bytes seguidos, cada vez que se mueve. El primer byte indica si el movimiento fue positivo o negativo, y si los botones fueron presionados. Los dos primeros bits indican el comienzo del byte, ambos deben estar en uno. El tercer y cuarto bit, indican si se presiono algn botn. Quinto y sexto bit, dependen del sentido de desplazamiento en x (encoder 1 fig. 5), de la siguiente manera: 00 = +x (x mayor que 64) 01 = +x (x menor que 64) 10 = -x (x mayor que 64) 11 = -x (x menor que 64) Sptimo y octavo bit, igual a los dos anteriores pero para y (encoder 2 fig. 5). El segundo byte indica el desplazamiento en x. Los dos primeros bits son el comienzo del byte, siempre deben estar en uno y cero, respectivamente, los seis bits restantes son el desplazamiento en complemento a 2. El tercer byte es igual al segundo pero para el desplazamiento en y. La forma de rearmar esta informacin para poder procesarla es la siguiente: x_c = ((byte1&0x03)<<6)|(byte2&0x3F);

fig. 6

Lo mismo se hace para y, pero de la siguiente manera: y_c = ((byte1&0xC)<<4)|(byte3&0x3F);

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

fig. 7

Donde x_c e y_c son variables del tipo char, que luego al hacer una igualacin con variables del tipo int se tiene el desplazamiento con signo. Ej. Si x_c = 11000100 x_act = x_c; da como resultado x_act = -60, o sea, el mouse se desplaz 60 unidades hacia la izquierda. El valor x_act se utiliza para ir incrementando el valor de x. Este procedimiento se describe con mas detalles en la seccin de rutinas e interrupciones. Diagrama de estados Diagrama de estados de la interrupcin intrs:

fig. 8

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

Diagrama de flujo (fig. 9)

Inicio

Inicializacin de variables

Conversin de datos Char a Int

2 Filtro pasa bajos

Actualizacin de variables (SCS R&0x 40)== 0 NO SI

Display

Interrupcin RS-232 Recepcin de datos

Conversin de datos Int a Char

Comunicacin RS-232

Cont=0 Cont= =3 2 NO

1 SI

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

Rutinas e Interrupciones
Rutinas: En el cuerpo del programa se toma los valores de x o y que llegan desde la interrupcin y los pasa a los valores predeterminados de pantalla, x mximo = 640 e y mximo = 480, adems considera los valores negativos cuando el cursor esta cerca del borde de la pantalla para que este no pase del lmite. Las vaiables x e y pueden variar entre 0-640 0-480, son enteras, y representan el valor total en pantalla, x_ant e y_ant son enteros, y representan los valores anteriores de las variables, son los valores antes de llegar la ltima interrupcin, x_act e y_act, son enteros, y son los incrementos debidos a la ltima interrupcin. Con cada cambio de posicin del mouse se incrementa la variable x (y) en el incremento que llega en x_act (y_act), o sea, x = x + x_act; (y = y + y_act;) antes de este paso se guarda el valor de x en x_ant x_ant = x; (y_ant = y;) para poder reconstruir los bytes y para realizar el filtrado de la seal Filtrado: La seal es filtrada para que cuando haya cambios muy rpidos no se produzcan saltos, por ejemplo en la parte grfica. El filtro utilizado es el siguiente: y = ((x+(9*y_ant))/10);

fig. 10

Reconstruccin de los datos: Otra rutina importante es la que una vez filtrado el dato rearma los byte para transmitirlos va RS-232 a la PC, esta rutina utiliza los valores enteros obtenidos luego de filtrar los datos, se necesitan los valores actuales y los valores anteriores. rel_c = x - x_ant; byte2 = (rel_c|0x80)&0xBF;

10

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

fig. 11

byte1 = ((rel_c&0xC0)>>4)|0xC0; rel_c = y y_ant; byte3 = (rel_c|0x80)&0xBF; byte1 = ((rel_c&0xC0)>>6)|byte1; Adems debemos verificar si los botones fueron presionados, para eso utilizamos dos variables, boton_i y boton_d, que son puestas en 1 si se presionaron los botones izquierdo y/o derecho respectivamente. Con estas variables se hacen dos if(), como mostramos a continuacin: If(boton_d==1) If(boton_i==1) byte1=(byte1|0x10); byte1=(byte1|0x20);

Esto pone un uno en las posiciones del byte1 correspondientes a los botones.

Fig. 12

11

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

Interrupciones: La interrupcin utilizada es la interrupcin de la comunicacin serie RS-232, la misma llega cada vez que se recibe un dato, por lo tanto para armar el paquete de tres byte que transmite el mouse se debern recibir tres interrupciones antes de tener el dato completo, con la condicin de que, primero debe llegar un byte que comience con 0xC0, el segundo y el tercero deben comenzar con 0x80, por lo tanto se utiliza una variable cont, que registra que byte es el que llega. A medida que van llegando los distintos byte se van cargando las variables byte1, byte2 y byte3 con sus respectivos datos, para que al llegar el ultimo la variable cont este en tres y esto habilite el procesamiento de datos en el main. Ver figuras 8 y 13. El cdigo de la interrupcin y del main son los siguientes:
#include <iof1.h> volatile int cont; volatile unsigned char byte; volatile char byte1,byte2,byte3; char x_c, y_c, rel_c; int x, y, x_act, y_act, x_ant, y_ant, boton_i, boton_d; void main(void) { while((SCSR&0x40)==0); BAUD=0x33; SCCR2=0x2c; _asm("cli"); cont=0; x=0; y=0; x_c=0; y_c=0; x_act=0; y_act=0; x_ant=0; y_ant=0; rel_c=0; boton_d=0; boton_i=0; for( ; ; ) { if(cont==3) { x_c=((byte1&0x03)<<6)|(byte2&0x3F); y_c=((byte1&0x0C)<<4)|(byte3&0x3F); if((byte1&0x20)==0x20) { boton_i=1; }

12

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

else { boton_i=0; } if((byte1&0x10)==0x10) { boton_d=1; } else { boton_d=0; } x_act=x_c; y_act=y_c; x_ant=x; y_ant=y; x=x+x_act; y=y+y_act; if(x>640) x=640; if(x<0) x=0; if(y>480) y=480; if(y<0) y=0; y=((x+(9*y_ant))/10); rel_c=x-x_ant; byte2=(rel_c|0x80)&0xBF; byte1=((rel_c&0xC0)>>4)|0xC0; rel_c=y-y_ant; byte3=(rel_c|0x80)&0xBF; byte1=((rel_c&0xC0)>>6)|byte1; if(boton_d==1) byte1=(byte1|0x10); if(boton_i==1) byte1=(byte1|0x20); SCDR=byte1; while((SCSR&0x80)==0); SCDR=byte2; while((SCSR&0x80)==0); SCDR=byte3; while((SCSR&0x80)==0); cont=0; } } } @interrupt void intrs(void) { char var; SCSR; byte=SCDR; var=(byte&0xC0); switch(var) { case 0xC0:

13

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

if(cont!=3) { byte1=byte; cont=1; } break; case 0x80: if(cont==1) { byte2=byte; cont=2; } else { if(cont==2) { byte3=byte; cont=3; } } break; default: cont=0; break; } }

Variables: A continuacin se detallan las variables utilizadas, sus tipos y el porque de estos. Variables Volatile: Las variables que son utilizadas en el cuerpo principal del programa y en las interrupciones deben ser declaradas como volatile, con esto logramos que sean actualizadas cuando son modificadas desde las interrupciones, de lo contrario seran modificadas en las interrupciones y el programa principal utilizara valores incorrectos.
volatile int cont: Esta variable se utiliza como contador de interrupciones, cuando llega un byte que comienza con 11 se pone en uno, y se va incrementando con la llegada de los otros dos byte, o sea, como mximo toma el valor tres, cuando estos datos son procesados y transmitidos se pone el contador en cero, si no se hiciera esto entraran las interrupciones pero los valores de los byte que llegan no seran guardados. volatile char byte: En esta variable se gurdan los valores que llegan desde el mouse, aunque no sean correctos, con el dato de esta variable se

14

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

chequea si es un byte valido o no. Debe ser una variable del tipo char ya que los datos que enva el mouse son byte. volatile char byte1,byte2,byte3: En estas variables se guardan los datos del mouse una vez chequeada su validez, es decir, que el primero comienza con 11, y el segundo y el tercero con 10. Cuando llegaron los tres byte estas variables son utilizadas para armar el dato del desplazamiento, y despus de filtrar la seal son utilizados para la transmisin de los datos pos RS-232 a la PC. Variables globales: Las variables que se utilizan en el cuerpo principal y en las funciones se declaran en forma global, para poder utilizarlas desde cualquier parte del programa. char x_c, y_c: Las variables x_c e y_c son utilizadas para guardar los datos rearmados con los datos contenidos en byte1, byte2 y byte3, en ellos se concatena el incremento y el signo de los desplazamientos. int x_act, y_act: Estas variables contienen lo mismo que x_c e y_c, pero en formato entero para poder realizar las cuentas y limitar los valores en una forma mas sencilla. int x, y: x e y representan la suma de todos los incrementos en el desplazamiento, pueden variar entre 0 y 640 en x, y 0_480 en y, estas variables junto con los valores anteriores son utilizadas para el filtrado de la seal. int x_ant, y_ant: Son los valores de x e y antes de la ltima interrupcin, antes de sumar el incremento en el desplazamiento. Como ya fue mencionado son utilizadas para el filtrado de la seal. char rel_c: Una vez filtrada la seal se deben reconstruir los byte para luego ser transmitidos a la PC, para esto hace falta obtener el incremento del desplazamiento, la variable rel_c representa este desplazamiento, rel_c = x - x_ant, al ser rel_c una variable del tipo char y x, x_ant, y, o y_ant del tipo entero se obtiene el incremento en complemento a 2, como el incremento no puede superar el tamao de un byte nos alcanza con un char, y solo se copia la parte baja de la resta de los dos enteros. int boton_i, boton_d: Estas variables se setean en uno si alguno de los botones fue presionado, y en cero cuando estan libres. Variables locales: Las variables locales solo pueden ser utilizadas en la funcin o interrupcin donde son declaradas, una vez que se sale de esta seccin la variables locales son destruidas, es decir la memoria reservada para estas es liberada, y se pierden los datos contenidos en ellas. char var: Esta variable se utiliza en la interrupcin de la comunicacin por RS-232, para poder reconocer que byte es el que llega, se hace una

15

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

mascara con el byte que llega, o sea la variable byte, para obtener solo los dos primeros bits de este byte, y con esta informacin se realiza un switch case que discrimina entre los distintos byte. Registros del microcontrolador utilizados: Todos los registros del microcontrolador utilizados en este proyecto estan relacionados con la transmisin serie. SCSR = Serial Communication Status Register

TDRE = Transmit Data Register Empty Flag TC = Transmit Complete Flag RDRF = Receive Data Register Full Flag IDLE = Idle Line Detected Flag OR = Overrun Error Flag NF = Noise Error Flag FE = Framing Error En este proyecto se utiliza este registro para saber cuando se termin de transmitir el programa al microcontrolador, se hace una mascara con 0x40, o sea, se chequea que el bit 6 TC, se compara con 0, si es verdadero el programa se termino de bajar. Tambin se utiliza el bit 7 TDRE, este bit indica si el registro SCDR esta vaco, para esto se hace una mascara con 0x80, se compara con 0, si es verdadero el registro esta disponible para que se le ingrese otro byte. Estos flag se borran con 1, y se hace automticamente cuando se lee el registro SCSR y cuando se escribe el registro SCDR. BAUD = Baud Rate Register

TCLR = Clear Baud Rate Counters (Test) SCP[1:0] = SCI Baud Rate Prescaler Selects RCKB = SCI Baud Rate Clock Check (Test) SCR[2:0] = SCI Baud Rate Selects Este registro se utiliza para setear las distintas caractersticas de la transmisin serie. En este proyecto se setea con el valor 0x33, es decir: SCP1=1 SCP0=1 SCR1=1 SCR0=1

16

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

Los dems bit en cero. Tabla1


Prescaler SCP1 0 0 1 1 SCP0 0 1 0 1 Divide Internal Clock By 1 3 4 13 Cristal Frequency (MHz) 4.0 62500 20833 15625 4800 4.9152 76800 25600 19200 5907 8.0 125000 41667 31250 9600 12.0 187500 62500 46875 14423 16.0 25000 83332 62500 19200 20.0 312500 104165 78125 24000

Tabla 2
SCR[2:0] Divide Prescaler By 1 2 4 8 16 32 64 128 Highest Baud Rate (Prescaler Output from Previous Table) 4800 4800 2400 1200 600 300 150 75 ----19200 19200 9600 4800 2400 1200 600 300 150 76800 76800 38400 19200 9600 4800 2400 1200 600 312500 312500 156250 78125 39063 19531 9766 4883 2441

000 001 010 011 100 101 110 111

Con SCP0 y SCP0 estamos seleccionando 9600 MHz, ya que el cristal del microcontrolador es de 8.0 (ver tabla1), y con SCR1 y SCR0 seleccionamos la divisin por 8 (ver tabla 2), es decir 9600/8=1200 baudios. SCCR2 = Serial Communication Control Register 2

TIE = Transmit Interrupt Enable TCIE = Transmit Complete Interrupt Enable RIE = Receiver Interrupt Enable ILIE = Idle-Line Interrupt Enable TE = Transmitter Enable RE = Receiver Enable RWU = Receiver Wakeup Conrtol SBK = Send Break Seteamos este registro en 0x2c, esto es:

17

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

RIE = 1 TE = 1 RE = 1 Los dems bit en cero. Lo que logramos con esto es habilitar las interrupciones de recepcin de datos, habilitar la transmisin y la recepcin de datos. SCDR = Serial Communications Data Register

En este registro se guardan los datos que llegan mediante la recepcin, y tambin se usa para transmitir, es decir en el se colocan los datos que se quieren transmitir.

Mapa de memoria
Cdigo Inicio Datos
0x0000 0x0006 0x0007 0x001C

Vector Interrupciones

0x00C4 0x0100 0x0101

Cdigo

0x02D3

Stack 5(main) + 12(int)

0x02D4 0x02E4 0x02E5 0xFFFF

18

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

Diagrama de flujo de la interrupcin intrs (fig. 13)


interrupcin

Borrado de flag SCSR

Actualizacin de variables

Var= =0xC 0 NO

SI

Cont! =3 SI Cont= =1 NO NO Retorna SI

SI

Var= =0x8 0 NO Cont=0

Cont=1 Cont=2 Byte1=byte Byte2=byte Cont= =2 NO

SI Cont=3

Byte3=byte

Retorna

19

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

Interface con la PC: El programa mouse.exe recibe los datos por el COM1 de la PC, los datos que recibe son exactos a los que enva el mouse, con la diferencia que le llegan filtrados. Lo que hace este programa es muy similar a lo que hace el programa del microcontrolador, espera la llegada de una interrupcin de RS-232, una vez que le llega un dato que comienza con dos unos lo toma como comienzo y guarda ese dato, repite esto dos veces mas y comienza a procesar los datos, x_c = ((byte1&0x03)<<6)|(byte2&0x3F); y_c = ((byte1&0xC)<<4)|(byte3&0x3F); guarda los valores anteriores y los actuales para poder dibujar. Dibuja mientras se mantiene el botn derecho presionado, cambia de color cuando se presiona el botn izquierdo y borra todo cuando se presionan los dos botones. El cdigo de este programa es el siguiente:
#include "uart.h" #include <dos.h> #include <graphics.h> #include <conio.h> #include <stdlib.h> void interrupt RX(void){} main() { unsigned char a,c; char Byte1,Byte2,Byte3; char x_c,y_c; int boton_d,boton_i,color; int x,y,x_act,y_act,x_ant,y_ant; int gdriver = DETECT, gmode; initgraph(&gdriver, &gmode, ""); base=setbase(1); setport(1,1200); x=0; y=0; x_c=0; y_c=0; x_act=0; y_act=0; x_ant=0; y_ant=0;

20

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

color=10; cleardevice(); while(c!=27) { Byte1=0; while((Byte1&0xC0)!=0xC0) Byte1=rxbyte(); Byte2=rxbyte(); Byte3=rxbyte(); x_c=((Byte1&0x03)<<6)|(Byte2&0x3F); y_c=((Byte1&0x0C)<<4)|(Byte3&0x3F); if((Byte1&0x20)==0x20) { boton_i=1; } else { boton_i=0; } if((Byte1&0x10)==0x10) { boton_d=1; } else { boton_d=0; } x_act=x_c; y_act=y_c; x_ant=x; x=x+x_act; y_ant=y; if(x>640) x=640; if(x<0) x=0; if(y>480) y=480; if(y<0) y=0; if(kbhit()) { c=getch(); } if(boton_i==0&&boton_d==0) { setfillstyle(SOLID_FILL,0); bar(x_ant,y_ant,x_ant+5,y_ant+5); } if(boton_i==0&&boton_d==1) { if(color>15) { color=0; }

21

Ingeniera en Automatizacin y Control Industrial Universidad Nacional de Quilmes

color=color++; } if(boton_i==1&&boton_d==1) { cleardevice(); } setfillstyle(SOLID_FILL,color); bar(x,y,x+5,y+5); } closegraph(); }

Conclusiones
Los objetivos de este proyecto son mostrar el movimiento del cursor en la pantalla de la PC y la posicin en coordenadas x-y en el display, pero por el limitado espacio en memoria esto tal vez no sea posible, adems es un tanto insuficiente tener un mouse para utilizar con un microcontrolador y que este no pueda hacer nada mas que comunicarse con el mouse, por lo tanto creo que este microcontrolador no tiene suficiente memoria como para utilizar un mouse y adems realizar alguna otra tarea.

22

También podría gustarte