Está en la página 1de 8

INSTRUCCIONES DEL 8085

SPHL 11111001
Traslada el contenido del par HL al Puntero del Stack. Debe ejecutarse al iniciar el
sistema para ubicar el Stack en la zona elegida de la memo ria
PUSH rp 11RR0101 Guarda el par de registros rp en el Stack

Aqu un ejemplo sencillo de push pop

.org 0000h

lxi h,0500h posicion donde empezara el puntero


sphl el puntero se carga con el valor de hl

como el push y pop trabajan con registros dobles tonces hacemos 2


entradas por 2 puertos

lazo: in 00h
mov b,a el primer numero se almacena en el registro b
in 01h
mov c,a el segundo numero se almacena en el registro c
push b aqu comenzamos a guardar en la direccin 0500h el reg bc

pop b sacamos el valor qsta en la direccin en la q quedo sp


mov a,b
out 00h mostramos b
mov a,c
out 01h mostramos c

call espera
jmp lazo

este retardo espera es para que al momento de ingresar los 2 primeros


nmeros nos de tiempo para ingresar los siguientes 2 numeros y asi
sucesivamente

espera:
mvi d,ffh
lazo2: dcr d
jnz lazo2
ret

CPE LABEL

Existe paridad en un byte si el nmero de unos que tiene es par. El flag de paridad
se pone a 1 para indicar esta condicin. CPE chequea el valor del flag de paridad.
Si tiene un 1, CPE enva el contenido del contador de programa al stack y salta a la
direccin especificada por la instruccin en LABEL. Si el flag tiene un cero, el
programa contina normalmente.

Cdigo Objeto: EC PPQQ

Cantidad de Bytes: 3

Ciclos de ejecucin: 9/18

Flags afectados: --

Modos de direccionamiento: INMEDIATO / REG. INDIR.

.org 0000h

inicio: in 00h
add 00h
jpe lazo2
call lazo
jmp inicio

lazo:
mvi b,05h
lazo3: dcr b
jnz lazo3
ret

lazo2: hlt

JP

La instruccin JP DIR comprueba el estado de flag del signo. Si el contenido


del acumulador es positivo (flag de signo = 0) la ejecucin del programa
contina con la direccin especificada por DIR. Si el contenido del acumulador
es negativo (flag de signo = 1) contina el programa con su ejecucin normal.

.org 0000h

in 00h
mov b,a el primer numero se guarda en el registro b
in 01h el Segundo numero que ingresa se queda en el acumulador

sub b resta del a - b

jp lazo si lo que hay en el acumulador es positivo se va a lazo


mvi a,08h caso contario hace esto
out 00h
hlt
lazo:
mvi a,03h
out 01h
hlt

Funciones bsica con el 8085

Comparador de mayor y menor

aqu comparo 2 nmeros basndome en la resta ente ambos si sale negativo


o positivo y para eso empleo el jp

.org 0000h

in 00h
mov b,a
in 01h
sub b
jp lazo //si el flag esta en 0 significa que es positive y salta a lazo
jmp lazo2

lazo:
mvi a,ffh
out 00h
hlt

lazo2:
mvi a,0fh
out 01h
hlt

Ingresar nmeros y guardarlos en la pila

como el push trabaja con registros dobles entonces tenemos que ingresar
2 nmeros consecutivamente

.org 0000h

sphl
lxi h,0500h

mvi d,0ah
lazo2: in 00h
mov b,a
in 01h
mov c,a
push b
dcr d
jz lazo
call retardo
jmp lazo2

lazo: lda 04ffh


out 01h
hlt
retardo:
mvi e,0ah
lazo3:
dcr e
jnz lazo3
ret

Ingresar nmeros determinar si es par o impar y guardarlos en direcciones


diferentes para cada caso

Para saber si un nmero es par o impar

Ingreso el numero , se sabe que todos los impares a partir del 1 su cdigo
binario terminan en ..1 aprovechamos eso y le hacemos un and con 0000
0001h con esto verifica solo el ultimo bit y si sale 01h quiere decir que es
impar caso contrario par

.org 0000h

in 00h
ani 01h
cpi 01h
jz lazo
mvi a,0fh
out 00h
hlt

lazo:
mvi a,ffh
out 01h
hlt
El Timer 0 es un modulo temporizador/contador de 8 bits que cuenta con un preescalador
programable tambin de 8 bits. Puede funcionar como temporizador o como contador. En modo
temporizador el valor del registro TMR0 se incrementa con cada ciclo de instruccin (o cada X
ciclos dependiendo del preescalador). En modo contador el valor del registro TMR0 se
incrementa en cada flanco (ascendente o descendente) del pin RA4/T0CKI. En ambos casos al
desbordarse (pasar de 0xFF a 00) el registro TMR0 la bandera de interrupcin del timer 0 (bit
T0IF del registro INTCON) se pone a 1.

El modo temporizador se selecciona poniendo a cero el bit T0CS del registro OPTION. Poniendo a
uno ese bit el modulo trabaja en modo
contador, en este modo de operacin adems se debe seleccionar si el incremento se producir
en cada filo ascendente o descendente, al poner a cero el bit T0SE del registro OPTION se
selecciona el filo ascendente.

El preescalador es compartido por el Timer 0 y por el Watchdog. Se asigna a un mdulo o a otro


mediante el bit PSA del registro OPTION. Poniendo el bit a 1 el preescalador se asigna al
Watchdog y poniendolo a 0 el preescalador se asigna al Timer 0. El valor del preescalador se
selecciona con los bits PS2:PS0 de la siguiente manera:

PS2:P20 TMR0 WDT


000 1:2 1:1
001 1:4 1:2
010 1:8 1:4
011 1:16 1:8
100 1:32 1:16
101 1:64 1:32
110 1:128 1:64
111 1:256 1:128

Carga y temporizacin

En modo temporizador el Timer 0 incrementa su cuenta en cada ciclo de instruccin. Este modo
sirve para generar temporizaciones y bases de tiempo de la misma forma que los retardos por
software, sin embargo las temporizaciones con el Timer 0 pueden ser ms exactas y adems se
cuenta con la ventaja de que el mdulo puede trabajar mediante interrupciones as que el
programa puede ejecutar otras isntrucciones mientras se realiza la temporizacin.

La temporizacin que se puede obtener con este mdulo se obtiene de la siguiente relacin:
Temporizacin = [(256 - precarga)*PS+2]*Tinstruccion

Donde:
precarga = Valor que se le asigna al registro TMR0 al comenzar la temporizacin
PS = Preescalador. Si esta asignado al watchdog tomar el valor de 1
Tinstruccin = 4/frecuencia de oscilacin
y la temporizacin est dada en segundos.

La temporizacin mxima utilizando el oscilador interno del pic 16f628 es:

Temp.max. = [(256 - 0)*256+2]*1uS = 65528uS

De modo que la temporizacion mxima que se puede tener con el es solamente de 65.538mS. Si
se desea obtener una temporizacion distinta solo se debe escribir en el registro TMR0 el valor de
la precarga necesaria.

precarga = -[([Temporizacion/(4/fosc)]-2)/PS]+256

Donde, de nuevo, la temporizacin est dada en segundos.

Veamos un ejemplo de aplicacin: Se desea complementar el valor del puerto B cada 50mS. Se
estar revisando que se haya cumplido el tiempo de la temporizacin checando la bandera T0IF.
Utilizando la expresin de la precarga y utilizando el preescalador ms grande (256) obtenemos el
valor que necesitamos cargar al registro TMR0 para obtener una temporizacin de 50mS.

precarga = -[([50mS/(4/4Mhz)]-2)/256]+256 = 60.69 60

Ya que no podemos cargar numeros fraccionarios el valor de precarga necesario es 60. Teniendo
entonces el valor de la precarga el cdigo del programa sera el siguiente:

INICIO
bsf STATUS,RP0
clrf TRISB
movlw b'00000111'
movwf OPTION_REG
bcf STATUS,RP0
clrf PORTB
bcf INTCON,T0IF
PRECARGA
movlw .60
movwf TMR0
ESPERA
btfss INTCON,T0IF
goto ESPERA
bcf INTCON,T0IF
comf PORTB,f
goto PRECARGA

La configuracin del Timer 0 se realiza mediante las lneas movlw b00000111 y movwf
OPTION_REG. Mediante estas lineas se configura el timer en modo temporizador (T0CS = 0), el
preescalador se asigna al timer 0 (PSA = 0) y se selecciona el preescalador mximo (PS2:PS0 =
111). Una vez configurado el timer 0 se limpia el puerto B y la bandera T0IF. Posteriormente se
realiza la precarga cargando un 60 al registro TMR0 y en ese momento la temporizacin
comienza.

Para saber si la temporizacin termin se est revisando la bandera T0IF. Mientras esta sea 0 la
temporizacin an no habr terminado, cuando la bandera es 1 entonces la temporizacin
finaliz, se borra la bandera, se complementa el puerto B y se vuelve a realizar la precarga. De
este modo el programa est complementado el puerto B cada 50mS.

Descargar cdigo: Ejemplo del temporizador Timer 0

1. [...] mdulo al igual que el Timer 0 puede funcionar en modo temporizador y en modo
contador. En modo temporizador el par de registros [...]

Pingback by Temporizador Timer 1 MicroPIC June 24, 2007 #

2.

hola, tengo una duda: cuando quiero configurar el flanco activo que provocar la
interrupcin lo hago con el bit INTEDG o el bit TOSE del registro OPTION? cual es la
diferencia entre uno y otro? eso, gracias chao
Comment by sfinrod July 16, 2007 #

3.

Tal vez ests confundido. Si quieres tener una interrupcin cada flanco ascendente debes
poner a 1 el bit INTEDG del registro OPTION, con eso seleccionas la interrupcin en el flanco
ascendente del pin RB0, adems debes poner en 1 el bit RBIE del registro INTCON para
habilitar la interrupcin RB0/INT y despus poner en 1 el bit GIE del mismo registro INTCON
para habilitar las interrupciones, solamente recuerda borrar el bit RBIF del registro INTCON
antes de poner en 1 el bit GIE. Esos son los pasos que debes seguir para tener una
interrupcin en cada flanco ascendente en el pin RB0.
Te dije que tal vez ests confundido porque el bit T0SE es para seleccionar el flanco
ascendente o descendente que hara que el valor del registro TMR0 se incrementara en
modo contador. El bit T0SE no genera ninguna interrupcin al detectar el flanco ya que la
interrupcin del timer 0 se lleva a cabo cuando se presenta el desborde del registro TMR0.
Espero que te haya quedado claro la diferencia. Para lo que tu quieres hacer debes usar la
interrupcin externa RB0/INT siguiendo los pasos que escrib al principio.

Watchdog
Aunque la traduccin sea "perro-guardin", es un concepto de proteccin
usado para volver a reiniciar el programa cuando ste "se pierde" o realiza una
accin no prevista. Los watchdog existen fsicos o por programa. Su
funcionamiento es: l cuenta cada ciertos pulsos de reloj en un determinado
tiempo esperando algn evento generado por el programa, si no le llega tal el
watchdog se activa y hace que todo empiece de nuevo y si le llega el evento,
entonces <<todo est bien>> y no hace nada

También podría gustarte