Terminales del P 8085 (vistos hasta ahora) Buses de direcciones y datos Bus de control Alimentación, clock, reset Registros internos del P 8085 Instrucciones del P 8085 (vistas hasta ahora?) Transferencia: MVI r,dato MOV r1,r2 LDA dir STA dir Aritméticas: ADD r SUB r ADC r SBB r CMP r INR r DCR r ADI SUI ACI SBI CPI dato dato dato dato dato Lógicas (bit a bit): ANA r ORA r XRA r ANI dato ORI dato XRI dato Complemento, rotación, etc.: CMA RRC RLC RAL RAR Acceso a I/O: IN port OUT port Salto: JMP dir J[cond] dir Subrutinas: CALL dir RET C[cond] dir R[cond] Pila: PUSH POP Registros pares: LXI rp,dato16 INX rp DCX rp DAD rp LDAX rp STAX rp LHLD dir SHLD dir rp rp Donde: r = A,B,C,D,E,H,L,M rp = HL,DE,BC,SP dato = número de 8 bits dir = dirección de 16 bits port = dirección de 8 bits dato16 = número de 16 bits [cond]: NZ Z NC C PO PE P M Resto de las instrucciones del P 8085 Quedan por ver: SIM RIM DAA CMC STC EI DI HLT RST n PCHL XTHL SPHL XCHG NOP Terminales SID y SOD Trabajan con las intrucciones RIM y SIM: Mnemónico: RIM Código máquina: 00100000 registro acumulador después de la instrucción 7 6 5 terminal SID (signal input data) Assembler: SIM Código máquina: 00110000 registro acumulador antes de la instrucción = 20h (opcode) 5 4 3 2 1 0 = 30h (opcode) 7 6 5 4 3 2 1 0 1 latch 4 terminal SOD (signal output data) Interrupciones • Para saber si se produce un cambio en algún periférico, podemos preguntar permanentemente por su estado, con instrucciones conocidas tipo IN o LDA. • Si la velocidad de esos cambios es muy baja respecto a la frecuencia de lectura, el sistema es muy poco eficiente. • En general, los periféricos tienen tiempos de cambio >> que el del loop mostrado. • • Esta manera de monitorear los cambios es aceptable si el P no tiene otra cosa que hacer. IN Per_0 Cambió Per_0? Sí CALL Sub_0 Cuando el P debe realizar otras tareas, como realizar algún cálculo por ejemplo, es probable que no pueda hacer ambas cosas simultáneamente. IN Per_n Cambió Per_n? Sí CALL Sub_n Interrupciones • En general, los P trabajan con interrupciones. • Estas se producen cuando se activa alguna de la/las entrada/s que el P tiene previstas para tal efecto. • Cuando se produce, el P termina de ejecutar la instrucción en curso y salta a un lugar fijo de la memoria de programa, donde busca el código de operación de la siguiente instrucción. • Previamente almacena en RAM (pila) la dirección donde debe continuar, luego de la interrupción (retorno). Interrupciones en el P 8085 Existen 5 entradas de interrupciones: Dirección de salto Prioridad Máscara Sensible a TRAP 0024 Mayor No - RST 7.5 003C Sí Flanco RST 6.5 0034 Sí Nivel RST 5.5 002C Sí Nivel INTR sin dirección fija Sí - Menor • La prioridad se refiere a cual interrupción es atendida si llegan dos pedidos simultáneos. • Para que las interrupciones enmascarables puedan ser atendidas, deben ser previamente habilitadas (quitar máscaras). • Existe una máscara o habilitación general que afecta a todas • También, en el caso de RST7.5, RST6.5 y RST5.5, existen máscaras individuales. Interrupciones en el P 8085 • La RST7.5 se activa por flanco (un biestable retiene la transición) mientras que la 6.5 y la 5.5 se activan por nivel. • Todas las máscaras correspondientes a una interrupción deben quitarse para que esta pueda ser atendida. • Cuando se atiende una interrupción cualquiera, se activa automáticamente la máscara general de interrupciones, la cual debe ser quitada por software (EI), para que a continuación se puedan seguir atendiendo otras interrupciones. • Cuando el µP se resetea quedan puestas todas las máscaras. Terminales del P 8085 asociados a las interrupciones Entradas de interrupción: TRAP: interrupción no-enmascarable de mayor prioridad. RST7.5: interrupción enmascarable (sensible al flanco ascendente). RST6.5, RST5.5: interrupciones enmascarables (por nivel). INTR: interrupción de propósito general /INTA: reconocimiento del pedido a través de INTR Otros terminales especiales: HOLD: indica que algún periférico está pidiendo el uso de los buses (dirección, datos y control). HLDA: indica que el P ha recibido el pedido de HOLD y liberará los buses en el próximo clock. * HOLD y HLDA son usados normalmente por periféricos que realizan acceso directo a memoria (DMA). Instrucciones del P 8085 asociadas a las interrupciones SIM setea máscaras individuales, resetea el FF de la RST7.5, fija estado de la pata SID. RIM lee estado de máscaras individuales, lee estado de habilitación de interrupciones (máscara general), lee estado de interrupciones pendientes, lee estado de terminal SID. EI habilita interrupciones (quita máscara general). DI inhibe interrupciones (pone máscara general). HLT pone al P en estado de detención (halt) (bajo consumo, preserva contenido de registros) Interrupciones El registro de máscaras no es accesible directamente, pero puede ser escrito y leido por medio de las instrucciones SIM y RIM, usando el acumulador: reg. máscaras A SIM Formato del acumulador antes de la instrucción SIM: 7 6 SOD SOE 5 X 4 3 2 1 0 R7.5 MSE M7.5 M6.5 M5.5 SOD Bit que fija el estado del pin SOD de µP, si SOE esta en uno SOE Si este bit es uno, SOD puede cambiar según el valor del bit 7, pero si es cero SOD no cambia R7.5 Si este bit es 1 se resetea el flip flop de la interrupción RST 7.5 (sin importar si la interrupción 7.5 está enmascarada o no) MSE Un cero en este bit inhabilita la posibilidad de cambiar las máscaras 7.5, 6.5 y 5.5 M7.5 M6.5 M5.5 Máscara de la Interrupción 7.5 (un cero la habilita un uno la inhabilita) Máscara de la Interrupción 6.5 (un cero la habilita un uno la inhabilita) Máscara de la Interrupción 5.5 (un cero la habilita un uno la inhabilita) Interrupciones A reg. máscaras RIM Formato del acumulador después de la instrucción RIM: 7 6 5 4 SID I7.5 I6.5 I5.5 3 2 1 0 IE M7.5 M6.5 M5.5 SID Estado del pin SID del µP I7.5 I6.5 I5.5 Indican si hay alguna interrupción pendiente IE Indica si están habilitadas las interrupciones en general (máscara general quitada) M7.5 M6.5 M5.5 Indican el estado actual de las máscaras individuales Ejemplo 1: uso de interrupciones Realizar un programa que cuente 12 pulsos de una señal de entrada (conectada a la interrupción rst7.5) y termine: Dir. Assembler 0000 JMP 0100h ; Salta al comienzo del programa DCR RET B ; Atención de la interrupción 7.5, decrementa contador 0100 0103 0105 0106 0108 0109 010A 010B 010C LXI MVI SIM MVI EI HLT MOV ORA JNZ SP,2100h A,08 ; Inicializa el SP apuntando a memoria RAM 010F 0111 0114 MVI STA HLT . . . 003C 003D . . . B,0Ch A,B A 0108h A,FFh 1000h ; ; ; ; Quita todas las máscaras de las interrupciones Carga el contador con el valor inicial (12) Habilita las interrupciones (máscara general) Entra en estado de halt ; Verifica si el contador llegó a cero ; Cuando el contador llega a cero se escribe FFh en la ; dirección 1000h y se termina el programa Ejemplo 2: contador de pulsos Realizar un programa que permita contar cuantos pulsos hay en una señal de entrada, mientras otra entrada de control está en alto. Señal de control Señal de entrada No se cuentan INT6.5 Se cuentan Señal de Control µP Señal de Entrada INT7.5 No se cuentan Ejemplo 2: contador de pulsos INICIO (subrutinas) - Inicialización - Cargar SP - Quitar máscara 6.5 INT6.5 INT7.5 Habilitar int7.5 Incrementar contador Habilitar interrupción Sí Sigue señal de control? (programa principal) No Mostrar resultado RET RET Ejemplo 2: contador de pulsos Programa principal: .org jmp h'0000 start .org jmp h'003C int75 .org jmp h'0034 int65 ; Salta al comienzo del programa principal ; ; ; ; ; ; Se ubica en la posición donde esta Salta a la etiqueta int75 donde se interrupción. Se ubica en la posición donde esta Salta a la etiqueta int65 donde se interrupción. la int 7.5 atiende esta la int 6.5 atiende esta ;******************PROGRAMA PRINCIPAL*********************************** .org h'0050 start: lxi mvi mvi sim sp,h'20FF b,h'00 a,b'00011101 sigue: ei jmp sigue ; ; ; ; ; Inicializa el stack pointer Se pone el contador de pulsos en cero Se ponen máscaras sobre la 5.5 y 7.5 y se quita la correspondiente a la 6.5 además se borra el FF de la 7.5 ; Se habilitan las interrupciones y se entra ; en un loop infinito... Ejemplo 2: contador de pulsos Subrrutinas: ;*********** INTERRUPCION 6.5 ********************************************** int65: loop: mvi sim ei rim ani jnz mov out mvi mvi sim a,b'0011011 ; Pone máscara a la 6.5 y a la 5.5 y limpia ; el FF de la 7.5 ; A partir de aquí solo está habilitada la 7.5 h'20 loop a,b 00 b,h'00 a,b'00011101 ; ; ; ; ; ; ; ; Pregunta si sigue la entrada de la 6.5 en alto para mantener la 7.5 habilitada Cuando la señal de control baja termina de contar y muestra el resultado. Prepara el contador para la próxima medición Se ponen máscaras sobre la 5.5 y 7.5, se quita la correspondiente a la 6.5 y de paso se borra el FF de la 7.5 ret ;*************** INTERRUPCION 7.5 ****************************************** int75: inr ret .end b ; Incrementa el contador Ejemplo 3: reloj de tiempo real Señal de entrada (50 Hz) INT7.5 INT7.5 Guardar “estado” en la pila µP Incrementar contador contador = 0 Sí “Incrementa la hora en un segundo” contador = 50? No Recuperar “estado” de la pila RET Ejemplo 3: reloj de tiempo real Inicialización y programa principal: .ORG JMP h'0000 start ; Salta al comienzo del programa principal .ORG JMP h'003C rtc ; Se ubica en la posición donde esta la rst7.5 ; Salta a la etiqueta rtc donde se atiende esta ; interrupción. ;******************DEFINE ETIQUETAS************************************* Segundos .EQU h’3000 Minutos .EQU h’3001 Horas .EQU h’3002 Contador .EQU h’3003 ;******************PROGRAMA PRINCIPAL*********************************** .ORG h'0100 start: LXI SP,h'20FF ; Inicializa el stack pointer MVI STA MVI STA MVI STA A,17 Horas A,13 Minutos A,30 Segundos ; Fija como hora inicial las 17:13:30 MVI SIM EI . . . . A,b'00011011 ; Se ponen máscaras sobre la 5.5 y 6.5 ; y se quita la correspondiente a la 7.5 ; Se habilitan las interrupciones ; El programa principal continua ; con lo suyo... Ejemplo 3: reloj de tiempo real Subrrutina que atiende a la rst7.5: ;****** INTERRUPCION 7.5 ****** rtc: cont: PUSH PUSH LXI DCR JNZ PSW HL HL,Contador M volver MVI M,50 LXI INR MVI CMP JNZ MVI HL,Segundos M A,60 M volver M,0 ; apunta a Segundos ; incrementa los segundos INX INR CMP JNZ MVI HL M M volver M,0 ; apunta a Minutos ; incrementa los minutos INX INR MVI CMP JNZ MVI HL M A,24 M volver M,0 volver: POP POP EI RET HL PSW ; guarda acumulador y flags en la pila ; guarda contenido de HL ; decrementa ; y retorna si no llegó a cero... ; si dió 60, lo vuelve a 0 ; si dió 60, lo vuelve a 0 ; apunta a Horas ; incrementa las horas ; si dió 24, lo vuelve a 0 ; recupera el contenido original de ; los registros H, L, A y flags ; habilita interrupciones