FACULTAD DE INGENIERIA UNIVERSIDAD DE LA REPUBLICA INTRODUCCION A LOS MICROPROCESADORES FEBRERO 2014 PROBLEMA 1 – Parte a) Caso T80 y bloques lab – – – – Bloque Timer Controlador1 con bloque Timer Controlador0 con BOTON TULT[8], LJUEGO, LTOUT puertos out DFF DO[0] D ODSP_LJUEGO_n PRN Q OUTPUT LJUEGO OUTPUT LTOUT OUTPUT TULT[7..0] CLRN inst36 DFF DO[0] D ODSP_LTOUT_n PRN Q CLRN inst35 DFF DO[7..0] D ODSP_TULT_n PRN Q CLRN inst55 INTtimer_n INTbot_n AND3 De otros controladores A[7] AND2 Hacia T80 inst31 NOT A[6] INT_n OR2 rangoIO_n inst9 inst2 IORQ_n 0xC0-0xFF inst14 deco_1de4 A[2] A1 A0 A[1] A[4] rangoIO_n RD_n Y0 Y1 Y2 Y3 OR3 CS_TIMER_n NOT CS_INTtimer_n CS_TIMER inst25 CS_INTbot_n G inst15 AND2 inst21 DECO WR_n inst78 A[4] deco_1de4 A[1] NOT A[0] inst43 rangoIO_n WR_n Y0 Y1 Y2 Y3 A1 A0 OR3 ODSP_LJUEGO_n ODSP_LTOUT_n ODSP_TULT_n G inst26 inst39 DECO Pag. 1/9 FACULTAD DE INGENIERIA UNIVERSIDAD DE LA REPUBLICA INTRODUCCION A LOS MICROPROCESADORES FEBRERO 2014 DO[7..0] Desde T80 bloquetimer M1_n M1_n IORQ_n INT_n IORQ_n RD_n RD_n CLK clk RESET zc CS_TIMER datos_o[7..0] inst3 RESET A[0] AND2 c_aux[7..0] A0 CS_TIMER_n CE_n trg datos_i[7..0] INTA_n_timer INTA_n inst4 controlador_de_interrupciones CLK RESET_n CK DO[7..0] RESET_n M1_n IORQ_n INT_n M1_n WR_n MREQ_n IEO_timer IEO IORQ_n RD_n INTtimer_n SRV RD_n IORQ_out_n WR_n M1_out_n MREQ_n OR2 INTA_n_timer inst8 DI_v ector[7..0] VCC DI_opcode[7..0] A[0] CS_INTtimer_n A0 CE_n IEI NOT IRQ inst67 inst6 controlador_de_interrupciones CLK RESET_n CK RESET_n M1_n IORQ_n M1_n IORQ_n RD_n WR_n MREQ_n DO[7..0] INTbot_n INT_n IEO SRV RD_n IORQ_out_n WR_n M1_out_n OR6 MREQ_n DI_v ector[7..0] CS_INTbot_n A0 Hacia T80 CE_n IEO_timer IEI BOTON DI[7..0] DI_opcode[7..0] A[0] INPUT VCC IRQ Desde MEMORIAS inst5 inst7 Pag. 2/9 FACULTAD DE INGENIERIA INTRODUCCION A LOS MICROPROCESADORES UNIVERSIDAD DE LA REPUBLICA FEBRERO 2014 Parte a) Caso buses multiplexados y CTC A[7] AND2 A[6] inst17 IORQ_n NOT OR2 rangoIO_n inst18 0xC0-0xFF inst19 A[4] OR2 CS_CTC rangoIO_n inst20 deco_1de4 A[1] A[4] NOT A[0] inst48 rangoIO_n WR_n ODSP_LJUEGO_n Y0 Y1 Y2 Y3 A1 A0 OR3 ODSP_LTOUT_n ODSP_TULT_n ODSP_TMEJOR_n G inst29 inst42 DECO D[7..0] ctc D0..D7 M1 VCC IEI M1\ CK/TRG0 IORQ\ ZC/TO0 RD\ CK/TRG1 ZC/TO1 CS1 CK/TRG2 CS0 ZC/TO2 CE\ CK/TRG3 IORQ RD A[1] A[0] CS_CTC CK RESET/ CK RESET\ canal 0 en modo Timer canal 1 en cascada BOTON R IEO INT\ canal 2 Counter interrumpe en cada flanco de BOTON OUTPUT INT/ inst16 D[0] DFF D PRN Q LJUEGO Q LTOUT Q TULT[7..0] ODSP_LJUEGO_n CLRN inst28 D[0] DFF D PRN ODSP_LTOUT_n CLRN inst32 DFF D PRN ODSP_TULT_n CLRN inst33 Pag. 3/9 FACULTAD DE INGENIERIA UNIVERSIDAD DE LA REPUBLICA INTRODUCCION A LOS MICROPROCESADORES FEBRERO 2014 b) ---- isr de boton y timer ---isr_boton: ;si ESTADO=Jugando entonces ; detener Timer ; ESTADO = Inactivo ; LJUEGO = 0 ; tjugada = TOUT - timer ;; timer decreciente desde TOUT hasta 0 ; TULT = tjugada ;else ; Estado = Jugando ; LJUEGO = 1 ; LTOUT = 0 ; TULT = 0 ; Arrancar Timer ;fin_si estado ei push af ld a, (ESTADO) cp EJUGANDO jr nz, else ;; si ESTADO == Jugando ;; detener Timer call stop_timer ;; ESTADO = Inactivo ;; LJUEGO = 0 ld a, EINACTIVO ld (ESTADO), a ld a, 0 out (LJUEGO), a ;; TULT = TOUT – timer ;; decreciente desde TOUT in a, (CUENTA_TIMER) neg add TOUT out (TULT), a jr finsi else: ;; Estado = Jugando ld a, EJUGANDO ld (ESTADO), a ;; LJUEGO = 1 ;; LTOUT = 0 ;; TULT = 0 ld a, 0xFF out (LJUEGO), a ld a, 0 out (LTOUT), a out (TULT), a ;; Arrancar Timer call start_timer finsi: pop af reti isr_timer: ; detener Timer ; LJUEGO = 0 ; LTOUT = 1 ; ESTADO = Inactivo ; ei push af call stop_timer ld a, 0 out (LJUEGO), a ld a, 0xff out (LTOUT), a ld a, EINACTIVO ld (ESTADO), a pop af reti start_timer: ld a, TIMER_ON_CTE out (BASE_TIMER+0), a ret stop_timer: ld a, TIMER_OFF_CTE out (BASE_TIMER+0), a ret c) --- Init ---------------org 0 ;; stack, modo2, tabla int sp, 0 2 hl, BASETABLA a, h i, a ;; ESTADO = Inactivo ;; TULT = 0 ;; LJUEGO = 0 ;; LTOUT = 0 ld a, EINACTIVO ld (ESTADO), a ld a, 0 out (TULT), a out (LJUEGO), a out (LTOUT), a ;; inic timer y ctrl int. call init_perif ;; inic otros dispositivos call init_otros ei jp ppal ld im ld ld ld init_perif: ;; vectores interr ld a, TIMER_VEC out (BASE_CTRL_TIMER+0), a ld a, TOUT_VEC out (BASE_CTRL_BOTON+0), a ;; borro eventuales peticiones pendientes out (BASE_CTRL_TIMER+1), a out (BASE_CTRL_TOUT+1), a ;; cte recarga timer ld a, TOUT out (BASE_TIMER+1), a ret Pag. 4/9 FACULTAD DE INGENIERIA UNIVERSIDAD DE LA REPUBLICA INTRODUCCION A LOS MICROPROCESADORES FEBRERO 2014 org 100 ;; tabla interrupciones basetabla: DW isr_otro0 DW isr_otro1 DW isr_otro2 DW vacio DW isr_timer ;; vect = 8 DW isr_boton ;; vect = 10 org 0x8000 ;; variables ESTADO: DB LJUEGO LTOUT TULT EQU EQU EQU DELTA TOUT EQU 100 EQU 200 BASE_TIMER BASE_CTRL_TIMER BASE_CTRL_BOTON EQU EQU EQU 0xC0 0xC2 0xC4 TIMER_VEC BOTON_VEC EQU EQU 8 10 0xF0 0xF1 0xF2 ; ei, reset, auto, pre=15 EQU 10101111b TIMER_ON_CTE ; di, resto idem EQU 00101111b ------------------ Cambios en solución con CTC Se utilizan tres canales del CTC: • canal 0: timer, pre=256, cte=128 para llegar a período de 100ms • canal 1: counter, cte=TOUT para interrumpir por timeout • canal 2: counter, cte=1 para generar interrupcion con cada flanco de BOTON BASE_CTC CTC_VEC CTC_CTE0 EQU EQU EQU CTC_CTE1 EQU ; ei, cnt, x, x, x, CTC_CW1 EQU ; idem con di CTC_CW1_OFF EQU TOUT tc, reset 11000111 01000111 CTC_CTE2 EQU 1 ; ei, cnt, x, edge-, x, tc, reset CTC_CW2 EQU 11000111 Las nuevas versiones de las subrutinas son: ;; definicion de ctes EJUGANDO EQU 0xFF EINACTIVO EQU 0x0 TIMER_OFF_CTE ; di, timer, 256, x, auto, tc, reset CTC_CW0 EQU 00100111 0xC0 8 128 init_perif: ;; vector ld a, CTC_VEC out (BASE_CTC+0), a ;; canal 2 para boton ld a, CTC_CW2 out (BASE_CTC+2), a ret start_timer: ;; rearranco canales 0 y 1 ld a, CTC_CW0 out (BASE_CTC+0), a ld a, CTC_CTE0 out (BASE_CTC+0), a ld a, CTC_CW1 out (BASE_CTC+1), a ld a, CTC_CTE1 out (BASE_CTC+1), a ret stop_timer: ;; deshabilito generación de interrupciones ld a, CTC_CW1_OFF out (BASE_CTC+1), a ld a, CTC_CTE1 out (BASE_CTC+1), a ret ;;; con los canales elegidos debo modificar la tabla de interrupciones. basetabla: DW isr_otro0 DW isr_otro1 DW isr_otro2 DW vacio DW vacio ;; vect = 8 ;; canal 0 no interrumpe DW isr_timer DW isr_boton Pag. 5/9 FACULTAD DE INGENIERIA UNIVERSIDAD DE LA REPUBLICA INTRODUCCION A LOS MICROPROCESADORES FEBRERO 2014 PROBLEMA 2 – Solución a) Hardware Memoria ROM A[14..0] Add[] /CS_ROM D[7..0] Data[] CS OE inst11 RAM Add[] Data[] /CS_RAM CS OE WE /RD /WR inst10 A[15] NOT OR2 inst7 /CS_RAM /MREQ inst20 OR2 /CS_ROM inst21 Interrupción VCC DFF D TIC PRN NOT Q /INT inst12 CLRN inst36 /RESET /M1 AND2 OR2 inst /IORQ inst3 Pag. 6/9 FACULTAD DE INGENIERIA UNIVERSIDAD DE LA REPUBLICA INTRODUCCION A LOS MICROPROCESADORES FEBRERO 2014 Puertos /IDSP_jugador D[7..0] NOT inst48 J1 D[0] TRI INPUT VCC inst31 DFF D /IDSP_PP NOT PRN LEDS[7..0] OUTPUT Q inst45 VCC PAUSE INPUT VCC DFF D NOT PRN Q CLRN inst9 D[0] TRI inst30 /ODSP_leds inst6 /ODSP_CLRpausa CLRN inst37 Decodificación puertos deco_1de4 A[1] A[0] Y0 Y1 Y2 Y3 A1 A0 /IORQ OR2 /ODSP_leds (0h) /ODSP_CLRpausa (1h) deco_1de4 G /WR inst4 inst18 A[1] DECO A[0] Y0 Y1 Y2 Y3 A1 A0 /IORQ OR2 /IDSP_PP G /RD inst5 inst19 (0h) /IDSP_jugador (1h) DECO Pag. 7/9 FACULTAD DE INGENIERIA UNIVERSIDAD DE LA REPUBLICA INTRODUCCION A LOS MICROPROCESADORES FEBRERO 2014 d) Inicialización y variables c) Programa principal ;----- variables org 8000h PAUSA db ; FIN db ; SENTIDO db ; POSICION db ; org 1000h PPAL: ld A, FINALIZADO cp (FIN) jp Z, END FFh = pausa FFh = fin 00h der, FFh izq donde esta la pelota ;----- constantes PAUSADO equ FINALIZADO equ DERECHA equ SENTIDO_INI equ POSICION_INI equ P_EN_FRONTON equ P_EN_JUGADOR equ FFh FFh 00 DERECHA 0001 0000b 0000 0001b 1000 0000b ;----- puertos LEDS PAUSE_PLAY CL_PAUSE_PLAY JUGADOR 00h 01h ; en bit 0 00h 01h ; en bit 0 equ equ equ equ in A, (PAUSE_PLAY) bit 0, A jp Z, TOGGLE_PAUSE_PLAY jp PPAL TOGGLE_PAUSE_PLAY: ld A, (PAUSA) cpl A, ld (PAUSA), A out (CL_PAUSE_PLAY), A jp PPAL END: di END_LOOP: jp END_LOOP ;----- inicialización ; modo 1 y stack ; variables: fin, pausa, sentido ; HW: borrar flag PAUSE, leds org 0000h im 1 ld SP, 0000h ld A, FINALIZADO cpl A ld (FIN), A ld A, PAUSADO ld (PAUSA),A ld A, SENTIDO_INI ld (SENTIDO),A ld A, POSICION_INI ld (POSICION),A out (LEDS), A out (CL_PAUSE_PLAY), A EI jp PPAL Pag. 8/9 FACULTAD DE INGENIERIA UNIVERSIDAD DE LA REPUBLICA INTRODUCCION A LOS MICROPROCESADORES FEBRERO 2014 b) Rutina atención interrupción jp Z, perdio ; le pego_antes jp actualizo ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; ; si pausa retorno si pelota yendo a la derecha si pelota en posicion 0 cambio sentido actualizo posicion y retorno sino si pelota en posicion 7 si J1 apretado cambio sentido actualizo posicion y retorno sino fin de juego sino "hacia izq y no en led 7" si J1 apretado fin de juego sino actualizo posicion y retorno fin de juego: indico fin en leds seteo variable FIN retorno actualizo posicion y retorno: si SENTIDO = derecha roto POSICION a la derecha sino roto POSICION a la izquierda actualizo leds retorno cambio_sentido: ld A, (SENTIDO) cpl ld (SENTIDO), A actualizo: ld IX, POSICION ld A, (SENTIDO) cp DERECHA jp nz, hacia_jugador hacia_fronton: rr (IX) jp actualizo_leds hacia_jugador rl (IX) actualizo_leds: ld A, (POSICION) out (LEDS), A jp retorno perdio: ld A, FINALIZADO ld (FIN), A out (LEDS), A retorno: pop IX pop AF ei ret org 38h push AF push IX ld A, (PAUSA) cp PAUSADO jp Z, retorno ld A, (SENTIDO) cp DERECHA jp NZ, hacia_izquierda hacia_derecha: ld A, (POSICION) cp P_EN_FRONTON jp Z, cambio_sentido jp actualizo hacia_izquierda: ld A, (POSICION) cp P_EN_JUGADOR jp nz, pelota_lejos_jugador pelota_en_jugador: in A, (JUGADOR) bit 0, A jp Z, cambio_sentido ; le pego jp perdio pelota_lejos_jugador: in A, (JUGADOR) bit 0, A Pag. 9/9