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
ii
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
iv INDICE GENERAL
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
vi INDICE DE FIGURAS
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
viii INDICE DE CUADROS
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
x INDICE DE CUADROS
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
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.
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.
4 CAPITULO 1. ESPECIFICACIONES DEL PROYECTO
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
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.
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
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.
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){
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.
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
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.
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);
}
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);
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.
16 CAPITULO 3. MANEJO DEL PUERTO SERIE
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
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
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.
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.
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