Otros Microcontroladores1
Otros Microcontroladores1
Otros Microcontroladores1
OTROS MICROCONTROLADORES
Ya que se han visto los microcontroladores de Microchip, ahora se estudiaran los fabricados
por Fresacele. Este fabricante tiene microcontroladores que se pueden dividir por el bus de
datos que maneja así como lo menciona Vesga en su libro Microcontroladores Motorola
1
VESGA F. Juan Carlos. Microcontroladores Motorola Freescale. Bogotá : AlfaOmega, 2007, p. 16, 17.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
181
Tabla 25. Comparación entre algunos Microcontroladores de 8 Bit´s. Freescale.
además se pueden realizar las mismas aplicaciones que se realizaron en los capítulos 3 y 4 bajo
el microcontrolador PIC16F62A. El lector podrá observar que estas aplicaciones pueden servir
para los otros mencionados que se analizaron en la tabla 25, solo hay que tener en cuenta el
5.2. MC68HC908JK1
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
182
2
Figura 45. Distribución de pines del MC68HC908JK1.
partes de esta: entre las posiciones 0000 H hasta 003F H se encuentran los registros de I/O, los
cuales mas adelante se explicaran; entre las posiciones 0080 H hasta 00FF H se encuentran la
Memoria RAM (la cual es de 128x 8 bits, es decir 128 Bytes, es donde el usuario almacena los
datos temporales dentro del proceso del programa); entre las posiciones F600 H hasta FBFF H
se encuentran la Memoria ROM (la cual es de 1536 x 8 bits, es decir 1536 Bytes, es donde esta
El lector podrá interpretar y explorar las de más posiciones del mapa de memoria. Por el
algunos de los registros que posee este microcontrolador, sin embargo para mayor información
2
Freescale [Internet] [consultado 13 Abril de 2009]. Disponible en
http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC68HC908JL3.pdf .
3
Freescale [Internet] [consultado 13 Abril de 2009]. Disponible en
http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC68HC908JL3.pdf .
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
183
0000 H
Registros I/O
003F H
0040 H
Reservado
007F H 64 Bytes
0080 H
RAM
128 Bytes
00FF H
0100 H
No implementado
F5FF H
F600 H ROM
FLASH
FBFF H 1536 Bytes
FC00 H
Monitor ROM2
FDFF H 512 Bytes
FE00 H Registros de
Control y
FE0F H de Estados
FE10 H Monitor ROM1
447 Bytes
FFCE H
FFD0 H Vectores para la FLASH
FFFF H 48 Bytes
4
Figura 46. Distribución de Memoria del MC68HC908JK1.
4
Freescale [Internet] [consultado 13 Abril de 2009]. Disponible en
http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC68HC908JL3.pdf .
5
Ibid., p. 46.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
184
REGISTRO X: Es un registro de 8 bits que permite hacer el direccionamiento indexado, ó
REGISTRO H:X: Es este par de registros H y X forman 16 bits, se usan para direccionamiento
indexado y también se puede usar como puntero de memoria 6 con el cual se puede cubrir todo
REGISTRO CCR (CONDITION CODE REGISTER): Este registro es el que contiene las
V 1 1 H I N Z C
BIT 7 BIT 6 BIT 5 BIT 4 BIT 3 BIT 2 BIT 1 BIT 0
BIT 7: V: (OVERFLOW) BIT DE REBOSAMIENTO DE SIGNO. ES DECIR CUANDO SE SALE DEL RANGO -128
A 127 ASÍ:
1 REBOSAMIENTO
0 NO REBOSAMIENTO.
6
Ibid., p. 46.
7
Ibid., p. 46.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
185
0: EL RESULTADO DE UNA OPERACIÓN ARITMÉTICA O LÓGICA NO DA CERO.
distribuidas en tres Puertos (PTA, PTB, PTD), el Puerto A tiene solo un bit (A6), el Puerto B
tiene 8 bits (B7 a B0), el Puerto D tiene 5 bits (D2 a D6). Para controlarlos como entrada o
salida tiene los registros de control, DDRA, DDRB, DDRD, los cuales controlan
003FH están los registros de I/O, pero sin ser específicos, para ello se puede mirar la figura 47
donde se muestran los 8 primeros registros con su respectiva dirección y bits; por lo pronto se
explicaran estos registros a medida que se avance en programación se verán otros registros de
este grupo, además el lector podrá explorar por su cuenta. Hay que mencionar que los
bancos, tanto los Puertos (PTX) como los controladores (DDRX) están en el mismo banco.
Para programar una línea de salida se le garantiza uno (1) y para programarla de entrada se le
Microchip.
0001H PTB PTB7 PTB6 PTB5 PTB4 PTB3 PTB2 PTB1 PTB0
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
186
0002H __ __ __ __ __ __ __ __
0005H DDRB DDRB7 DDRB6 DDRB5 DDRB4 DDRB3 DDRB2 DDRB1 DDRB0
0006H __ __ __ __ __ __ __ __
8
Figura 47. Distribución de Puertos y Controladores de puertos del MC68HC908JK1.
necesario ver las instrucciones. En el capitulo 3 se mencionó que este fabricante esta en el
grupo CISC, por ende son muchas las instrucciones que tiene, el lector podrá darse cuanta que
efectivamente es muy complicado explicar en detalle todas las instrucciones, entonces a medida
que se hagan ejemplos se explicarán las que se van usando. La tabla 26 se muestran las
instrucciones explicadas según Vesga9; las cuales fueron tomadas del datasheet del
microcontrolador 10.
Recordar que en los microntroladores de Microchip existe el registro W, para los de Freescale
es el A (Acumulador).
8
Freescale [Internet] [consultado 13 Abril de 2009]. Disponible en
http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC68HC908JL3.pdf .
9
Ibid., p. 46.
10
Freescale [Internet] [consultado 13 Abril de 2009]. Disponible en
http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC68HC908JL3.pdf .
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
187
11
Tabla 26. Set instrucciones del MC68HC908JK1.
11
Freescale [Internet] [consultado 13 Abril de 2009]. Disponible en
http://www.freescale.com/files/microcontrollers/doc/data_sheet/MC68HC908JL3.pdf .
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
188
Mask del Registro de Banderas (CCR) es Cero
BMI REL Salta a una subrutina o etiqueta (REL) si el resultado de una 3
operación es Negativo
BMS REL Salta a una subrutina o etiqueta (REL) si el Bit del Interrupt 3
Mask del Registro de Banderas (CCR) es Uno
BNE REL Salta a una subrutina o etiqueta (REL) si no hay cero 3
BPL REL Salta a una subrutina o etiqueta (REL) si es resultado de una 3
operación es positivo
BRA REL Salta a una etiqueta (REL) siempre 3
BRCLR N,OPR,REL Salta a una subrutina o etiqueta (REL) si es el Bit (N) de un 5
registro (OPR) esta en Cero (CLR).
BRN REL Nuca salta a subrutina o etiquete (REL) 3
BRSET N,OPR,REL Salta a una subrutina o etiqueta (REL) si es el Bit (N) de un 5
registro (OPR) esta en Uno (SET).
BSET N,OPR Toma un bit (N) de un registro (OPR) y lo pone en Uno (SET) 4
BSR REL Llama a un subrutina (REL) 4
CBEQ OPR,REL 5
CBEQA #OPR,REL 4
CBEQX #OPR,REL Compara el valor del Registro A con el valor del registro (OPR) 4
CBEQ OPR,X+,REL y salta a una etiqueta o subrutina (REL) si son iguales 5
CBEQ X+REL 4
CBEQ OPR,SP,REL 6
CLC Pone Cero en el Bit del Carry 1
CLI Pone Cero en el Bit del Interrupt Mask. (Habilita las 2
interrupciones).
CLR OPR 3
CLRA 1
CLRX 1
CLRH Poner 00h en el registro 1
CLR OPR,X 3
CLR ,X 2
CLR OPR,SP 4
CMP #OPR 2
CMP OPR Compara el valor del registro A con un Registro 3
CMP OPR,X A – (M) 3
CMP ,X 2
CMP OPR,SP 4
COM OPR 4
COMA 1
COMX 1
COM OPR,X Complemento 4
COM ,X 2
COM OPR,SP 5
CPHX #OPR Compara el valor de H:X con el valor almacenado en registro 3
CPHX OPR OPR o con el valor de OPR 4
CPX #OPR 2
CPX OPR Compara el valor del registro X con un Registro 3
CPX ,X X – (M) 3
CPX OPR,X 3
CPX OPR,SP 4
DAA Ajustar a decimal el registro A (A10) 2
DBNZ OPR,REL 5
DBNZA REL 3
DBNZX REL Decrementa (Resta en uno) el registro (OPR, A, X, SP) y salta a 3
DBNZ OPR,X,REL una etiqueta o subrutina (REL) si no es cero 5
DBNZ X,REL 4
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
189
DBNZ OPR,SP,REL 6
DEC OPR 4
DECA 1
DECX Decrementa (Resta en uno) el registro (OPR, A, X, SP) 1
DEC OPR,X 4
DEC ,X 3
DEC OPR,SP 5
DIV División así: A = H:A/X 7
A = Cociente (Resultado), H = Residuo
EOR #,OPR 2
EOR OPR OR EXCLUSIVA Así: 3
EOR OPR,X A= A OPR 4
EOR ,X 2
EOR OPR,SP 4
INC OPR 4
INCA 1
INCX Incrementa (Suma uno) el registro (OPR, A, X, SP) 1
INC OPR,X 4
INC ,X 3
INC OPR,SP 5
JMP OPR 2
JMP OPR,X Salto a una dirección OPR 4
JMP ,X 2
JSR OPR 4
JSR OPR,X Salta a una subrutina 6
JSR ,X 4
LDA #OPR 2
LDA OPR Carga en el registro A el valor (#OPR) o el dato almacenado en 3
LDA OPR,X OPR 4
LDA ,X 2
LDA OPR,SP A ← (M) 4
LDHX #OPR Carga en el registro H:X el valor (#OPR) o el dato almacenado 3
LDHX OPR en OPR 4
H:X ← M:M
LDX #OPR 2
LDX OPR Carga en el registro X el valor (#OPR) o el dato almacenado en 3
LDX OPR,X OPR 4
LDX ,X 2
LDX OPR,SP X ← (M) 4
LSL OPR 4
LSLA Rota a la Izquierda el Registro así: 1
LSLX C b7 b0 1
LSL OPR,X 0 4
LSL ,X 3
LSL OPR,SP 5
LSR OPR 4
LSRA Rota a la Derecha el Registro así: 1
LSRX b7 b0 C 1
LSR OPR,X 0 4
LSR ,X 3
LSR OPR,SP 5
MOV OPR,OPR 5
MOV OPR,X Mueve así 4
MOV #OPR,OPR Destino ← Fuente 4
MOV X+,OPR 4
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
190
MUL Multiplicación sin signo así: 5
A x X = X:A
NEG OPR 4
NEGA 1
NEGX Complemento a uno 1
NEG OPR,X 4
NEG ,X 3
NEG OPR,SP 5
NOP No hace nada 1
Toma los cuatro bits de mayor peso del registro A y los
intercambia con los cuatro bit de menor peso así:
NSA 3
A= 7 4 3 0
ORA #OPR 2
ORA OPR Hace la operación lógica OR entre el Registro A y el valor 3
ORA OPR,X (#OPR) o el dato almacenado en OPR, así: 4
ORA ,X 2
ORA OPR,SP A ← A OR (M) 4
PSHA Inserta el Registro A en SP 2
PSHH Inserta el Registro H en SP 2
PSHX Inserta el Registro X en SP 2
PULA Saca el Registro A en SP 2
PULH Saca el Registro H en SP 2
PULX Saca el Registro X en SP 2
ROL OPR 4
ROLA Rota a la Izquierda el Registro con Carry así: 1
ROLX C b7 b0 1
ROL OPR,X 4
ROL ,X 3
ROL OPR,SP 5
ROR OPR 4
RORA Rota a la Derecha el Registro con Carry así: 1
RORX b7 b0 C 1
ROR OPR,X 4
ROR ,X 3
ROR OPR,SP 5
RPS Resetea el SP asi: SP ← FF 1
RTI Retorna de una Interrupción 7
RTS Retorna de una subrutina 4
SBC #OPR 2
SBC OPR Resta con Carry, así 3
SBC OPR,X 3
SBC ,X A = A - (M) – C 2
SBC OPR,SP 4
SEC Poner Uno (Set) al bit Carry del registro CCR, así: C ← 1 1
SEI Poner Uno (Set) al bit Interrupt Mark del registro CCR, así: 2
I ← 1. (Deshabilita las interrupciones).
STA OPR 3
STA OPR,X Almacenar A en M, así 3
STA ,X M ← A 2
STA OPR,SP 4
STHX OPR Almacenar HX en OPR 4
STOP Habilita el pin IRQ, y Para el Oscilador 1
STX OPR 3
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
191
STX OPR,X Almacenar X en M, así 3
STX ,X M ← X 2
STX OPR,SP 4
SUB #OPR 2
SUB OPR Resta sin Carry, así 3
SUB OPR,X 3
SUB ,X A = A - (M) 2
SUB OPR,SP 4
SWI Interrupción de Software 9
TAP Transferir el Registro A al Registro CCR, así: 2
CCR ← A
TAX Transferir el Registro A al Registro X, así: 1
X← A
TPA Transferir el Registro CCR al Registro A, así: 1
A ← CCR
TST OPR 3
TSTA 1
TSTX Hacer test si la cantidad es Cero o Negativo 1
TST OPR,X 3
TST ,X 2
TST OPR,SP 4
TSX Transferir el Registro SP al Registro H:X, así: 2
H:X ← SP
TXA Transferir el Registro X al Registro A, así: 1
A← X
TXS Transferir el Registro H:X al Registro SP, así: 2
SP ← H:X
Donde:
A = Acumulador SP = Stack Pointer
M = Dato o valor almacenado H:X = Registro para direccionamiento Indexado de 16 bits
C = Carry REL = Una etiqueta cualquiera, (Una subrutina)
OPR = Registro (8 ó 16 Bits) N = Cualquier bit
X = Registro para direccionamiento Indexado de 8 bits # OPR = Valor inmediato
5.5. PROGRAMACIÓN.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
192
Para programar y simular los programas de los microcontroladores de Freescale se usara
CodeWarrior.
Paso 2. Hacer un diagrama de conexiones. Hay que decir en cual de las 15 líneas de In/Out, del
microcontrolador se va a poner el led. Se puede tomar B3, así como el ejemplo 8. (En los
punto anterior. Hay que programar B3 como salida para el led. Ver diagrama 33.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
193
La subrutina tiempo es la misma de los anteriores programas por ende no se hace el diagrama
INICIO
1 = B3 Prende el LED
Llamar TIEMPO
0 = B3 Apaga el LED
Llamar TIEMPO
Paso 4: Una vez hecho el diagrama de flujo hay que pasarlo a instrucciones. A continuación se
desarrollara el diagrama de flujo bloque por bloque: Cuando se construye un nuevo proyecto se
hace la definición del microcontrolador, para ello se usa CodeWarrior versión 5.9 o en otra
versión superior. Para abrir este programa ir por Inicio/Todos los programas/Freescale
CodeWarrior/CW for Microcontrolles V6.0/Code Warrior IDE, así como lo muestra la figura
48a. Una vez abierto el programa hacer clic en Create New Project, como se observa en la
figura 48b.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
194
48 a 48 b
Después hay que escoger el microcontrolador en el cual se va a realizar el programa, así que
hay que buscar la familia HC08 y allí la familia JK/JL y por ultimo en la lista seleccionar el
MC68HC908JK1, como se observa en la figura 49a, además hay que seleccionar Full Chip
49 a 49 b
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
195
En la ventana que aparece, allí seleccionar Relocateble Assembly; en la casilla Project Name
escribir el nombre del proyecto, en la figura 49b se muestra esto; el lector puede tener una
carpeta para sus proyectos, para ello puede ir por Location y allí seleccionar la carpeta
Es en ese momento es donde se crea el proyecto, así como se muestra en la figura 50a, para
iniciar a escribir hacer clic en mian, y en la ventana que se abre hay una plantilla, que es donde
se escribe el programa del usuario. El lector podrá observar tres óvalos azules en la figura 50b,
el primero es donde el usuario puede definir los registros para su uso, el segundo es donde se
programan los puertos, el tercero es donde se escribe el programa principal y las subrutinas.
50 a 50 b
Ahora se hace la definición de los registros del Usuario, recordar que puede iniciar en la
Tener en cuanta que para este compilador asignar una posición en Hexadecimal se le antepone
el signo pesos ($), además que hay usar los dos puntos después del registro así:
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
196
CON1: EQU $80 ; REGISTROS PARA LA SUBRUTINA TIEMPO
CON2: EQU $81
Ahora hay que programar B3 como salida para el led, recordar que los registros de control
Observe que se uso la instrucción BSET, esta tiene el siguiente formato: BSET n,opr; lo que
hace es tomar un bit que lo representa n, de un registro cualquiera que lo representa opr y lo
pone en uno (SET), de esta forma se programa la línea 3 del Puerto B como salida.
El siguiente bloque del diagrama de flujo es prende el led y allí es donde inicia el programa
principal para lo cual la plantilla asigna una etiqueta o nivel que la llama mainLoop, figura 49b,
para prender el led se usa la misma instrucción anterior pero con la diferencia que se pone en
Siguiendo el diagrama de flujo ahora hay que llamar tiempo para que el ojo humano pueda
observar el led prendido para ello se usa la instrucción BSR rel; la cual se usa para llamar una
subrutina; tener en cuanta que puede usar esta instrucción siempre y cuando el salto no supere
las 128 posiciones tanto arriba como abajo desde donde se este llamando.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
197
Posteriormente hay que apagar el led, para ello se usa la instrucción BCLR n,opr; esta lo que
hace es tomar un bit que lo representa n, de un registro cualquiera y lo representa opr y lo pone
en cero, así:
Aquí nuevamente se llama tiempo para poder dejar el ojo humano pueda observar el led
apagado así:
Según el diagrama de flujo hay que regresar a prender el led, es decir hasta aquí es el programa
principal, para ello se usa la instrucción BRA rel; la cual se usa para hacer saltos
incondicionales a cualquier parte del programa, para esta caso se salta a mainLoop así:
De esta forma ya se escribió el programa principal, solo queda por hacer la subrutina tiempo,
por ende siguiendo el diagrama 3 hay que cargar los registros contadores CON1 y CON2, para
ello se usa la instrucción MOV opr,opr, la cual mueve un valor cualquiera (ya se hexadecimal,
o en decimal o en binario) a cualquier registro. Para entender un poco mas esto se puede
observar la tabla 24 en la cual se muestra como se usa esta instrucción para cargar el valor 77
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
198
Forma de uso de la instrucción Explicación
MOV #$4D,CON1 Mueve el valor 64 en
Hexadecimal al registro CON1
MOV #77t,CON1 Mueve el valor 100 en Decimal al
registro CON1
MOV #%01001101,CON1 Mueve el valor 01100100 en
Binario al registro CON1
MOV #’M’,CON1 Mueve el valor ASCII de la letra
M (01001101) al registro CON1
El lector puede observar como se escribió la instrucción, es decir que primero se escribe el
Entonces siguiendo el diagrama 3 se carga 30H y 20H a los registros CON1 y CON2
respectivamente así:
TIEMPO:
MOV #$30,CON1 ; MUEVE EL VALOR 30 H AL REGISTRO CON1.
N1:
MOV #$20,CON2 ; MUEVE EL VALOR 20 H AL REGISTRO CON2.
Note que hay la etiqueta N1, que según el diagrama de flujo es donde se regresa a cargar
Siguiendo el diagrama hay que restar en uno el CON2 y preguntar si es cero, para ello se usa la
instrucción DBNZ opr,rel; la cual decrementa (resta en uno cualquier registro, que lo
representa opr) y salta si no es cero (salta a una etiqueta que la representa rel), así:
N2:
DBNZ CON2,N2 ; CON2 – 1 = C0N2, SI NO ES CERO SALTA A N2
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
199
Ahora hay que restar en uno el CON1 y preguntar si es cero, para ello la misma instrucción
anterior así:
Por ultimo se usa la instrucción RTS para retornar al programa principal desde la subrutina
TIEMPO así:
Ahora que se escribió el programa desarrollando cada una de las partes del diagrama de flujo a
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
200
Una vez escrito todo el programa ya se puede compilar, usando el icono MAKE, así como se
muestra en la figura 51a, cuando se hace clic el aplicativo compila; cuando hay errores se abre
una ventana donde indica cada uno de ellos; así que hay que corregirlos hasta que no se tenga
exitosamente se procede hacer la simulación del programa para lo cual se pude hacer clic en
Al hacer clic en DEBUG se abre el True-Time Simulator & Real Time Debuger, en la figura
52 se muestra. El lector puede darse cuanta cuales son los icono para la simulación, estos están
en un ovalo rojo, o también puede hacerla por teclado usando F11, que es paso a paso.
Antes de iniciar la simulación es bueno explicar algunas de las ventanas, Source es donde se
donde se puede ver el estado de los registros, entre ellos el A (acumulador), PC (contador de
programa), Status (registro de estados), entre otros, Memory es donde se observa el estados de
51 a 51 b
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
201
Figura 52. Ventanas de simulación.
El lector puede entonces ir ejecutado el programa paso a paso usando la tecla F11, e ir
verificando como van cambiando los registros involucrados en el programa y de esa forma ver
si el programa esta haciendo lo debe hacer, para este caso prender y apagar un led.
Paso 5. Programar el microcontrolador, armar el circuito y probar. En este paso hay que tener
cuidado cuando se este cableando en el protoboard, para ello hay que saber la distribución del
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
202
Ejemplo 22. Tomar el ejemplo 9 y acondicionarlo para el microcontrolador MC68HC908KJ1.
adicionar siete leds mas en el puerto B para poder hacer el juego de luces.
Paso 2. Como se mencionó en el punto anterior se trabajará todo el puerto B para los 8 leds. El
programador entenderá que le puede agregar al circuito anterior los siete led´s restantes.
Paso 3. Diagrama de flujo: Hay que programar todo el PORTB como salida para los 8 leds.
Para controlar la rotación tanto para la derecha como para la izquierda se pueden usar las
instrucciones de rotación con carry, tanto para izquierda como para la derecha, ver tabla 23;
entonces solo es preguntar por el Carry, de esa forma se puede tener control de las rotaciones.
El Puerto B inicia con 0000 0001 en binario para cuando rota a la izquierda y cuando va a la
Paso 4. El programa se puede observar después del diagrama 34, note que la subrutina de
tiempo es la misma del ejemplo anterior, si se desea que se mas rápido o mas lento el juego de
luces, solo se aumenta o disminuye el valor a los contadores desde 00 H a FFH. Una ves digitado
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
203
el programa se puede compilar para posteriormente poderlo simular, de esa forma el se puede
El lector podrá darse cuenta que las instrucciones nuevas que se usarán en este programa son
las de rotación tanto a la izquierda como a la derecha las cuales se muestran a continuación
respectivamente así:
BCC REL ; Salta a una subrutina o etiqueta (REL) si el Bit del Carry del
; Registro de Banderas (CCR) es Cero
INICIO
LUCES
01 = PUERTO B
IZQ
Llamar TIEMPO
NO
CARRY = 1
SI
80 =(STATUS)
PUERTO B
DER
Llamar TIEMPO
NO
CARRY = 1
SI
(STATUS)
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
204
Una vez explicadas las nuevas instrucciones que se usarán solo queda escribir el programa
completo así:
Paso 5. Programar el microcontrolador, armar el circuito y probar. En este paso hay que tener
cuidado cuando se este cableando en el protoboard, para ello hay que saber la distribución del
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
205
Con los dos ejemplos anteriores se trabajo manejo de puertos solo de salida a partir del
siguiente ejemplo se van a realizar ejercicios tanto de entra como de salida con ello se puede
microcontroladores.
Paso 2. Para este ejercicio se pude tomar la misma distribución del ejemplo 10, es decir, B1
Paso 3. Diagrama de flujo: Según lo planteado en el punto anterior hay que programar B1 como
salida para el led y B4 como entrada para el pulsador. Ver diagrama 35.
Diagrama 35. Programa que prender y apagar un led con dos velocidades. Ejemplo 23.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
206
INICIO
LED
VEL 1
B4 = 1
VEL 2
NO SI
1 = B1 1 = B1
0 = B1 0 = B1
Como se mencionó en el ejemplo 10 hay dos subrutinas de retardo las cuales son: TIEMPO 1 y
Paso 4. El programa es el siguiente; note los valores diferentes en los contadores para las
subrutinas de tiempo.
Para el desarrollo este programa se uso una instrucción que no se había trabajado la cual es:
BSET n,opr,rel
Esta instrucción permite preguntar por un bit (que lo representa (n)) de un registro (que lo
indicado por (opr)) si esta uno (SET), si lo es salta a una subrutina (rel), de lo contrario no
salta, es decir ejecuta la siguiente instrucción. Para el caso de este ejemplo es la que permite
Estos microcontroladores también tienen la posibilidad de preguntar por si un bit es cero (CLR)
la instrucción es:
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
207
BCLR n,opr,rel
Esta instrucción funciona lo contrario a la interior, es decir que salta a una etiqueta (rel) si el bit
TIEMPO2:
MOV #$50,CON1 ; MUEVE EL VALOR 30 H AL REGISTRO CON1.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
208
N1:
MOV #$60,CON2 ; MUEVE EL VALOR 20 H AL REGISTRO CON2.
N2:
DBNZ CON2,N2 ; CON2 – 1 = C0N2, SI NO ES CERO SALTA A N2
DBNZ CON1,N1 ; CON1 – 1 = C0N1, SI NO ES CERO SALTA A N1
RTS ; RETORNA AL PROGRAMA PRINCIPAL
Paso 5. Programar el microcontrolador, armar el circuito y probar. En este paso hay que tener
cuidado cuando se este cableando en el protoboard, para ello hay que saber la distribución del
Paso 1. En el ejemplo 11 se utilizó y se explicó como funciona un display de ánodo común, por
lo tanto no se explica.
Paso 2. Para este ejercicio se usara el Puerto B así como se uso en el ejemplo 11, desde B 0
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
209
Paso 3. Diagrama de flujo: Hay que usar el Puerto B de salida, justamente el diagrama de flujo
36 muestra como es esto y como sacar los datos, lo que hay que recordar es que estos datos son
los que se observan en la tabla 12. Note que el diagrama no esta completo, el lector puede
Diagrama 36. Programa para visualizar los números decimales del 0 al 9 en un Display 7 Segmentos.
Ejemplo 24.
INICIO
Llamar TIEMPO
79H = PUERTO B
Llamar TIEMPO
24H = PUERTO B
Llamar TIEMPO
30H = PUERTO B
Llamar TIEMPO
Paso 4. El programa es el siguiente. La subrutina de tiempo sigue siendo igual a los ejemplos
anteriores.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
210
BSR TIEMPO ; TIEMPO PARA VER EL DATO
feed_watchdog
BRA CERO
TIEMPO:
MOV #$30,CON1 ; MUEVE EL VALOR 30 H AL REGISTRO CON1.
N1:
MOV #$20,CON2 ; MUEVE EL VALOR 20 H AL REGISTRO CON2.
N2:
DBNZ CON2,N2 ; CON2 – 1 = C0N2, SI NO ES CERO SALTA A N2
DBNZ CON1,N1 ; CON1 – 1 = C0N1, SI NO ES CERO SALTA A N1
RTS ; RETORNA AL PROGRAMA PRINCIPAL
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
211
Paso 5. Programar el microcontrolador, armar el circuito y probar. En este paso hay que tener
cuidado cuando se este cableando en el protoboard, para ello hay que saber la distribución del
Paso 1. A esta altura el lector ya sabrá como funciona un display multiplexado, claro que si aun
Paso 2. Hay que decir en cuales de las 15 líneas del microcontrolador se va a poner los 7
segmentos de todos los display y en cuales los comunes. Se puede tomar el PUERTO B para
los segmentos y el PUERTO D para los comunes, (desde D2 hasta D5), es decir estos dos
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
212
Paso 3. Diagrama de flujo: Como se esta trabajando con el mismo display del ejemplo 12, por
tanto sirven los mismos códigos de la tabla 16 en la cual se pueden apreciar los códigos en
hexadecimal que debe sacar el microcontrolador por el PUERTO B para poder ver la palabra
HOLA.
Solo queda por plantear el diagrama de flujo el cual se puede observar en el diagrama 37,
observe el orden para sacar los códigos de cada letra mediante el PUERTO B, la forma como se
habilita los comunes de los display mediante el PUERTO D, y el tiempo que se da para ver
cada una.
Diagrama 37. Programa para visualizar la palabra hola en 4 display de 7 segmentos. Ejemplo 25.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
213
INICIO
1 = D5
Llamar TIEMPO
0 = D5
1 = D4
Llamar TIEMPO
0 = D4
1 = D3
Llamar TIEMPO
0 = D3
1 = D2
Llamar TIEMPO
0 = D2
programas; como se digo en el ejemplo 12 hay que tener cuenta los valores de los contadores
pues no pueden ser muy grandes ni muy pequeños pues si son lo primero se visualizaría letra
feed_watchdog
BRA HOLA
TIEMPO:
MOV #$30,CON1 ; MUEVE EL VALOR 30 H AL REGISTRO CON1.
N1:
MOV #$20,CON2 ; MUEVE EL VALOR 20 H AL REGISTRO CON2.
N2:
DBNZ CON2,N2 ; CON2 – 1 = C0N2, SI NO ES CERO SALTA A N2
DBNZ CON1,N1 ; CON1 – 1 = C0N1, SI NO ES CERO SALTA A N1
RTS ; RETORNA AL PROGRAMA PRINCIPAL
Paso 5. Programar el microcontrolador, armar el circuito y probar. En este paso hay que tener
cuidado cuando se este cableando en el protoboard, para ello hay que saber la distribución del
visualizar la frase PRUEBA DEL PUBLIC - HOLA., En el mismo montaje del ejemplo
25.
Paso 1. En los ejemplos 12, 13 y 23, se trabajo con cuatro display de ánodo común
Paso 3. Para hacer el diagrama de flujo, diagrama 33, se sigue la misma secuencia del ejemplo
13 la cual es: primero se llama la subrutina ROTAR, diagrama 9, luego se carga el código de la
letra en el registro D1, y por último se llama la subrutina VER, diagrama 10.
Lo mismo que en el ejemplo 13 a cada display se le asignará un registro de la RAM, los cuales
El lector podrá leer en ejemplo 13 cual es la función de las subrutinas ROTAR y VER, ya que
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
216
Diagrama 33. Programa para visualizar una frase completa en 4 display de 7 segmentos. Ejemplo 24
INICIO
0CH = D1
2FH = D1
41H = D1
06H = D1
03H = D1
programas con los mismos valores del anterior ejemplo. Note que el programa no está completo
En el ejemplo 21 se explico como usar la instrucción BSR rel; para llamar una subrutina;
siempre y cuando el salto no supere las 128 posiciones tanto arriba como abajo desde donde se
este llamando, como este programa es mas largo se hace necesario usar otra instrucción para
llamar subrutinas la cual es JSR OPR, donde OPR representa la Subrutina donde se quiere
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
217
saltar (etiqueta). Y para realizar el retorno desde la subrutina se usa misma instrucción RTS tal
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
218
MOV #$06,D1
JSR VER
feed_watchdog
JMP OTRO
ROTA:
MOV D3,D4 ; D3 = D4
MOV D2,D3 ; D2 = D3
MOV D1,D2 ; D1 = D2
RTS
VER:
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
219
MOV #$20,CON3
VER_1:
MOV D1,PTB ; SE VISUALIZA LO QUE TINE D1
BSET 2,PTD
BSR TIEMPO
BCLR 2,PTD
DBNZ CON3,VER_1
RTS
;
TIEMPO:
MOV #$30,CON1 ; MUEVE EL VALOR 30 H AL REGISTRO CON1.
N1:
MOV #$20,CON2 ; MUEVE EL VALOR 20 H AL REGISTRO CON2.
N2:
DBNZ CON2,N2 ; CON2 – 1 = C0N2, SI NO ES CERO SALTA A N2
DBNZ CON1,N1 ; CON1 – 1 = C0N1, SI NO ES CERO SALTA A N1
RTS ; RETORNA AL PROGRAMA PRINCIPAL
quede prendiendo y pagado un led estilo el ejemplo 6. La frase puede estar distribuida así:
Paso 1. En el ejemplo 17 se explico como funciona una LCD de 16 X 2, por ende este paso ya
se cumplió.
Paso 2. La distribución del circuito puede ser de la siguiente forma: el Puerto B para el bus de
la LCD, así: B0 con DB0 (pin 7), B1 con DB1 (pin 8), y así sucesivamente; y las líneas de
en D4.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
221
Paso 3. Así como en el ejemplo 17 se van a crear varias subrutinas las cuales van a ser citas por
el programa principal, diagrama 34, (el diagrama no está completo el lector podrá completarlo
siguiendo la secuencia), en este lo primero que se hace es programar los puertos luego da un
tiempo.
INICIO
LLAMAR TIEMPO 33 mS
LLAMAR PRENDE_LCD
LLAMAR LÍNEA_1
“LETRA P” = A
LLAMAR DATO
“LETRA R” = A
LLAMAR DATO
LLAMAR LÍNEA_2
“LETRA C” = A
LLAMAR DATO
“LETRA O” = A
LLAMAR DATO
1 = D4
LLAMAR TIEMPO 30 mS
0 = D4
LLAMAR TIEMPO 30 mS
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
222
Posteriormente llama una subrutina de PRENDER_LCD la cual se encarga de configurar y
prender la LCD, diagrama 35, luego llama la subrutina LÍNEA_1 en la cual se selecciona la
línea 1 de la LCD posición 00H, diagrama 36, luego se carga el dato en ASCII en el registro A,
luego se usa la subrutina DATO la cual se encarga de enviar el dato a la LCD y se repite el
PRENDE_LCD
0 = D2 (RS)
0 = D3 (E)
TRANMISIÓN A 8 BITS
LCD DE 2 LÍNEAS
CARÁCTER 5X7
„00111000‟ = PORTB
1 = D3 (E)
0 = D3 (E)
DISPLAY ON
CUERSOR OFF
PARPADEO OFF
„00001100‟ = PORTB
1 = D3 (E)
0 = D3 (E)
RETORNAR
la LCD posición 40H, diagrama 37. Por ultimo se garantiza que un led prenda y apague
indefinidamente, con ello se prueba que la LCD un vez reciba el dato lo mantiene hasta que se
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
223
Diagrama 36. Subrutina LÍNEA 1. Ejemplo 25.
LÍNEA_1
0 = D2 (RS)
1 = D3 (E)
POSICIÓN 00H
EN LINEA 1
„10000000‟ = PORTB
TIEMPO 3 mS
0 = D3 (E)
RETORNAR
LÍNEA_2
0 = D2 (RS)
1 = D3 (E)
POSICIÓN 40H
EN LINEA 2
„11000000‟ = PORTB
TIEMPO 3 mS
0 = D3 (E)
RETORNAR
DATO
1 = D2 (RS)
1 = D3 (E)
A = PORTB
TIEMPO 80 µS
0 = D3 (E)
RETORNAR
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
224
Paso 4. El programa es el siguiente, (en este caso el programa está completo para todas las
letras). Las subruintas de tiempo son las mismas que se han usado en los programas anteriores
pero con valores necesarios para cumplir con los requerimientos de tiempos de la LCD.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
225
LDA #'a' ; SE CARGA EL CÓDIGO ASCII DE LA LETRA a
JSR DATO ; SE VISUALIZA EN LA LCD
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
226
LDA #'o' ; SE CARGA EL CÓDIGO ASCII DE LA LETRA o
JSR DATO ; SE VISUALIZA EN LA LCD
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
227
LDA #'8' ; SE CARGA EL CÓDIGO ASCII DEL NUMERO 8
JSR DATO ; SE VISUALIZA EN LA LCD
PRENDE_LCD:
BCLR 2,PTD ; RS=0
BCLR 3,PTD ; E=0
MOV #%00111000,PTB ; 0011 1000; TRANSMISIÓN EN 8 BIT, LCD DE 2 LÍNEAS,
; CARÁCTER 5X7
LINEA_1:
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
228
JSR TIEMPO_3ms: ; SE DA TIEMPO DE 3 MILISEGUNDOS
LINEA_2:
DATO:
TIEMPO_3ms:
TIEMPO_80mics:
Paso 5. Programar el microcontrolador, armar el circuito y probar. En este paso hay que tener
cuidado cuando se este cableando en el protoboard, para ello hay que saber la distribución del
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
230
Ejercicios 5
3) Hacer un juego de luces que valla 3 veces de izquierda a derecha y 5 veces de derecha a
izquierda.
6) Hay cinco motores 12 VDC cada uno tiene un pulsador con el cual se puede apagar o prender.
Al iniciar todos los cinco motores están prendidos, si se desea apagar alguno de ellos, por
ejemplo el motor 2, pues se pulsa el pulsador dos, los otros motores siguen prendidos, si se
quiere prenderlo pues vuelve oprimir el pulsador, con los otros sucede lo mismo.
7) Hay una tejedora que tiene un motor 12 V DC, el cual mueve un cabezal; tiene dos microswich
una a la izquierda y otro a la derecha. Se desea que el cabezal valla a la derecha y al izquierda,
es decir simular el movimiento de coser. Hay un led indicador el cual funciona permanente
mente.
8) Diseñar un programa que controle un motor paso a paso de 1.8 grados por paso así: Hay un
pulsador, cuando se oprima este el motor gira así:
Gira 281 grados a la derecha, luego dos vueltas a la izquierda, luego una vuelta a la derecha y
por ultimo 90 a la izquierda y al final el motor para. Hay un led de testigo. Cuando se vuelve a
pulsar inicia nuevamente.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
231
9) En el ejemplo 20 se trabajo con un potor paso a paso de cuatro bobinas, de 1.8 grados por
paso, de 5Vdc y cuatro pulsadores ubicados en cruz, figura 42. Se desea que una LCD
visualize en la Linéa 1 los grados que gira el motor y en la Línea 2 el sentido de giro (Derecha
ó Isquierda)
11) Agregarle un semáforo peatonal a al ejercicio anterior. Este deber ser visualizado en un
Matriz bicolor así: cuando el peatón no bebe caminar el semáforo mostrara un monacho en rojo
quieto; cuando el peatón puede caminar el monacho esta en verde caminado (animación);
cuando el tiempo se este terminado el monacho debe caminar mas rápido y ponerse ámbar y
cuando el tiempo se acabe debe pasar a rojo y quieto.
__________________________________________________________________________
“Diseños NEFEPEQUIN” 05/04/2010
232