Modos Modos de de Direccionamiento Direccionamiento Modos de direccionamiento del 8051 La CPU tiene la habilidad de accesar los datos de varias formas Se podría especificar el dato directamente en la instrucción Para datos en la memoria de código y la memoria de datos se usa diferentes modos de direccionamiento Tiene cinco modos – Immediato – Registro – Directo –Indirecto por Registro – Indexado Modo de direccionamiento Inmediato El Operando (dato) está directamente especificado en la instrucción (opcode) El código de operación va seguido de un segundo byte (el operando) que representa una constante. El Operando es una constante, conocida durante el ensamblado El dato Inmediato tiene que ser especificado precediéndolo del signo “#” Ejemplo: MOV A, #25H MOV DPTR, #1FFFH TEMP EQU 40 MOV R1, # TEMP ; R1 28H (40 decimal) Memoria de programa MOV A,#20H Instrucción Instrucción Dato Dato inmediato inmediato Modo de direccionamiento por Registro El (o los) operando(s) son valores contenidos en los registros a que se hace referencia. Ejemplos: Poner en A el contenido del registro R0. MOV A, R0 Poner en R2 el contenido de A MOV R2, A Suma el contenido de R1 y A y el resultado cargarlo en A ADD A, R1 Los registros fuente y destino deben concordar en tamaño No todas las transferencias entre registro son válidas. Por ejemplo: MOV R4, R7 ; invalido Modo de Direccionamiento Directo Uno de los operandos de la instrucción es una dirección sobre la cual se va a actuar. Este direccionamiento es el único modo de acceder a los registros con función especial (SFR). Además de los SFR, este direccionamiento permite acceder a los 128 bytes inferiores de la RAM. Ejemplo: Poner en A el dato contenido en la dirección 80H. MOV A,80H La dirección del operando está especificada directamente en la instrucción. – MOV A, 40H ; copia el dato en la memoria [40H] al A Direccionamiento de Registros como Direccionamiento directo – MOV A, 4H ; 4H es la dirección de R4 – MOV A, R4 ; Lo mismo que el anterior . Ambos hacen lo mismo; pero pueden tener diferentes códigos de operación El Stack en el 8051 solamente usa modos de direccionamiento directo. Register Indirect Addressing Mode A register is used as a pointer – Register stores the address of the data Only R0, R1 and DPTR can be used for this purpose in 8051 R0 and R1 can be used for internal memory (256 bytes incl. SFRs) or from 00H to FFH of external memory – mov A, @R0 ;copy internal_mem[R0] to A – mov @R1, A ;copy A to internal_mem[R1] – movx A, @R0 ; copy external_mem[R0] to A DPTR can be used for external data memory – movx A, @DPTR ;copy ext_data_mem[DPTR] to A – movx @DPTR, A ;vice versa Indexed Addressing Mode Use a register for storing the pointer and another register for an offset Effective address is the sum base+offset – Move code byte relative to DPTR to A. Effective address is DPTR + A movc A, @A+DPTR – Move code byte relative to PC to A. Effective address is PC + A movc A, @A+PC Widely used for implementing look-up tables, data arrays, character generators etc in code memory (ROM) Common Devices UV erasable EPROM – Approx street price = $5 for 256-15 part – 27C128, 27C256, 27C512-15 – C – CMOS, 128 = 128 kilo bits = 128/8 = 16Kilo bytes, organized as 16Kx8 – Last two digits is speed grade 15 = 150ns access time EEPROMs – 28C64, 28C256-15 – Approx street price = $10 for 256-15 part Flash – 28F256, 28F010 (1024 kbits, 128Kx8) – Approx street price = $7 for 010-15 part SRAM – 6264, 62256-10 – Approx street price = $4 for 256-12 part Indexed Addressing Mode - Example Program to read a value x from P1 and send x2 to P2 ORG 0 mov DPTR, #LUT ; 300H is the LUT address mov A, #0FFH mov P1, A ; program the port P1 to input data mov A, P1 ; read x back: movc A, @A+DPTR ; get x2 from LUT mov P2, A ; output x2 to P2 sjmp back ; for (1) loop ORG 300H LUT: DB 0, 1, 4, 9, 16, 25, 36, 49, 64, 81 Program Control Instructions Unconditional Branch – ajmp addr11 ; absolute jump – ljmp addr16 ; long jump – sjmp rel ; short jump to relative address – jmp @A+DPTR ; jump indirect Conditional branch – jz, jnz rel ; short conditional jump to rel. addr – djnz rel ; decrement and jump if not zero – cjne rel ; compare and jump if not equal Subroutine Call – acall addr11 ; absolute subroutine call – lcall addr16 ; long subroutine call – ret ; return from subroutine call – reti ; return from ISV Machine Cycle Number of clock cycles used to perform one instruction Varies with instruction Usually the lowest is quoted as the machine cycle For 8051, 12 clock cycles are minimum needed per instruction Time per machine cycle – Tmc = Clocks per machine cycle / Clock frequency – For 8051 clocked at 11.0592MHz, Tmc = 12 / 11.0592M = 1.085 micro seconds Time spent executing an instruction – Tinstr = machine cycles for the instruction * Tmc – For the nop instruction, machine cycles = 1. So Tinstr = 1 * 1.085 = 1.085 micro seconds Simple delay loops Find the time delay for the subroutine DELAY: mov R3, #200 ; 1 machine cycle HERE: djnz R3, HERE ; 2 machine cycles RET ; 1 machine cycle Calculation – Total machine cycles = 200*2 + 1 + 1 = 402 – Time = 402 * 1.085us (assuming 11.0592 MHz clk) = 436.17us Similarly any delay can be obtained by loop within loop technique For much longer delays, use timers 8051 I/O Ports 32 pins are allotted for 4 eight bit I/O ports – P0, P1, P2, P3 Al energizar todos los puertos por default son salidas Para configurar cualquier puerto como entrada, escribir puros 1´s (0xFF) al puerto en cuestión Ports can be read and written to like normal registers mov A, #55H ; can use A mov P0, A ; write A to P0 mov P1, A mov P2, #0AAH ; can use immediate mode xlr P1, #0FFH ; read-modify-write (ex-or) mov P0, #0FFH ; configure P0 for input Ports can be bit manipulated (single bit addressable) using cpl and setb instructions 8051 I/O Programming Simple read and write 8bits at a time mov A, #0FFH ; configure P1 for input mov P1, A ; mov A, P1 ; read from P1 mov P0, A ; write that to P0 Bit manipulation cpl P1.2 ; complement bit 2 of Port1 setb P1.3 ; set bit 3 for Port1 to 1 clr P0.0 ; clear bit 0 of Port0