Matriz de LEDs + Interfaz Grafica con GTK en Linux

31
Universidad Cat ´ olica “Nuestra Se ˜ nora de la Asunci ´ on” Sede Regional Asunci ´ on Facultad de Ciencias y Tecnolog ´ ıa Departamento de Ingenier ´ ıa Electr ´ onica e Inform ´ atica Carrera de Ingenier ´ ıa Electr ´ onica Microprocesadores I Ing. Vicente Gonz´ alez PhD. omez de la Fuente, Alberto <[email protected]> Ram´ ırez, Pedro <[email protected]> Matriz de leds 1 · 0 c 2 de diciembre de 2011

Transcript of Matriz de LEDs + Interfaz Grafica con GTK en Linux

Page 1: Matriz de LEDs + Interfaz Grafica con GTK en Linux

Universidad Catolica

“Nuestra Senora de la Asuncion”

Sede Regional Asuncion

Facultad de Ciencias y Tecnologıa

Departamento de Ingenierıa

Electronica e Informatica

Carrera de Ingenierıa Electronica

Microprocesadores IIng. Vicente Gonzalez PhD.

Gomez de la Fuente, Alberto <[email protected]>Ramırez, Pedro <[email protected]>

Matriz de leds 1 · 0 c©

2 de diciembre de 2011

Page 2: Matriz de LEDs + Interfaz Grafica con GTK en Linux

ii

Page 3: Matriz de LEDs + Interfaz Grafica con GTK en Linux

Indice general

1. Especificaciones del Proyecto 11.1. Descripcion General . . . . . . . . . . . . . . . . . . . . . . . . 1

1.1.1. Diagrama de Bloques del Sistema . . . . . . . . . . . . . . 21.1.2. Procedimiento de Utilizacion . . . . . . . . . . . . . . . . 21.1.3. Software de Aplicacion . . . . . . . . . . . . . . . . . . . . 3

2. Diseno del tablero de leds 52.1. Diseno del Hardware . . . . . . . . . . . . . . . . . . . . . . . . 52.2. Diseno Logico . . . . . . . . . . . . . . . . . . . . . . . . . . . . 52.3. Funcionamiento de la matriz de LEDs . . . . . . . . . . . . . . 72.4. Software controlador . . . . . . . . . . . . . . . . . . . . . . . . 8

2.4.1. Algoritmo implementado . . . . . . . . . . . . . . . . . . 9

3. Manejo del Puerto Serie 113.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113.2. Puerto serie y Linux . . . . . . . . . . . . . . . . . . . . . . . . 11

3.2.1. Descripcion . . . . . . . . . . . . . . . . . . . . . . . . . . 113.2.2. Explicacion . . . . . . . . . . . . . . . . . . . . . . . . . . 14

3.3. Codificacion de la informacion . . . . . . . . . . . . . . . . . . . 15

4. Manejo de la memoria EEPROM 174.1. Introduccion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174.2. Mapa de memoria . . . . . . . . . . . . . . . . . . . . . . . . . . 174.3. Programacion de la EEPROM . . . . . . . . . . . . . . . . . . . 19

4.3.1. Lectura . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204.4. Implementacion . . . . . . . . . . . . . . . . . . . . . . . . . . . 20

iii

Page 4: Matriz de LEDs + Interfaz Grafica con GTK en Linux

iv INDICE GENERAL

Page 5: Matriz de LEDs + Interfaz Grafica con GTK en Linux

Indice de figuras

2.1. Diagrama logico del registro de desplazamiento . . . . . . . . . . 62.2. Esquematico del matriz de leds disenado . . . . . . . . . . . . . . 72.3. Conexiones de puertos del Hcs12 con la Matriz de Leds. . . . . . 10

4.1. Mapa de memoria de la Flash . . . . . . . . . . . . . . . . . . . . 18

v

Page 6: Matriz de LEDs + Interfaz Grafica con GTK en Linux

vi INDICE DE FIGURAS

Page 7: Matriz de LEDs + Interfaz Grafica con GTK en Linux

Indice de cuadros

3.1. Dispositivos del puerto serie en Linux . . . . . . . . . . . . . . . 113.2. Matriz de un bloque de dibujo con valores binarios . . . . . . . . 15

4.1. Configuracion del espacio de la flash . . . . . . . . . . . . . . . . 194.2. Tiempos de programacion de la memoria EEPROM . . . . . . . 20

vii

Page 8: Matriz de LEDs + Interfaz Grafica con GTK en Linux

viii INDICE DE CUADROS

Page 9: Matriz de LEDs + Interfaz Grafica con GTK en Linux

Introduccion

El siguiente trabajo se trata sobre el desarrollo de una matriz de leds, masconocido como Tablero Electronico o Publik, existen varios modulos del cualconsta, primeramente el diseno del hardware, el cual basicamente consiste enuna matriz de pıxeles similar a los de la pantalla de un ordenador. Luego de esto,se disena el software que podra manejar la matriz desde el ordenador, se ha de-sarrollado en GTK+, ademas se utiliza el puerto RS232 para la comunicacioncon el dispositivo microcontrolador utilizado el cual es el HCS12 de Motorola.

Cabe destacar que el desarrollo del entorno grafico y por ende el manejo delpuerto serial, se han hecho en Linux por la simplicidad que presenta, ya quese maneja al puerto como un simple archivo, ademas GTK+ presenta variasfunciones que ayudan a la portabilidad del software desarrollado.

ix

Page 10: Matriz de LEDs + Interfaz Grafica con GTK en Linux

x INDICE DE CUADROS

Page 11: Matriz de LEDs + Interfaz Grafica con GTK en Linux

1 Especificaciones del Proyecto

1.1 Descripcion General

El cartel luminoso cumple con las siguientes especificaciones:

1. El cartel muestra hasta 3 letras en algun momento de su desplazamiento.

2. Se conecta a una computadora para ingresar los mensajes. Para lo cualposee una interfase de usuario.

3. Los mensajes quedan guardados en memoria no volatil.

4. El Panel posee efectos tales como: Correr de izquierda a derecha y vicev-ersa. Correr de arriba abajo y viceversa, efecto de parpadeo de los LEDs, efectonegrita.

5. La velocidad con que se muestra los mensajes es apto para poder leer losmensajes.

6. El hardware posee un boton que permite cambiar de mensaje. Para ellose debera guardar multiples mensajes.

1

Page 12: Matriz de LEDs + Interfaz Grafica con GTK en Linux

2 CAPITULO 1. ESPECIFICACIONES DEL PROYECTO

1.1.1. Diagrama de Bloques del Sistema

1.1.2. Procedimiento de Utilizacion

En esta seccion se enlistan los pasos a seguir para la utilizacion del CartelLuminoso T.E.L.

1. Se conecta el Microcontrolador HCS12 a una Fuente de 5V.

2. Se conecta el cable serial a la PC y al Microcontrolador HCS12.

3. Se enciende la PC.

4. Se ingresa al Software LEDs.

5. Se pueden ingresar hasta 10 mensajes.

6. Una ves ingresados los mensajes deseados se puede desconectar el cableserial.

7. Apagar la PC y la Fuente de tension.

8. Volver a encender la fuente de alimentacion.

8. Ya que el dispositivo almacena todos los mensajes ingresados, con el botonpulsador uno puede ir cambiando los mensajes.

Page 13: Matriz de LEDs + Interfaz Grafica con GTK en Linux

3

1.1.3. Software de Aplicacion

En esta imagen se puede apreciar la interfase de usuario. El sistema esmuyamigable. Permite ingresar hasta 10 mensajes, elegir sus animaciones. Tambientiene la opcion de prender con 1 o con 0.

Page 14: Matriz de LEDs + Interfaz Grafica con GTK en Linux

4 CAPITULO 1. ESPECIFICACIONES DEL PROYECTO

Page 15: Matriz de LEDs + Interfaz Grafica con GTK en Linux

2 Diseno del tablero de leds

2.1 Diseno del Hardware

El hardware que se quiere construir es un cartel luminoso. Para el disenoinicial se utilizo una matriz de tal manera que se tendra el control sobre 112leds. El montaje final queda por tanto con 16 columnas y 7 filas. El controlde los leds es multiplexado, de forma que cada elemento de la matriz(1 led) secontrola por un comando de filas y columnas.

2.2 Diseno Logico

Teniendo en cuenta las restricciones anteriores se comienza el diseno logicodel circuito de control. En primer lugar se debe escoger la forma en que se vaa realizar el control sobre las matrices, teniendo en cuenta que se va a crear un“display” lineal. Lo ideal serıa poder controlar individualmente cada uno delos 112 “leds”, pero para ello serıan necesarias 23 senales de control, una porcada columna (16) y uno por cada fila (7). El numero es excesivo(mas aun si sedesease expandir la cantidad de columnas), ası que se tendra que plantear otroesquema de control. Se plantearon dos soluciones, codificar las columnas o lasfilas, de forma que en un momento dado solo por una columna o por una filapudiera pasar corriente, permitiendo ası el control individual de los “leds” de lafila o columna por la que pasara corriente.

Otro esquema esta en el multiplexado, esta tecnica permite utilizar unospocos pines de E/S del microcontrolador para manejar una serie de circuitosintegrados que se encarguen de excitar los LEDs. Hay varias maneras, y mu-chos modelos diferentes de circuitos para hacer esto. Pueden usarse un tipo deintegrado digital llamado “LATCH”. De esta manera, usando varios latchespodrıamos encender los LEDs por turnos, rapidamente para que no se note elparpadeo, y de esa manera formar una palabra en el cartel. Otra forma es uti-lizar un registro de desplazamiento. Y de hecho, es de esta forma como vamosa disenar nuestro cartel. En un registro de desplazamiento tenemos “0” y “1”,lo bueno es que para “meter” datos (“0”s y “1”s) en el solo hacen falta tres

5

Page 16: Matriz de LEDs + Interfaz Grafica con GTK en Linux

6 CAPITULO 2. DISENO DEL TABLERO DE LEDS

pines del microcontrolador, independientemente de lo largo que sea. Estos pinesse encargan de tres tareas: Uno de ellos, al que denominaremos “DATOS” esel encargado de decirle al registro de desplazamiento que lo que introduciremoses un “0” o un “1”. El segundo se encarga de avisar al registro que el dato yaesta listo para ser ingresado, y lo llamaremos “CLOCK”. Y el ultimo, que noes indispensable, es el “RESET”, que se encarga de “vaciar” la fila escribiendo“0‘”s en todas las salidas del registro.

Para desarrollar nuestro ejemplo utilizaremos el circuito integrado 74HC164N,que es un registro de desplazamiento de 8 bits. Para construir un cartel de 16columnas, necesitarıamos utilizar 2 de estos integrados, uno a continuacion delotro.

En la figura podemos ver la funcion de cada uno de los pines del 74HC164Ny en la figura el diseno hacho y de que forma podemos conectar uno a contin-uacion del otro para obtener un registro de desplazamiento de cualquier longitud.

SN74LS164

http://onsemi.com126

LOGIC DIAGRAM

Q6 Q7

A

B

Q0 Q1 Q3Q2 Q5Q4

MR

CP

D Q

CD

D Q

CD

D Q

CD

D Q

CD

D Q

CD

D Q

CD

D Q

CD

D Q

CD

63 4 5 11 1210 13VCC = PIN 14GND = PIN 7

= PIN NUMBERS

1

2

8

9

FUNCTIONAL DESCRIPTION

The LS164 is an edge-triggered 8-bit shift register withserial data entry and an output from each of the eight stages.Data is entered serially through one of two inputs (A or B);either of these inputs can be used as an active HIGH Enablefor data entry through the other input. An unused input mustbe tied HIGH, or both inputs connected together.

Each LOW-to-HIGH transition on the Clock (CP) inputshifts data one place to the right and enters into Q0 the logicalAND of the two data inputs (A•B) that existed before therising clock edge. A LOW level on the Master Reset (MR)input overrides all other inputs and clears the registerasynchronously, forcing all Q outputs LOW.

MODE SELECT — TRUTH TABLE

OPERATINGMODE

INPUTS OUTPUTSMODE

MR A B Q0 Q1–Q7

Reset (Clear) L X X L L – L

H I I L q0 – q6Shift H I h L q0 – q6

H h I L q0 – q6H h h H q0 – q6

L (l) = LOW Voltage LevelsH (h) = HIGH Voltage LevelsX = Don’t Careqn = Lower case letters indicate the state of the referenced input or output oneqn = set-up time prior to the LOW to HIGH clock transition.

Figura 2.1: Diagrama logico del registro de desplazamiento

Bien, con el esquema explicado podemos encender los LEDs que queramosde una fila de 16 bits de largo. Si en el registro de desplazamiento introduci-mos “1111. . .111”, los 16 LEDs estaran encendidos. Si queremos encender unopor medio, escribiremos “10101. . .01”. cuando lleguemos a la parte de la pro-gramacion veremos como se ingresan uno a uno los “0” y “1” en el registro.Ademas se aprovecha un “defecto” del ojo humano, que mantiene la imagenvista durante unos 20 o 30 milisegundos, para “dibujar” una fila a la vez, peromuy rapidamente, de forma que todo el cartel parezca estar encendido a la vez.

Page 17: Matriz de LEDs + Interfaz Grafica con GTK en Linux

7

5

5

4

4

3

3

2

2

1

1

D D

C C

B B

A A

0 0 0 0 0 0 0 0 0 0 0 0 00 0 0

VCC

VCC

VCC

VCC

VCC

VCC

VCC

0

VCC

SELECTOR FILAS

ENTRADA SERIAL

ALIMENTACION

MATRIZ DE LED'S DE 7*16

CLOCKRESET

DATA

VCCGND

D27

LED

D27

LED

D4

LED

D4

LED

D107

LED

D107

LED

D46

LED

D46

LED

R72.2kR72.2k

Q11

Q2N2222

Q11

Q2N2222

D55

LED

D55

LED

D92

LED

D92

LED

D21

LED

D21

LED

D101

LED

D101

LED

D40

LED

D40

LED

D49

LED

D49

LED

R62.2kR62.2k

D16

LED

D16

LED

Q18Q2N2222Q18Q2N2222

D77

LED

D77

LED

R27

220

R27

220

D86

LED

D86

LED

D34

LED

D34

LED

R52.2k

R52.2k

R19

2.2k

R19

2.2k

Q7

Q2N2222

Q7

Q2N2222

D62

LED

D62

LED

D71

LED

D71

LED

Q22Q2N2222Q22Q2N2222

D5

LED

D5

LED

J1

CON7

J1

CON7

1234567

D28

LED

D28

LED

D108

LED

D108

LED

D47

LED

D47

LED

R42.2kR42.2k

R22

2.2k

R22

2.2k

D56

LED

D56

LED

D65

LED

D65

LED

Q14

Q2N2222

Q14

Q2N2222

R162.2kR162.2k

D93

LED

D93

LED

D22

LED

D22

LED

D41

LED

D41

LED

R32.2kR32.2k

D102

LED

D102

LED

D50

LED

D50

LED

Q3

Q2N2222

Q3

Q2N2222

D78

LED

D78

LED

R152.2kR152.2k

D87

LED

D87

LED

R22.2kR22.2k

D35

LED

D35

LED

D11

LED

D11

LED

D63

LED

D63

LED

D72

LED

D72

LED

R142.2kR142.2k

Q10

Q2N2222

Q10

Q2N2222

D81

LED

D81

LED

D6

LED

D6

LED

R26

220

R26

220

D29

LED

D29

LED

R12.2kR12.2k

D109

LED

D109

LED

D48

LED

D48

LED

D57

LED

D57

LED

Q19Q2N2222Q19Q2N2222

R132.2kR132.2k

D66

LED

D66

LED

D1

LED

D1

LED

Q1

Q2N2222

Q1

Q2N2222

D94

LED

D94

LED

D23

LED

D23

LED

D103

LED

D103

LED

D42

LED

D42

LED

D51

LED

D51

LED

U174HC164

U174HC164

A1

B2

CLK

8

QA

3Q

B4

QC

5Q

D6

QE

10Q

F11

QG

12Q

H13

CLR 9

R122.2kR122.2k

J3

CON2

J3

CON2

12

D79

LED

D79

LED

Q6

Q2N2222

Q6

Q2N2222

Q23Q2N2222Q23Q2N2222

D88

LED

D88

LED

D17

LED

D17

LED

J2CON3J2CON31 2 3

D97

LED

D97

LED

D36

LED

D36

LED

R17

2.2k

R17

2.2k

D12

LED

D12

LED

R112.2kR112.2k

D64

LED

D64

LED

D73

LED

D73

LED

R30

220

R30

220

Q13

Q2N2222

Q13

Q2N2222

D82

LED

D82

LED

D7

LED

D7

LED

R20

2.2k

R20

2.2k

D30

LED

D30

LED

D110

LED

D110

LED

D58

LED

D58

LED

R102.2kR102.2k

D67

LED

D67

LED

R23

2.2k

R23

2.2k

D24

LED

D24

LED

D95

LED

D95

LED

D104

LED

D104

LED

D43

LED

D43

LED

D52

LED

D52

LED

R92.2kR92.2k

R25

220

R25

220

D80

LED

D80

LED

Q9

Q2N2222

Q9

Q2N2222

D89

LED

D89

LED

D18

LED

D18

LED

D98

LED

D98

LED

D37

LED

D37

LED

R82.2kR82.2k

D13

LED

D13

LED

Q20Q2N2222Q20Q2N2222

D74

LED

D74

LED

D83

LED

D83

LED

D8

LED

D8

LED

D31

LED

D31

LED

Q16

Q2N2222

Q16

Q2N2222

D111

LED

D111

LED

D59

LED

D59

LED

D68

LED

D68

LED

R29

220

R29

220

D96

LED

D96

LED

D25

LED

D25

LED

D2

LED

D2

LED

Q5

Q2N2222

Q5

Q2N2222

D105

LED

D105

LED

D44

LED

D44

LED

D53

LED

D53

LED

D90

LED

D90

LED

D19

LED

D19

LED

Q12

Q2N2222

Q12

Q2N2222

D99

LED

D99

LED

D38

LED

D38

LED

Q2

Q2N2222

Q2

Q2N2222

D14

LED

D14

LED

D75

LED

D75

LED

U274HC164

U274HC164

A1

B2

CLK

8

QA

3Q

B4

QC

5Q

D6

QE

10Q

F11

QG

12Q

H13

CLR 9

D84

LED

D84

LED

R18

2.2k

R18

2.2k

D9

LED

D9

LED

D32

LED

D32

LED

R24

220

R24

220

D112

LED

D112

LED

Q17Q2N2222Q17Q2N2222

D60

LED

D60

LED

R21

2.2k

R21

2.2k

D69

LED

D69

LED

D26

LED

D26

LED

D3

LED

D3

LED

D106

LED

D106

LED

D45

LED

D45

LED

Q8

Q2N2222

Q8

Q2N2222

D54

LED

D54

LED

R28

220

R28

220Q21Q2N2222Q21Q2N2222

D91

LED

D91

LED

D20

LED

D20

LED

D100

LED

D100

LED

D39

LED

D39

LED

Q15

Q2N2222

Q15

Q2N2222

D15

LED

D15

LED

D76

LED

D76

LED

D85

LED

D85

LED

D10

LED

D10

LED

D33

LED

D33

LED

Q4

Q2N2222

Q4

Q2N2222

D61

LED

D61

LED

D70

LED

D70

LED

Figura 2.2: Esquematico del matriz de leds disenado

2.3 Funcionamiento de la matriz de LEDs

Como dijimos antes, la pantalla esta formada por una serie de filas y colum-nas. La interseccion entre ambas contiene un LED. Para que este encienda, tieneque recibir simultaneamente un “1” en la fila, y un “1” en la columna. Cuandose dan estas condiciones, la electronica de la placa se encarga del encendido delLED en cuestion. La forma de generar un mensaje sobre el display es relativa-mente sencilla, si nos atenemos al siguiente algoritmo:

1. Apagar todas las filas.

2. Escribir los valores correspondientes a la primer fila en el registro de de-splazamiento, teniendo en cuenta que el primer digito binario colocadocorresponde al primer LED de la fila, y el ultimo en poner al de la ultimacolumna.

3. Encenderla primer fila, esperar un tiempo, y volver a apagarla.

4. Repetir los pasos 2 y 3 para las filas restantes.

El tiempo de la demora debe ser tal que permita una visualizacion correc-ta, sin molestos parpadeos y con los LEDS brillantes. Ssi utilizamos tiempos

Page 18: Matriz de LEDs + Interfaz Grafica con GTK en Linux

8 CAPITULO 2. DISENO DEL TABLERO DE LEDS

mayores para el encendido de cada fila, el brillo de los LEDS sera mayor, perotambien aumentara el parpadeo.

Un punto tenido en cuenta es la intensidad del brillo que puede propor-cionarnos el tipo de LED que utilizamos. En caso de un tıpico cartel de 7 filascomo el disenado, a pesar de que las veremos encendidas al mismo tiempo, cadaLED solo estara encendido la septima parte del tiempo, por lo que su brillosera siete veces inferior al normal, y nuestro cartel apenas sera visible.

2.4 Software controlador

Ahora nos toca abordar la programacion del hardware propuesto. El car-tel del LEDs que estamos construyendo puede adoptar diferentes tamanos deacuerdo a las especificaciones del trabajo.

Debemos pensar en un programa que nos permita mostrar pıxeles individ-uales representados sobre la pantalla de nuestro cartel de 16 columnas y 7 filasde altura, recordando que todo lo que expliquemos puede ser adecuado paracarteles de otro tamano.

Lo primero que necesitamos saber es que el “barrido” del cartel debe hacersepor filas. Es decir, mostraremos el contenido de la primera fila, esperamos untiempo determinado (unos pocos milisegundos), mostramos el de la segunda fila,esperamos nuevamente, y ası hasta llegar a la ultima fila, tal como se expresaen el algoritmo visto mas arriba.

El motivo de no emplear las columnas para realizar el barrido es que comoson mas numerosas, el tiempo total que se necesita para “escribir” por filas esmucho menor que el necesario para escribir por columnas, y en la practica esosignifica que el brillo de nuestro cartel sera mucho mayor si lo hacemos por filas,ya que cada LED permanecera encendido 1/7 del tiempo. Si lo hiciesemos porcolumnas, cada LED estarıa encendido solo 1/16 del tiempo, por lo que su brilloseria unas 2 veces menor.

Ahora bien, el primer problema a resolver es ¿Como escribo los datos de unafila del cartel? Esto tiene una solucion mas que simple: solo debemos introduciren el registro de desplazamiento los “0” y “1” necesarios para que los LEDs quequeremos esten encendidos en esa fila tengan +V en sus anodos. Por supuesto,mientras hacemos esto todos los pines del microcontrolador que controlan lasfilas deberan estar apagadas, para que no se perciba una debil luminosidad entodos los LEDs de la fila que estamos escribiendo a medida que pasan los datosa traves del registro.

Page 19: Matriz de LEDs + Interfaz Grafica con GTK en Linux

9

El primer valor que se debe “meter” en el registro de desplazamiento es elque correspondera a la ultima columna. A medida que vamos ingresando lossiguientes, se van desplazando hacia el final del cartel. Cuando hayamos intro-ducido el valor 16 (que correspondera a la primera columna) el primer valor quemetimos habra llegado a su posicion.

En ese momento tenemos todo el registro escrito, y ya podemos activar la sal-ida del microcontrolador(pin) que corresponde a esa fila en particular. El tiempoque debe estar encendida la fila se puede determinar empıricamente, pero por logeneran unos 10 milisegundos es suficiente. Si tenemos 7 filas, 10 milisegundosde demora permitirıan escribir todo el cartel en unos 70 milisegundos.

2.4.1. Algoritmo implementado

La programacion fue desarrollada en lenguaje C. Para el diseno del algoritmoprimeramente fue necesario entender el hardware que utilizamos. El cual hemosdescrito anteriormente.

Los mensajes son enviados a traves del puerto serial. El microprocesadorHcs12 recibe dichos datos y almacena en una matriz.

Todas las animaciones tienen los mismos fundamentos, los cuales explicare-mos a continuacion. Los menajes constan de N caracteres, los cuales son alma-cenados en una matriz que llamamos bits, el primer mensaje en la primera fila,el segundo mensaje en la segunda fila, y ası sucesivamente hasta completar 10filas. Cada caracter de los mensajes consta de 7 bytes para ser representados enla pantalla de leds. Estos bytes son almacenados en memoria de manera consec-utiva, lo cual permite al acceso con mayor facilidad.

mask.x = 1;

mask.x <<= (BLOQUE - 1);

for(j3 = 0; j3 < CANT_FILA; j3++){

PORTA = 0;

fila[j3].x2 <<= 1;

if ((bits[SmsActual][j3 + k + FRAME].x & mask.x)){

fila[j3].x2= fila[j3].x2 + 1;

}else{

fila[j3].x2= fila[j3].x2 + 0;

}

mask2.y = 1;

mask2.y <<= (CANT_COL - 1);

for(j2 = 0; j2 < CANT_COL; j2++){

if(fila[j3].x2 & mask2.y){

Page 20: Matriz de LEDs + Interfaz Grafica con GTK en Linux

10 CAPITULO 2. DISENO DEL TABLERO DE LEDS

PORTB_BIT0 = (bits[SmsActual][1].x - ’0’);

}else{

PORTB_BIT0 = ~(bits[SmsActual][1].x - ’0’);

}

PORTB_BIT1 = 0;

PORTB_BIT1 = 1;

mask2.y >>= 1;

}

Para acceder a dichos bytes utilizamos los campos de bits que el lenguaje cnos permite manejar. Utilizamos dos mascaras, una de 8 bits, y la otra de 16bits. La mascara de 8 bits se encarga de recorrer cada byte de cada caracter,realizando la operacion AND, los resultados de dichas operaciones son almace-nadas en el vector fila de N elementos. Este vector fila se encarga de guardarcada cambio que se realiza en el mismo. Existen 7 vectores filas los cuales cor-responden a cada renglon de la pantalla de leds.

La mascara de 16 bits se encarga de desplegar en pantalla el contenido delvector fila para cada momento dado. Primeramente consta de un bit alto en laposicion mas significativo y el resto cero, de manera tal a realizar la operacionAND y desplazar a la derecha, el resultado se guarda en el registro de cor-rimiento del hardware, ası tambien como en el vector fila correspondiente, esteproceso se realiza 16 veces, luego se envıa un bit alto en el puerto que controlael encendido de las filas, y de esta manera encender la fila en cuestion.

Figura 2.3: Conexiones de puertos del Hcs12 con la Matriz de Leds.

Page 21: Matriz de LEDs + Interfaz Grafica con GTK en Linux

3 Manejo del Puerto Serie

3.1 Introduccion

Este es un breve tutorial sobre como manejar el puerto serie desde Linuxsacado de la siguiente pagina LINK. Esto se utiliza para comunicarse con mi-crocontroladores externos como es el caso de nuestro trabajo.

3.2 Puerto serie y Linux

Los nombres que se dan en Linux a los dispositivos serie son:

Nombre del dispositivo Descripcion

/dev/ttyS0 Primer puerto serie nativo. (Equivalente a COM1)/dev/ttyS1 Segundo puerto serie nativo. (Equivalente a COM2)

/dev/ttySnn n-esimo puerto serie nativo

Cuadro 3.1: Dispositivos del puerto serie en Linux

La forma de acceder al puerto serie es la misma que para trabajar concualquier otro fichero. Se usan las llamadas read() y write() para leer y es-cribir respectivamente. Pero a diferencia de los archivos normales, antes de usarel puerto serie es necesario configurarlo, estableciendo la velocidad de trabajo ysu modo de funcionamiento.

3.2.1. Descripcion

Se configura el modo de funcionamiento serie a 8N1(8 bits de datos, 1 bit destop y sin paridad). La velocidad es la indicada por el usuario en el parametrobaud, es una constante que puede valer: B9600, B19200, etc. Se puede encontrarmas informacion sobre todos los valores posibles en la pagina de manual determios (man termios).

11

Page 22: Matriz de LEDs + Interfaz Grafica con GTK en Linux

12 CAPITULO 3. MANEJO DEL PUERTO SERIE

Esta funcion devuelve el descriptor del puerto serie (0 -1 si ha ocurrido unerror), que sera necesario para realizar las lecturas y escrituras.

int serial_open(char *serial_name, speed_t baud)

{

struct termios newtermios;

int fd;

fd = open(serial_name,O_RDWR | O_NOCTTY);

newtermios.c_cflag= CBAUD | CS8 | CLOCAL | CREAD;

newtermios.c_iflag=IGNPAR;

newtermios.c_oflag=0;

newtermios.c_lflag=0;

newtermios.c_cc[VMIN]=1;

newtermios.c_cc[VTIME]=0;

cfsetospeed(&newtermios,baud);

cfsetispeed(&newtermios,baud);

if (tcflush(fd,TCIFLUSH)==-1) return -1;

if (tcflush(fd,TCOFLUSH)==-1) return -1;

if (tcsetattr(fd,TCSANOW,&newtermios)==-1) return -1;

return fd;

}

La funcion serial send() envıa una cadena de bytes por el puerto serie. Lounico que hace es invocar la llamada al sistema write(). Como parametros sepasa el descriptor serie del puerto serie (serial fd), devuelto por la funcion seri-al open(), el array con los datos a enviar (data) y su tamano (size).

void serial_send(int serial_fd, char *data, int size)

{

write(serial_fd, data, size);

}

La funcion serial read() se usa para leer datos del puerto serie. Se le pasancomo parametros el descriptor del puerto serie (serial fd), el array donde alma-cenar los datos recibidos (data), el tamano maximo de bytes a recibir (size, parano desbordar el array) y el tiempo maximo para recibir los datos (timeout usec).Si transcurre un tiempo igual a timeout usec y no se han recibido datos, la fun-cion retornara y devolvera el control a la que la invoco.

Page 23: Matriz de LEDs + Interfaz Grafica con GTK en Linux

13

Para realizar las lecturas no bloqueantes, se usa la llamada al sistema se-lect(). En este caso devuelve 1 si hay datos esperando a ser leıdos y 0 si haocurrido un timeout. A continuacion se invoca a read() para leer estos datos. Elproceso se repite para garantizar que es posible recibir datos de tamano size.

Se devuelve el numero de bytes leıdos ( 0 si ha ocurrido un timeout).

int serial_read(int serial_fd, char *data, int size, int timeout_usec)

{

fd_set fds;

struct timeval timeout;

int count=0;

int ret;

int n;

do {

FD_ZERO(&fds);

FD_SET (serial_fd, &fds);

timeout.tv_sec = 0;

timeout.tv_usec = timeout_usec;

ret=select (FD_SETSIZE,&fds, NULL, NULL,&timeout);

if (ret==1) {

n=read (serial_fd, &data[count], size-count);

count+=n;

data[count]=0;

}

} while (count<size && ret==1);

return count;

}

La ultima funcion es serial close(), que simplemente invoca a close() paracerrar el puerto serie.

void serial_close(int fd)

{

close(fd);

}

Page 24: Matriz de LEDs + Interfaz Grafica con GTK en Linux

14 CAPITULO 3. MANEJO DEL PUERTO SERIE

3.2.2. Explicacion

Solo se explicaran algunos fragmentos del codigo. Primero se abre el puertoserie, a la velocidad de 9600 baudios invocando la funcion serial open(). Sepasa como argumento el nombre del dispositivo serie obtenido de la lınea decomandos. Se indica si ha ocurrido un error al abrirlo (por ejemplo si se especificaun dispositivo serie incorrecto):

serial_fd=serial_open(argv[1],B9600);

if (serial_fd==-1) {

printf ("Error opening the serial device: %s\n",argv[1]);

perror("OPEN");

exit(0);

}

Luego se envıa la cadena definida en la constante CMD y se espera recibirla misma

serial_send(serial_fd, CMD, CMD_LEN);

printf ("String sent------> %s\n",CMD);

n=serial_read(serial_fd,data,CMD_LEN,TIMEOUT);

La variable n contiene el numero de bytes recibidos. Si n es 0 es porquehabra ocurrido un timeout. En caso contrario se imprimen en pantalla la cadenarecibida.

Por ultimo se cierra el puerto serie:

serial_close(serial_fd);

Page 25: Matriz de LEDs + Interfaz Grafica con GTK en Linux

15

3.3 Codificacion de la informacion

En esta seccion se describe brevemente la forma de codificar cada caracter aser enviado por el puerto serie, es decir los datos que van a ser desplegados luegoen la matriz de LEDs, basicamente cada caracter introducido por el usuario estransformado en una matriz de 7 filas * 8 columnas, a esto se le llamamos unbloque de dibujo, en el cual cada fila corresponde a un char(8 bits), si elvalor introducido equivalente es visto desde el punto de vista de la numeracionbinaria los “1” corresponderan a los LEDs que seran encendidos, y los “0” alos que estaran apagados, la matriz completa es enviada en forma serial de laprimera a la septima fila en forma secuencial ordenada, un ejemplo de ello parala letra a serıa:

0 0 1 1 1 1 0 00 1 1 1 1 1 1 00 1 1 0 0 1 1 00 1 1 1 1 1 1 00 1 1 1 1 1 1 00 1 1 0 0 1 1 00 1 1 0 0 1 1 0

Cuadro 3.2: Matriz de un bloque de dibujo con valores binarios

Ahora si todos los “1” son pintados para ver el efecto que serıa lo mismo enla matriz de LEDs, dando la ilusion de una palabra, se pueden hacer infinitasconfiguraciones de cuadro de dibujos, solo basta un poco de imaginacion.

0 0 1 1 1 1 0 00 1 1 1 1 1 1 00 1 1 0 0 1 1 00 1 1 1 1 1 1 00 1 1 1 1 1 1 00 1 1 0 0 1 1 00 1 1 0 0 1 1 0

Ası, para enviar una cadena solo basta tener una funcion que transforme paracada caracter una codificacion y ponerlo en el puerto serial para su transferenciaal MCU, de esta manera se tiene una gran efectividad en el uso de la capacidadde memoria del microcontrolador, porque el algoritmo aquı solo se dedica a colo-car en memoria no volatil el dato recibido para luego dedicarse exclusivamentea desplegar una secuencia de bits puros encendiendo o apagando los LEDs ensus correspondientes lugares(secuencia de 1 y 0), el cual fue codificado y tieneun significado(palabras, emoticones, caracteres especiales, numeracion, etc.), elcual en su conjunto da significado a la secuencia.

Page 26: Matriz de LEDs + Interfaz Grafica con GTK en Linux

16 CAPITULO 3. MANEJO DEL PUERTO SERIE

Page 27: Matriz de LEDs + Interfaz Grafica con GTK en Linux

4 Manejo de la memoria EEPROM

4.1 Introduccion

En el microcontrolador utilizado se encuentra un recurso interno bastanteutil a la hora de buscar un sistema autonomo barato y sencillo. La memoriaEEPROM, con lo cual se ahorra la expansion externa de memoria. Esto quesuena tan bien tiene el inconveniente de la limitada capacidad de la EEPROM.Oscila entre 16kbytes y 128kbytes segun el modelo, para nuestro caso tenemosa nuestra disposicion 32 Kbyte Flash Module(S12FTS32KV1).

La EEPROM es una memoria que mantiene los datos aun desconectando laalimentacion del sistema (memoria no volatil). Su ciclo de lectura es equivalenteal de la ROM interna pero en escritura es mas lenta. Es como una EPROM conla salvedad de que se borra electricamente; de esta forma se facilita su uso.

La memoria Flash contiene una capacidad de 32 Kbytes organizado en 512filas de 64 bytes con un tamano de sector de borrado de ocho filas (512 bytes).

La matriz del Flash puede ser leıdo, ya sea como bytes, es decir alineados,o palabras mal alineadas. El tiempo de acceso para la lectura es, un ciclo debus para un byte y palabra alineados, y dos ciclos de bus para las palabras malalineadas.

4.2 Mapa de memoria

El mapa de memoria de la memoria se puede ver en la figura 4.1. La arqui-tectura HCS12 esta organizada en lugares de la matriz del Flash en direccionesentre 0x4000 y 0xFFFF, que corresponde a tres paginas de 16 Kbyte. El registroFPROT se puede configurar para proteger globalmente el conjunto completo deFlash. Tiene tres areas separadas, una a partir de la direccion de arranque(calledlower); una en la direccion final (called higher), y el resto de las direccionespueden ser activados para la proteccion. En la figura exibe las direcciones cu-biertas por estas regiones de proteccion. La direccion superior esta destinada

17

Page 28: Matriz de LEDs + Interfaz Grafica con GTK en Linux

18 CAPITULO 4. MANEJO DE LA MEMORIA EEPROM

principalmente para mantener el codigo del gestor de arranque. La direccion dezona baja se puede utilizar para la emulacion de EEPROM en un MCU sin unmodulo de memoria EEPROM, ya que se puede dejar sin proteccion, mientrasque el resto de direcciones estan protegidos. Ajustes por omision de proteccion,ası como informacion de seguridad que permite que el MCU restringa el accesoal modulo de Flash se describe en la Tabla 4.1.

Chapter 18 32 Kbyte Flash Module (S12FTS32KV1)

506 MC9S12C-Family / MC9S12GC-Family Freescale SemiconductorRev 01.24

Figure 18-2. Flash Memory Map

Flash RegistersMODULE BASE + 0x0000

0xFF00–0xFF0F (Flash Configuration Field)

MODULE BASE + 0x000F

0x8000

Flash Protected Low Sectors512 bytes, 1, 2, 4 Kbytes

FLASH_START = 0x4000

0x4800

0x4200

0x5000

16K PAGED

MEMORY

0x3E

003E 0x3F

Note: 0x3E–0x3F correspond to the PPAGE register content

FLASH_END = 0xFFFF

0xF800

0xF000

0xC000

0xE000 Flash Protected High Sectors2, 4, 8, 16 Kbytes0x3F

0x4400

Flash Array

16 bytes

Figura 4.1: Mapa de memoria de la Flash

Page 29: Matriz de LEDs + Interfaz Grafica con GTK en Linux

19

Flash Address Size (bytes) Description

0xFF00–0xFF07 8 Backdoor Key to unlock security0xFF08–0xFF0C 5 Reserved

0xFF0D 1 Flash Protection byte0xFF0E 1 Reserved0xFF0F 1 Flash Security/Options byte

Cuadro 4.1: Configuracion del espacio de la flash

4.3 Programacion de la EEPROM

La programacion de la EEPROM se realiza por medio del registro PPROG.Antes de ver las rutinas de control hay que estudiar el funcionamiento de laEEPROM, aunque solo de manera superficial, lo mınimo para que se entiendanluego las rutinas de control.

En una EEPROM el estado de un byte borrado o en su caso “no progra-mado” tiene un valor de $FF, es decir sus bits a nivel alto. La programacionpermite pasar a “0” ( nivel bajo) los bits que estan a “1” (nivel alto), pero noal reves, si se quiere poner un bit a uno (estando previamente a cero) hay queborrar todo el byte primero. Si por el contrario se quiere pasar de “1” a “0” nohace falta borrar todo el byte primero. En resumen, siempre que hay que grabarun “1” en una celda EEPROM que previamente estaba a “0” hay que borrarlaprimero.

La programacion requiere una sobrecarga de tension, aunque no hay quepreocuparse de esto puesto que la proporciona el microcontrolador de formatransparente al usuario. Lo que si que hay que tener en cuenta es que la veloci-dad de programacion es mas lenta que la velocidad de lectura, por lo tanto entreprogramacion y programacion hay que introducir unos retardos. Estos retardosson variables y dependen de la velocidad de reloj E.

Cuanto menor sea el valor de E ( frecuencia de reloj ) la efectividad de lasobrecarga disminuye 1 . Por esa razon el micro incorpora un pequeno osciladorRC interno que puede generar los tiempos de programacion necesarios indepen-dientemente del reloj externo (E).

Motorola recomienda que cuando se trabaje con E < 1MHz activar el os-cilador RC para programar la EEPROM. Para activar ese oscilador hay queactuar sobre el bit CSEL del registro OPTION2. En la siguiente tabla se pre-

1La eficiencia de la sobrecarga disminuye con el incremento de tiempo necesario para borrary grabar la posicion de eeprom.

2Cuando se activa el bit CSEL hay que esperar 10ms hasta que se estabilice el circuito.

Page 30: Matriz de LEDs + Interfaz Grafica con GTK en Linux

20 CAPITULO 4. MANEJO DE LA MEMORIA EEPROM

senta un esquema sobre los tiempos de programacion.

E = 2MHz Tiempo de escritura / borrado de 10ms1MHz < E < 2MHz Tiempo de escritura / borrado entre (10ms− 20ms)

E < 1MHz Activar oscilador interno y mantener tiempo de 20ms

Cuadro 4.2: Tiempos de programacion de la memoria EEPROM

4.3.1. Lectura

Para leer la EEPROM el bit EELAT del registro PPROG debe estar acero. Cuando este bit esta a cero el resto de bits del registro dejan de tener sig-nificado o efecto. La lectura de la EEPROM se realiza como la de una memoriaROM normal.

Al realizar un RESET sobre el microcontrolador el estado de este bit es cero,la EEPROM queda configurada para lectura.

4.4 Implementacion

Para la implementacion se llevaron a cabo varias pruebas la mayorıa sin exi-to alguno, en este proceso se ha encontrado una application note hecho porfreescale para el uso en un hcs12, llevando a cabo algunas modificaciones, sepudo realizar este modulo, el manual de ayuda se puede encontrar el siguienteLINK, donde explica detalladamente los registros a ser configurados y funcionesque lo realizan; con lo leıdo anteriormente se puede entender como se hace elproceso de programacion de la EEPROM.

Una vez que haya pasado ese tiempo podemos realizar operaciones sobre la EEPROM.

Page 31: Matriz de LEDs + Interfaz Grafica con GTK en Linux

Bibliografıa

[1] Ucontrol, Electronica en General Pics en Particu-lar,www.ucontrol.com.arrevista0003ucontrol revista 0003.pdf

Electronica en General Pics en Particular Ed. Mayo 2008

Consultado el 7 de setiembre de 2011

[2] Programacion de Microcontroladores

http://www.neoteo.com/tutorial-programacion-de-microcontroladores-3260

Consultado el 10 de setiembre de 2011

[3] Tutorial:Puerto serie en Linux

http://www.iearobotics.com/wiki/index.php?title=Tutorial:Puerto serie en Linux

Consultado el 20 de setiembre de 2011

[4] Manual de Referencia

HCS12 Microcontrollers

MC9S12C Family MC9S12GC Family

21