Anda di halaman 1dari 9

CONTROL DE PERIFÉRICOS CON COMPUTADOR BÁSICO EN BASE A

MICROPROCESADOR MOTOROLA 6800 (PRIMERA PARTE)

En esta guía se aprenderá a controlar los siguientes dispositivos periféricos:

 LED
 BOTON O PULSADOR
 SENSOR DIGITAL (DE RESPUESTA 1 o 0)
 MOTOR DC (PREVIA ETAPA DE PUENTE H)
 MOTOR PASO A PASO (PREVIA ETAPA DE AMPLIFICACION DE CORRIENTE)
 SENSOR ANALÓGICO (PREVIA ETAPA DE CONVERSION A/D)

Se debe tomar en cuenta que el diseño de computador básico con el que se cuenta para esta práctica
solo cuenta con dos puertos paralelos de 8 bits y un puerto serie con protocolo RS-232.

Para que ésta práctica sea más dinámica, se contará con un simulador de dicho diseño de
computador básico, como se muestra en la figura:

Este nos ayudará a verificar los resultados de las codificaciones realizadas.

 LED
a) Encender un led.-
El objetivo de esta práctica cambiar a estado alto todos los bits del puerto B
Para ello, debe dimensionarse que bits necesitamos que sean entradas y que bits salidas; en
este caso todo el puerto B debe ser salidas. También debe determinarse que bits deben
encenderse; en este caso todos.
255 decimal
11111111 binario
11111111 FF hexadecimal

Se escribirá el siguiente código:

;stac desde dir 00 hasta 0F


;puerto A dir 8000; puerto B dir 8002
;rom dir E000 a FFFF, ram dir 0000 a 07FF
;----------INICIO DE PROGRAMA EN ROM----------
.org $E000 ; comenzar a escribir instrucciones en la dir E000
lds #$0F ; puntero stac cargado en la dir 000F
;-----------variables-------
cra .equ $8001
pa .equ $8000
crb .equ $8003
pb .equ $8002
;----------nombrar puertos PIA----
clra
staa cra ;ingresar a configuracion pines pa
ldaa #%00000000 ; 0  entrada
staa pa ; pa como entrada
ldaa #04 ;no hay interrupciones
staa cra ;salir de configuracion pines pa

clra
staa crb ;ingresar a configuracion pines pb
ldaa #%11111111 ; 1 salida
staa pb ; pb como salida
ldaa #04 ;no hay interrupciones
staa crb ;salir de configuracion pines pb
;-----programa principal-----

inicio:
ldaa #255
staa pb
jmp inicio
;---------VECTORES DE INTERRUPCION-----------------

.org $FFFE ;reset


.byte $E0
.byte $00
.end
.end

Se puede apreciar en el área de “nombrar puertos” se dimensionó todo el puerto B como salida
En el área de “programa principal” se cargó el acumulador A con el número 255 decimal y ese
número se guardó al registro pb; esto equivale a escribir el número 11111111 binario en el puerto B.
El resto de las áreas deben escribirse siempre, para darle un mayor orden y óptimo funcionamiento
del programa
En el simulador se apreciará:

Se puede apreciar que al dimensionar el puerto B como salida, en el simulador no se habilitan los
botones para el puerto B, esto a que una salida no puede modificarse exteriormente. Además el
simulador ha puesto en color rojo intenso a todos los bits del puerto B, lo cual representa que todos
están en estado alto. Si se conecta a cada bit, una resistencia en serie a un led con cátodo a tierra, se
podrá apreciar que queda encendido.
b) Encender leds pares de un puerto
En esta práctica se cambiará a estado alto solo los pines pares del puerto B.
85 decimal
01010101 binario
01010101 55 hexadecimal

Como el programa hace casi lo mismo, solo se debe modificar una instrucción en el área de
“programa principal”

;-----programa principal-----

inicio:
ldaa #85
staa pb
jmp inicio

Si se quiere escribir el número en binario o hexadecimal, debería hacerse de la siguiente manera:


;-----programa principal-----

inicio:
ldaa #%01010101
staa pb
jmp inicio

;-----programa principal-----

inicio:
ldaa #$55
staa pb
jmp inicio

A menudo se irá mezclando los tres tipos de escritura para que el programa sea más fácil de
entender para el programador.
En el simulador se podrá apreciar:

c) Parpadeo de un led.
Esta práctica tiene como objetivo lograr mantener en estado alto a todo el puerto B, y luego de
0,5 segundos llevarlo a estado bajo, repitiendo este proceso infinitamente

0 decimal 255 decimal


00000000 binario 11111111 binario
11111111 00 hexadecimal 00000000 FF hexadecimal

0,5 seg

Se va a necesitar además una subrutina de retardo o DELAY de aproximadamente 0,5 segundos.

Se propone el siguiente código:

;stac desde dir 00 hasta 0F


;puerto A dir 8000; puerto B dir 8002
;rom dir E000 a FFFF, ram dir 0000 a 07FF
;----------INICIO DE PROGRAMA EN ROM----------
.org $E000 ; comenzar a escribir instrucciones en la dir E000
lds #$0F ; puntero stac cargado en la dir 000F
;-----------variables-------
cra .equ $8001
pa .equ $8000
crb .equ $8003
pb .equ $8002
;----------nombrar puertos PIA----
clra
staa cra ;ingresar a configuracion pines pa
ldaa #%00000000 ; 0  entrada
staa pa ; pa como entrada
ldaa #04 ;no hay interrupciones
staa cra ;salir de configuracion pines pa

clra
staa crb ;ingresar a configuracion pines pb
ldaa #%11111111 ; 1 salida
staa pb ; pb como salida
ldaa #04 ;no hay interrupciones
staa crb ;salir de configuracion pines pb
;-----programa principal-----

inicio:
ldaa #255
staa pb
jsr delay_500m
clra
staa pb
jsr delay_500m
jmp inicio
;---------SUBRUTINAS----------------------
delay_500m:
;clr equ a 256 en bucle
clr $0010 ;(b)6~
ldab #194 ;(c)4~
stab $0011 ;(d)5~
loop1:
dec $0010 ;(e)6~
bne loop1 ;(f)4~

dec $0011 ;(g)6~


bne loop1 ;(h)4~
rts ;(i)5~

;(f+e)x256=2560
;~t=b+c+d+(h+g+2560)x194+i=498600~
; crital osc de 4 MHz equ a 1 us por ciclo de trabajo
;tiempo delay=1usx498600=0,49s
;---------VECTORES DE INTERRUPCION-----------------

.org $FFFE ;reset


.byte $E0
.byte $00
.end
.end

Se puede apreciar que se agregó una nueva área llamada “subrutinas” debajo de “programa
principal”, en los comentarios de la subrutina “delay_500m” se hizo el cálculo para que dicho
retardo dure 0,5 segundos aproximadamente.

El programa principal se modificó de tal modo que el puerto B esté en estado alto y luego de 0,5
segundos pase a estado bajo, luego espera otros 0,5 segundos y repite la secuencia.

0,5 seg

Si se quisiera realizar retardos de mayor tiempo utilizando la subrutina de 0,5 segundos de retardo,
se podría hacer lo siguiente:

 Repetir la subrutina cuantas veces sea necesario. Si se desea un retardo de 3 segundos, en el


programa principal debe escribirse 6 veces la subrutina delay_500m

inicio:
ldaa #255
staa pb
jsr delay_500m
jsr delay_500m
jsr delay_500m
jsr delay_500m
jsr delay_500m
jsr delay_500m
clra

 Se podría crear otra subrutina donde un contador repita las veces que sea necesario la
subrutina de delay_500m; por ejemplo si se desea un delay de 20 segundos, se tendría que
repetir 40 veces la subrutina delay_500m

;-----programa principal-----
inicio:
ldaa #255
staa pb
jsr delay_20s
jmp inicio

;---------SUBRUTINAS----------------------
delay_20s:
clr cont
for_1-40:
jsr delay_500m
inc cont
ldaa cont
cmpa #40
bne for_1-40
rts
;----------------------------------------------------------------
delay_500m:
;clr equ a 256 en bucle
clr $0010 ;(b)6~
ldab #194 ;(c)4~
stab $0011 ;(d)5~
loop1:
dec $0010 ;(e)6~
bne loop1 ;(f)4~

dec $0011 ;(g)6~


bne loop1 ;(h)4~

rts ;(i)5~
ACTIVIDADES:

 Realizar un parpadeo de leds en el puerto B de tal modo que 1 segundo queden encendidos
los bits pares y apagados los bits impares, luego durante 3 segundos queden encendidos los
bits impares y apagados los bits pares, repitiendo este proceso de manera cíclica.
 Cambiar la configuración de puertos de modo que puerto A y B estén como salidas.
Además realizar un parpadeo de modo que el puerto A permanezca con todos los bits
encendidos durante 5 segundos y el puerto B completamente apagado. Después de ese
tiempo, en el puerto A se debe apagar los 4 bits menos significativos, y deben encenderse
los 4 bits más significativos del puerto B, durante 5 segundos. Luego debe apagarse por
completo todo el puerto A, y debe encenderse por completo el puerto B por 5 segundos.
Finalmente ambos puertos deben apagarse y permanecer así por otros 5 segundos,
repitiendo el proceso de manera cíclica.