ASCII en Matriz de LEDs: Guía Completa
ASCII en Matriz de LEDs: Guía Completa
UPIITA
Código ASCII 3
Problema 1 5
Introducción 6
Descripción del problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Solución en diagrama de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
Marco teórico 7
Memorias . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Formato Intel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 7
Checksum . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Problema 2 13
Introducción 14
Descripción del problema . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Solución en diagrama de flujo . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Marco teórico 15
Configuración de puertos en AVR y 8051 . . . . . . . . . . . . . . . . . . . . . . . 15
Interrupciones externas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
Configuración de timers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Comunicación serial . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
Atención de interrupciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
1
Diseño del circuito y esquemático . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Configuración . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Timer 0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Timer 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Interrupciones externas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
UART . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
Diseño del circuito y esquemático . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Conclusión 33
Anexos 35
Problema 1 Formato Intel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
2
Código ASCII
3
El codigo ASCII (Código Estándar Estadounidense para el Intercambio de Información)
es un estándar de codificación de caracteres basado en el alfabeto latino usado en el ingles
actual. El código ASCII fue publicado como estándar por primera vez en 1967 y en la actua-
lidad utiliza 7 bits para la codificación de caracteres; del total de 128 caracteres, solamente
los últimos 95 son imprimibles, siendo los primeros 32 caracteres de control.
Dc Hx Ch Dc Hx Ch Dc Hx Ch Dc Hx Ch Dc Hx Ch Dc Hx Ch
32 20 Sp1 48 30 0 64 40 @ 80 50 P 96 60 ‘ 112 70 p
33 21 ! 49 31 1 65 41 A 81 51 Q 97 61 a 113 71 q
34 22 ” 50 32 2 66 42 B 82 52 R 98 62 b 114 72 r
35 23 # 51 33 3 67 43 C 83 53 S 99 63 c 115 73 s
36 24 $ 52 34 4 68 44 D 84 54 T 100 64 d 116 74 t
37 25 % 53 35 5 69 45 E 85 55 U 101 65 e 117 75 u
38 26 & 54 36 6 70 46 F 86 56 V 102 66 f 118 76 v
39 27 ’ 55 37 7 71 47 G 87 57 W 103 67 g 119 77 w
40 28 ( 56 38 8 72 48 H 88 58 X 104 68 h 120 78 x
41 29 ) 57 39 9 73 49 I 89 59 Y 105 69 i 121 79 y
42 2A * 58 3A : 74 4A J 90 5A Z 106 6A j 122 7A z
43 2B + 59 3B ; 75 4B K 91 5B [ 107 6B k 123 7B {
44 2C , 60 3C < 76 4C L 92 5C \ 108 6C l 124 7C |
45 2D - 61 3D = 77 4D M 93 5D ] 108 6D m 125 7D }
46 2E . 62 3E > 78 4E N 94 5E ˆ 109 6E n 126 7E ∼
47 2F / 63 3F ? 79 4F O 95 5F 110 6F o
1
Espacio
4
Problema 1
5
Introducción
Inicio
Carácter = botonera
Caractér en Matriz
Figura 1: Algoritmo 1
6
Marco teórico
Memorias
La memoria es un circuito integrado de alta densidad puramente convinacional. Posee m
entradas llamadas Adress que van desde A0 hasta Am−1 , tiene n salidas llamadas Data que
van desde D0 hasta Dn−1 y tiene diversas señales de control que varian segun la variatne
tecnologica, pero que pueden ser CS (Chip select), OE (output enable). W E (output enable),
W/W (Read or write).
Formato Intel
Intel Hex es un formato que representa información binaria por medio de caracteres
ASCII; es utilizado para la programación de microcontroladores EEPROMs y otros tipos de
dispositivos lógicos programables. La estructura de una linea en el formato Intel Hex es la
siguiente:
Longitud del registro Dos dı́gitos hexadecimales que representan la longitud del campo
de datos.
Tipo de registro2 Dos dı́gitos hexadecilames que definen el tipo de campo de datos.
:050360007F3E003F7F1D
2
00 Datos
01 Fin de archivo
7
Checksum
Los dos dı́gitos del check sum corresponden a los dos dı́gitos menos significativos del
complemento a dos de la suma de los campos anteriores, Como ejemplo se verificara el
checksum de la linea Intel anterior.
05 + 03 + 60 + 00 + 7F + 3E + 00 + 3F + 7F = 01E3
Tomando el complemento a dos del resultado anterior
F F F F F F F F F F F F F E1C + 1 = F F F F F F F F F F F F F E1D
En sistemas donde el calculo del checksum se ve limitado por el numero de bits manejado
(por ejemplo en excel) se puede trabajar de igual forma con los últimos dos dı́gitos.
N ot(E3) + 1 = 1C + 1 = 1D
8
Solución con memoria AT28C256
Programa
La codificación de los sı́mbolos ASCII en la matriz y la linea Intel correspondiente se
obtuvieron por medio de Excel. Como ejemplo se muestra la codificación del carácter “H”.
1 0 0 0 1
1 0 0 0 1
Matriz en 1 0 0 0 1 El campo “Direccion” en la linea Intel, correspon-
representación
binaria (Imagen a 1 1 1 1 1 de a la dirección donde se encuentra guardado el
desplegar) 1 0 0 0 1 dato de la primera columna de la matriz.
1 0 0 0 1
A10 − A14 A3 − A9 A2 A1 A0 Dir
1 0 0 0 1
0 48HEX 0 0 0 0240
0 1 1 1 0
Representación
decimal del dato 0 2 2 2 0 Tabla 3: Campo Dirección
guardado en 0 4 4 4 0
memoria (La El tipo de registro corresponde a 00 y la longitud
interfaz entre la 0 0 0 0 0
de registro corresponde a 05 ya que se guardara un
memoria y la 0 16 16 16 0
matriz es un buffer
carácter por linea; el campo Checksum se verifica
inversor) 0 32 32 32 0 por medio de Excel.
0 64 64 64 0 Los campos obtenidos para cada caso se juntan en
un solo string para copiarlos posteriormente a un
Hex en Memoria 00 77 77 77 0
documento de texto.
Campo de datos 0077777700
9
Dir 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F
0000H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.. .. ..
. . .
00F0H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
0100H FF FF FF FF FF FF FF FF 7F 7F 20 7F 7F FF FF FF
0110H 7F 78 7F 78 7F FF FF FF 6B 00 6B 00 6B FF FF FF
.. .. ..
. . .
03F0H 73 7D 73 6F 73 FF FF FF FF FF FF FF FF FF FF FF
0400H FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF FF
.. .. ..
. . .
U2 AT28C256
QA
A0
QB
A1
QC
A2
IO1 U3 SN74LS540N
A3
IO2
A4 E1
IO3 GND
A5 E2
IO4 M1 GMM12057ASB
A6
IO5 R1
A7 I/O0 D1 Y1 A1
IO6
A8 I/O1 D2 Y2 A2
IO7
A9 I/O2 D3 Y3 A3
A10 I/O3 D4 Y4 A4
IO[1..7]
IO[1..7] A11 I/O4 D5 Y5 A5
A12 I/O5 D6 Y6 A6
A13 I/O6 D7 Y7 A7
R7
C1
C2
C3
C4
C5
A14 I/O7 D8 Y8
WE
OE
CE
VCC
GND
D0
D1
D2
D3
D4
D5
D6
D7
D8
D9
U4
DM7442AN
A
D
B
C
QA
QB
QC
QA
Q[1..3] QB
U1 HD74LS293 QC
QA GND
R0(2) QA
QB
R0(1) QB
QC
QC
B QD
555 A
10
VCC
U1
R1
RST OUT 555
DIS
THR
TRI
CON
R2 NE555
C1 C2
GND
El Bus IO comunica a la memoria con una tarjeta a través de la cual se ingresa el valor
del carácter a desplegar. Cuando QA QB y QC son 0, se tiene la dirección base del carácter y
el dato correspondiente en la memoria. Por medio de U3 y U5 se enciende la primera columna
de la matriz M1 . Al aumentar el contador U1 la dirección en la memoria cambia ası́ como la
salida del decodificador U4 , encendiendo la siguiente columna de la matriz; el contador sigue
aumentando y cambiando la columna activa de M1 hasta llegar al valor 5 donde se reinicia.
Al realizar el cambio con una frecuencia suficientemente alta, el ojo percibirá una imagen
fija en la matriz M1 . La frecuencia adecuada para una sola columna seria de 25 cuadros por
segundo; para las 5 columnas se necesita entonces una frecuencia de 125 cuadros por segundo
marcada por medio de un Oscilador NE555.
Resistencias R1 a R7
VU 3 − VU 4 − VM 1
Ri =
iM 1
11
Segun hojas de datos
iM 1 = 11.66mA
Ri 120Ω
C1 = 0.1µF propuesto
R1 27KΩ
R2 43KΩ
C1 0.1µF
C2 0.01µF
12
Problema 2
13
Introducción
Nombre = 0 Si
Nombre = 0
Letra = 0
Nombre = Buffer Letra = 0
Play=0
Letra = 0
Si
T=0
No
Letra=0 Nombre = 3
Desplagar Nombre[Letra]
if (Play == 1)
Latra = 0
∼Play
Esperar 2s Nombre++
Letra = 0
Si
No
Play/Stop Letra++ Latra>Max Boton
Figura 4: Algoritmo 2
14
Marco teórico
uint8_t C ;
uint8_t A ;
A =0 xFF ;
En cambio en un AVR como el ATMEGA8515 la configuración de los puertos I/O debe por
software. Los registros clave para la configuración de estos puertos son.
Interrupciones externas
Las interrupciones externas permiten esperar y reaccionar ante un evento en un pin
especifico de un puerto sin tener que realizar esta acción mediante el procesador. Pueden
monitorear uno de los siguientes eventos según su configuración
En el caso del 8051 solo es posible activar la interrupción por Nivel balo o flanco bajo. En
un AVR es posible monitorear cualquiera de los eventos anteriores en un pin, incluso cunado
este es utilizado como salida. Los registros importantes para su configuración son:
8051 AVR
• TCON • MCUCR
• IE • GICR
15
Configuración de timers
Los aspectos básicos para la configuración de un Timer son los siguientes
Modo de operación.
Fuente del pulso de reloj.
Offset.
En el caso de un 8051 y el ATMEGA8515 los registros que controlan la configuración de
timers son los siguientes
8051
• TMOD configuración de modo de operación (en este caso incluye la fuente del pulso
de reloj)
• TL0 y TH0 para establecer un offset en el caso del timer 0
• TCON entre otras funciones, habilita los distintos timers
ATMEGA8515 en el caso del Timer 1
• TCCR1A primer registro de control que establece el modo de operación e inicia el
timer.
• TCC1B segundo registro de control que establece la fuente del pulso de reloj
• TCNT1H y TCNT1L para establecer un offset.
El offset necesario para un timer puede determinarse como
T imerM ax − Cuenta requerida = of f set
en el caso de que la cuenta requerida sea mayor a la cuenta máxima del timer se busca hacer
iteraciones con un numero uniforme de pulsos.
Comunicación serial
La comunicación serial consiste en el envı́o de información de manera secuencial, ésto es,
un bit a la vez y a un ritmo acordado entre el emisor y el receptor. Los parámetros de este
protocolo son los siguientes:
Bit de start de la comunicación.
Bits de datos transmitidos.
Bit de paridad, utilizado para comprobar la información en casos de ruido eléctrico.
Bits de stop de la comunicación.
Baud Rate: velocidad de la transmisión en baudios (bits por segundo).
16
En el ATMEGA8515 los registros importantes para la configuracion de la unidad USART
(universal synchronous asynchronous receiver and transmitter) encargada de la comunicación
serial son los siguientes:
SCON SBUF
Los registros importantes para la generación del Boudrate son los siguientes
• T2CON • BRDCON
Atención de interrupciones
Para que un microprocesador atienda automáticamente una interrupción, ya sea externa
o provocada por una unidad funcional, la unidad VIC (vector interrupt controller) debe
encontrarse habilitada y configurada para atender la bandera correspondiente. Asimismo
la unidad funcional que se busca atender debe encontrarse configurada para generar una
bandera de interrupción.
En el caso de los microprocesadores 8051 las unidades funcionales generan una banderas
automáticamente. La habilitación de la unidad VIC y su configuración (refiriéndose a las
interrupciones que serán atendidas) se controla por medio del registro IE.
Para el caso del ATMEGA8515 la atención de interrupciones se controla por medio de
distintos registros. El registro SREG contiene el bit que habilita la atención de interrupciones.
Por su parte las unidades funcionales poseen registros que configuran el tipo de bandera
generada por la unidad (estas unidades funcionales son más complejas que las de un 8051 y
pueden generar banderas en distintos casos). En el caso de los timers por ejemplo se tiene el
registro TIMSK para el control de las banderas.
17
Solución con sistema mı́nimo
cambio de la matriz.
Programa
# define FIL 0 x8001
# define COL 0 x8000
# define RecargaT0 0 xFBB4 // Recarga Timer 0
# define RecargaT1 0 x3CB0 // Recarga Timer 1
18
// Nombres a d e s p l e g a r
code char Names [] =
{ " Hugo Alejandro Jimenez Garcia / Tania Herrera Serna / Angelica Estefania Gonzales Mayen / " };
code uint8_t col_sel [5]={0 x00 ,0 x01 ,0 x02 ,0 x04 ,0 x08 }; // C o l u m n a s de la matriz
code uint8_t Name_start [3]={0 ,30 ,50}; // Inicio de los nombres en NAMES
data uint8_t cont_col ; // Columna activa de la matriz
data uint8_t cont_car ; // Numero de c a r á c t e r del nombre
data uint8_t cont_name ; // Nombre d e s p l e g a d o en la matriz
data uint8_t caracter ; // C a r á c t e r d e s p l e g a d o en la matriz
data uint8_t Play ; // Estado del sistema
data uint8_t rep_mtx ; // C o n t a d o r de i t e r a c i o n e s para cambio de letra
data char serial ; // C a r á c t e r del serial
if ( Play == 1){
Play = 0;
cont_car = 0;
cont_col = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ];
TCON . B6 = 0;
}
else {
Play = 1;
cont_col = 0;
rep_mtx = 0;
TH1 = RecargaT1 > >8&&0 x00FF ;
TL1 = RecargaT1 &&0 x00FF ;
TCON . B6 = 1;
}
19
}
void Next_name () iv IVT_ADDR_EX1 { // Next
cont_name ++;
if ( cont_name == 3) cont_name =0;
cont_car = 0;
cont_col = 0;
rep_mtx = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ];
}
void Select_name () iv IVT_ADDR_ES { // S e l e c c i o n a r nombre
if ( SCON . B0 == 1){
Serial = SBUF ;
switch ( Serial ){
case ’1 ’: cont_name = 0; cont_col = 0; rep_mtx = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ]; break ;
case ’2 ’: cont_name = 1; cont_col = 0; rep_mtx = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ]; break ;
case ’3 ’: cont_name = 2; cont_col = 0; rep_mtx = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ]; break ;
default : break ;
} SCON . B0 = 0;}
}
void conf_maq (){
TMOD = 0 x11 ;
TH0 = RecargaT0 > >8&&0 x00FF ;
TL0 = RecargaT0 &&0 x00FF ;
TH1 = RecargaT1 > >8&&0 x00FF ;
TL1 = RecargaT1 &&0 x00FF ;
TCON . B4 = 1;
TCON . B6 = 0;
// C o n f i g u r a c i ó n Timers
TCON . B0 = 1;
TCON . B2 = 1;
// C o n f i g u r a c i ó n i n t e r r u p c i o n e s
SCON = 0 x50 ;
T2CON = 0 x30 ;
RCAP2H = 0 xFF ; // 9600 baudios con cristal de 12 MHz
RCAP2L = 0 xD9 ;
T2CON . B2 = 1;
// C o n f i g u r a c i ó n UART
IE =0 x9F ;
}
void init_var (){
rep_mtx = 0;
cont_car = 0;
cont_col = 0;
cont_name = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ];
Filas = FIL ;
Columnas = COL ;
* Filas = ASCII [( caracter -0 x20 )*5+ cont_col ];
* Columnas = Col_sel [ cont_col ];
Play = 0;
serial = ’ ’;
}
20
Diseño del circuito y esquemático
Configuración
Timer 0
En este caso el Timer 0 se ocupa cambiar la columna activa en la matriz del mismo modo
el el contador en el problema 1. Se necesita una frecuencia de al menos 125Hz, por lo que es
necesaria una interrupción cada 0.008s. Se configura como un timer de 16 bits. El puso de
reloj que llega a este es de 1MHz (fOscilador /12), entonces
0.008
= 800 < 216
0.000001
Por lo tanto
of f set = 216 − 800 = 6473610 = 0xF CE0
Timer 1
En este caso el Timer 1 se ocupa para la espera de 2s para el cambio de carácter. Se
configura como un timer de 16 bits. El puso de reloj que llega a este es de 1MHz (fOscilador /12)
por lo que se necesitan contar dos millón de pulsos para que pasen dos segundo. Ya que
es necesario realizar varias iteraciones para hacer la cuenta. En este caso son convenientes
40 iteraciones de 5 × 104 pulsos. Por lo tanto
Interrupciones externas
Las interrupciones externas INT0 e INT1 se encuentra programadas para atender flancos
negativos en los pines P3.2 y P3.3 respectivamente.
UART
En este caso la UART se encuentra trabajando en Modo 1 (8 bits de datos, 1 bit de start
y 1 bit de stop). En este caso el Baudrate se genera por medio del Timer 2; El offset utilizado
genera un Baudrate de 9600 baudios con el cristal de 12MHz.
21
Diseño del circuito y esquemático
U9
10 3 0
A Q0
13 14 1
R10 12
B Q1
2 2
C Q2
11 15 3
10k SISTEMA MINIMO D Q3
1 4
MODULO BLUETOOTH Q4
6
Q5
0
1
2
3
4
7
RXD RST PA0 Q6
VT52, VT100, ANSI 4
PA1 Q7
RX RX 9
TXD RXD PA2 Q8
5
TXD PA3 Q9
RTS INT0 PA4
74HC4028
Xmodem, Ymodem, Zmodem
INT1 PA5
CTS T0 PA6
T1 PA7 U11
2 18 Q0
P1.0 PB0 D0 Q0
3 17 Q1
P1.1 PB1 D1 Q1
4 16 Q2
P1.2 PB2 D2 Q2
5 15 Q3
P1.3 PB3 D3 Q3
6 14 Q4
P1.4 PB4 D4 Q4
7 13 Q5
P1.5 PB5 D5 Q5
8 12 Q6
P1.6 PB6
9
D6 Q6
11 R1 R2 R3 R4 R5 R6 R7
C1 P1.7 PB7 D7 Q7 120 120 120 120 120 120 120
1
XTAL1 PC0 OE1
19
1
Q0
Q1
Q2
Q3
Q4
Q5
Q6
Y3 PC3
C2 Y4 PC4
Y5 PC5
2
Y6 PC6
Y7 PC7
15pF
CCT001
Ri 120Ω
3.4V − 0.2V − 1.8V
Ri =
10mA
Ri = 140Ω
22
Solución con AT89S52
Programa
# define Filas P1
# define Columnas P2
# define RecargaT0 0 xFBB4 // Recarga Timer 0
# define RecargaT1 0 x3CB0 // Recarga Timer 1
// Nombres a d e s p l e g a r
code char Names [] =
23
{ " Hugo Alejandro Jimenez Garcia / Tania Herrera Serna / Angelica Estefania Gonzales Mayen / " };
code uint8_t col_sel [5]={0 x00 ,0 x01 ,0 x02 ,0 x04 ,0 x08 }; // C o l u m n a s de la matriz
code uint8_t Name_start [3]={0 ,30 ,50}; // Inicio de los nombres en NAMES
data uint8_t cont_col ; // Columna activa de la matriz
data uint8_t cont_car ; // Numero de c a r á c t e r del nombre
data uint8_t cont_name ; // Nombre d e s p l e g a d o en la matriz
data uint8_t caracter ; // C a r á c t e r d e s p l e g a d o en la matriz
data uint8_t Play ; // Estado del sistema
data uint8_t rep_mtx ; // C o n t a d o r de i t e r a c i o n e s para cambio de letra
data char serial ; // C a r á c t e r del serial
if ( Play == 1){
Play = 0;
cont_car = 0;
cont_col = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ];
TCON . B6 = 0;
}
else {
Play = 1;
cont_col = 0;
rep_mtx = 0;
TH1 = RecargaT1 > >8&&0 x00FF ;
TL1 = RecargaT1 &&0 x00FF ;
TCON . B6 = 1;
}
}
24
if ( cont_name == 3) cont_name =0;
cont_car = 0;
cont_col = 0;
rep_mtx = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ];
}
void Select_name () iv IVT_ADDR_ES { // S e l e c c i o n a r nombre
if ( SCON . B0 == 1){
Serial = SBUF ;
switch ( Serial ){
case ’1 ’: cont_name = 0; cont_col = 0; rep_mtx = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ]; break ;
case ’2 ’: cont_name = 1; cont_col = 0; rep_mtx = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ]; break ;
case ’3 ’: cont_name = 2; cont_col = 0; rep_mtx = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ]; break ;
default : break ;
} SCON . B0 = 0;}
}
void conf_maq (){
TMOD = 0 x11 ;
TH0 = RecargaT0 > >8&&0 x00FF ;
TL0 = RecargaT0 &&0 x00FF ;
TH1 = RecargaT1 > >8&&0 x00FF ;
TL1 = RecargaT1 &&0 x00FF ;
TCON . B4 = 1;
TCON . B6 = 0;
// C o n f i g u r a c i ó n Timers
TCON . B0 = 1;
TCON . B2 = 1;
// C o n f i g u r a c i ó n i n t e r r u p c i o n e s
SCON = 0 x50 ;
T2CON = 0 x30 ;
RCAP2H = 0 xFF ; // 9600 baudios con cristal de 12 MHz
RCAP2L = 0 xD9 ;
T2CON . B2 = 1;
// C o n f i g u r a c i ó n UART
IE =0 x9F ;
}
void init_var (){
rep_mtx = 0;
cont_car = 0;
cont_col = 0;
cont_name = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ];
Filas = ASCII [( caracter -0 x20 )*5+ cont_col ];
Columnas = Col_sel [ cont_col ];
Play = 0;
serial = ’ ’;
}
25
Configuración
Timer 0
En este caso el Timer 0 se ocupa cambiar la columna activa en la matriz del mismo modo
el el contador en el problema 1. Se necesita una frecuencia de al menos 125Hz, por lo que es
necesaria una interrupción cada 0.008s. Se configura como un timer de 16 bits. El puso de
reloj que llega a este es de 1MHz (fOscilador /12), entonces
0.008
= 800 < 216
0.000001
Por lo tanto
of f set = 216 − 800 = 6473610 = 0xF CE0
Timer 1
En este caso el Timer 1 se ocupa para la espera de 2s para el cambio de carácter. Se
configura como un timer de 16 bits. El puso de reloj que llega a este es de 1MHz (fOscilador /12)
por lo que se necesitan contar dos millón de pulsos para que pasen dos segundo. Ya que
es necesario realizar varias iteraciones para hacer la cuenta. En este caso son convenientes
40 iteraciones de 5 × 104 pulsos. Por lo tanto
Interrupciones externas
Las interrupciones externas INT0 e INT1 se encuentra programadas para atender flancos
negativos en los pines P3.2 y P3.3 respectivamente.
UART
En este caso la UART se encuentra trabajando en Modo 1 (8 bits de datos, 1 bit de start
y 1 bit de stop). En este caso el Baudrate se genera por medio del Timer 2; El offset utilizado
genera un Baudrate de 9600 baudios con el cristal de 12MHz.
26
Diseño del circuito y esquemático
0
1
2
3
4
C3
10uF
C1
U1
1
15pF 19 39
XTAL1 P0.0/AD0
X1 P0.1/AD1
38
37
C2 P0.2/AD2
18 36
XTAL2 P0.3/AD3
2
35
P0.4/AD4
CRYSTAL 34
P0.5/AD5
15pF 33
P0.6/AD6
9 32
RST P0.7/AD7 U3 R1 R2 R3 R4 R5 R6 R7
21 10 3 0 120 120 120 120 120 120 120
P2.0/A8 A Q0
22 13 14 1
R9 P2.1/A9
23 12
B Q1
2 2
P2.2/A10 C Q2
29 24 11 15 3
10k PSEN P2.3/A11 D Q3
30 25 1 4
ALE P2.4/A12 Q4
Q0
Q1
Q2
Q3
Q4
Q5
Q6
31 26 6
EA P2.5/A13 Q5
27 7
P2.6/A14 Q6
28 4
U2 P2.7/A15 Q7
9
Q8
Q0 18 2 1 10 RX 5
Q0 D0 P1.0/T2 P3.0/RXD Q9
Q1 17 3 2 11
Q1 D1 P1.1/T2EX P3.1/TXD
Q2 16 4 3 12 74HC4028
Q2 D2 P1.2 P3.2/INT0
Q3 15 5 4 13
Q3 D3 P1.3 P3.3/INT1
Q4 14 6 5 14
Q4 D4 P1.4 P3.4/T0
Q5 13 7 6 15
Q5 D5 P1.5 P3.5/T1
Q6 12 8 7 16
Q6 D6 P1.6 P3.6/WR
11 9 8 17
Q7 D7 P1.7 P3.7/RD
1 AT89C52 MODULO BLUETOOTH
OE1
19
OE2 RXD
VT52, VT100, ANSI
74LS541 RX
TXD
RTS
Xmodem, Ymodem, Zmodem
CTS
Ri 120Ω
3.4V − 0.2V − 1.8V
Ri =
10mA
Ri = 140Ω
27
Solución con ATMEGA8515
matriz.
Programa
# define Filas PortC
# define Columnas PortA
# define RecargaT0 0 x83 // Recarga Timer 0
# define RecargaT1 0 xC2F7 // Recarga Timer 1
28
// Nombres a d e s p l e g a r
code char Names [] =
{ " Hugo Alejandro Jimenez Garcia / Tania Herrera Serna / Angelica Estefania Gonzales Mayen / " };
code uint8_t col_sel [5]={0 x00 ,0 x01 ,0 x02 ,0 x04 ,0 x08 }; // C o l u m n a s de la matriz
code uint8_t Name_start [3]={0 ,30 ,50}; // Inicio de los nombres en NAMES
data uint8_t cont_col ; // Columna activa de la matriz
data uint8_t cont_car ; // Numero de c a r á c t e r del nombre
data uint8_t cont_name ; // Nombre d e s p l e g a d o en la matriz
data uint8_t caracter ; // C a r á c t e r d e s p l e g a d o en la matriz
data uint8_t Play ; // Estado del sistema
data char serial ; // C a r á c t e r del serial
}
}
void Next_name () iv IVT_ADDR_INT1 ics ICS_AUTO { // s i g u i e n t e nombre
cont_name ++;
if ( cont_name == 3) cont_name =0;
cont_car = 0;
cont_col = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ];
}
29
void Select_name () iv I V T _ A D D R _ U S A R T _ R X ics ICS_AUTO {
Serial = UDR ;
switch ( Serial ){
case ’1 ’: cont_name = 0; cont_col = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ]; break ;
case ’2 ’: cont_name = 1; cont_col = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ]; break ;
case ’3 ’: cont_name = 2; cont_col = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ]; break ;
default : break ;
}
}
void init_var (){
cont_car = 0;
cont_col = 0;
cont_name = 0;
caracter = Names [ Name_start [ cont_name ]+ cont_car ];
Filas = ASCII [( caracter -0 x20 )*5+ cont_col ];
Columnas = Col_sel [ cont_col ];
Play = 0;
serial = ’ ’;
}
void conf_maq (){
DDRA =0 xFF ;
PORTA =0 xFF ;
DDRC =0 xFF ;
PORTC =0 xFF ;
DDRD . b2 =0;
PORTD . b2 =1;
DDRD . b3 =0;
PORTD . b3 =1;
// C o n f i g u r a c i ó n de puertos
TCCR0 =0 x03 ;
TCNT0 = RecargaT0 ;
TCCR1A =0 x00 ;
TCCR1B =0 x00 ;
TCNT1H = RecargaT1 > >8&0 x00FF ;
TCNT1L = RecargaT1 &0 x00FF ;
TIMSK =0 x82 ;
// c o n f i g u r a c i ó n de timers
MCUCR +=0 x0A ;
// c o n f i g u r a c i ó n de i n t e r r u p c i o n e s
UCSRA +=0 x02 ;
UCSRB =0 x90 ;
UCSRC =0 x86 ;
UBRRL =0 x0C ;
// C o n f i g u r a c i ó n de USART
SREG =0 x80 ;
GICR +=0 xC0 ;
// General
30
Configuración
Timer 0
En este caso el Timer 0 se ocupa cambiar la columna activa en la matriz del mismo modo
el el contador en el problema 1. Se necesita una frecuencia de al menos 125Hz, por lo que
es necesaria una interrupción cada 0.008s. Este timer es un timer de 8 bits. Por lo que es
necesario recurrir al preescalador para evitar iteraciones; en este caso al preescalador /64
0.008
= 125 < 28
106
1÷
64
Por lo tanto
of f set = 28 − 125 = 13110 = 0x83
Timer 1
En este caso el Timer 1 se ocupa como un timer de 16 bits. A pesar de que el oscilador
interno del 8515 está funcionado a 1MHz, no es necesario realizar iteraciones gracias al
preescalador programable. Un preescalador /64 nos da una cuenta total de 15625 pulsos por
segundo. por lo tanto
Interrupciones externas
Las interrupciones externas INT0 e INT1 se encuentra programadas para atender flancos
negativos en los pines PD2 y PD3 respectivamente.
USART
En este caso la USART se encuentra trabajando con comunicación serial ası́ncrona
estándar (8 bits de datos, 1 bit de start y 1 bit de stop). El offset utilizado genera un
Baudrate de 9600 baudios con el reloj interno de 1MHz.
31
Diseño del circuito y esquemático
U3
10 3 0
0
1
2
3
4
A Q0
13 14 1
B Q1
12 2 2
MODULO BLUETOOTH C Q2
11 15 3
D Q3
1 4
RXD U1 Q4
VT52, VT100, ANSI 6
Q5
1 39 7
TXD PB0/T0/OC0 PA0/AD0 Q6
2 38 4
PB1/T1 PA1/AD1 Q7
3 37 9
RTS PB2/AIN0 PA2/AD2 Q8
4 36 5
Xmodem, Ymodem, Zmodem
PB3/AIN1 PA3/AD3 Q9
5 35
CTS PB4/SS PA4/AD4
6 34 74HC4028
PB5/MOSI PA5/AD5
7 33
PB6/MISO PA6/AD6
8 32
PB7/SCK PA7/AD7 U2
10 21 2 18 Q0
PD0/RXD PC0/A8 D0 Q0
11
PD1/TXD PC1/A9
22 3
D1 Q1
17 Q1 R1 R2 R3 R4 R5 R6 R7
12 23 4 16 Q2
PD2/INT0 PC2/A10 D2 Q2 120 120 120 120 120 120 120
13 24 5 15 Q3
PD3/INT1 PC3/A11 D3 Q3
14 25 6 14 Q4
PD4/XCK PC4/A12 D4 Q4
15 26 7 13 Q5
PD5/OC1A PC5/A13 D5 Q5
16 27 8 12 Q6
PD6/WR PC6/A14 D6 Q6
Q0
Q1
Q2
Q3
Q4
Q5
Q6
17 28 9 11
PD7/RD PC7/A15/TDI D7 Q7
19 31 1
XTAL1 PE0/ICP/INT2 OE1
18 30 19
XTAL2 PE1/ALE OE2
9 29
RESET PE2/OC1B
74LS541
C1 ATMEGA8515
R9
10uF 10k
32
Conclusión
33
Para la solución de estos problemas se estan aprovechando al máximo las capacidades
de los componentes utilizados. Se utilizan prácticamente todas las unidades funcionales de
los microcontroladores para el control de la matriz y sin embargo el espacio disponible para
almacenar información aun es bastante grande. A pesar de que es un programa extenso, la
mayor parte de la memoria ROM utilizada es ocupada por la codificación de los caracteres
(en el caso del problema 1 en la memoria EEPROM esto representa un mı́nimo del espacio
disponible). Esto demuestra que es posible manejar gran cantidad de información y controlar
multitud de situaciones con estos componentes; muy sencillos en comparación al equipo de
computo moderno. En caso de que sea necesario manejar cantidades realmente grandes de
información siempre es posible también establecer una interfaz con un equipo capaz de
manejar este tipo de carga.
En el caso del sistema mı́nimo es interesante ver como el programa es exactamente el
mismo que en el caso del AT89S52. Ya que este microprocesador es la base del sistema
mı́nimo, la configuración es exactamente la misma la diferencia radica en el direccionamiento
a los puertos en los que se ubica la matriz. En el caso del sistema minimo se tienen puertos
en RAM externa por lo que acceder a ellos requiere de más tiempo para el procesador; esto
puede notarse en la simulación del sistema mı́nimo que requiere una cantidad mucho mayor
de recursos que la simulación del AT89S52.
Es claro que el sistema mı́nimo extiende la capacidad del AT89S52. Brinda un espacio
mayor en memoria, la oportunidad de grabar datos en dicha memoria ROM y conservarlos
aun después de ser desactivados y permite ademas un mayor numero de ”Puertos”. La
desventaja radica en la velocidad del proceso y la energı́a utilizada por el mismo.
34
Anexos
35
Problema 1 Formato Intel
Cada linea corresponde a un caracter ASCII del 32 al 126 respectivamente.
36