Microcontroladores 8051

5. Programación en Ensamblador

5.1. Ejemplos básicos de programación

Ejemplos de programas en ensamblador de los microcontroladores 8051.

E-1. Contador en el Acumulador de 0 a 99 en Hexadecimal

NAME   CONTADOR_HEX

ORG    0

INICIO:    MOV    A,#0
REPETIR:   INC    A
           CJNE   A,#99,REPETIR
            
           END

Diagrama de flujo del contador en hexadecimal.

E-2. Contador en el Acumulador de 0 a 99 en BCD

NAME   CONTADOR_BCD

ORG    0

INICIO:    MOV    A,#0
REPETIR:   ADD    A,#1
           DA     A
           CJNE   A,#99,REPETIR
            
           END

Diagrama de flujo del contador en decimal BCD.

E-3. Rotación de 1 bit a mano derecha en el Acumulador.

NAME   ROTACION_ACUMULADOR

ORG    0

INICIO:    MOV    A,#1
REPETIR:   RR     A
           JMP    REPETIR
            
           END

E-4. Retardo por programa de 256 instrucciones DJNZ.

El tiempo de un retardo por programa no tiene un valor fijo, este depende de las instrucciones que forman parte del bucle (los ciclos máquina utilizados) y de la velocidad del reloj del microprocesador (CPU).

Para este ejemplo en cuestión, el bucle se realiza sobre la instrucción DJNZ, la cual necesita dos ciclos máquina para su ejecución. Cada ciclo máquina utiliza 12 periodos de reloj. Si la frecuencia de la CPU es de 12MHz, el tiempo empleado en realizar las 256 iteraciones es de 512 ms (milisegundos).

1\ Ciclo\ m\acute{a}quina \ =\ \frac{1}{12\ MHz}*12\ Periodos\ =\ 1\ \mu Segundo \\ Tiempo\ =\ 1\ \mu Segundo*2\ Ciclos*256\ Iteraciones\ =\ 512\ \mu Segundos

NAME   RETARDO_1

ORG    0

INICIO:    MOV    R0,#0FFH
RET1:      DJNZ   R0,RET1
            
           END

Diagrama de flujo de un temporizados por programa.

E-5. Retardo por software anidado de tres registros R0, R1 y R2.

Para poder realizar retardos por software con tiempos superiores al segundo se ha de realizar mediante el anidamiento de bucles. En la figura se muestra un anidamiento de bucles con los registros R0, R1 y R2. En este sistema, por cada decremento del registro R1, el registro R0 se ha decrementado 256 veces, y por cada decremento de R2 el R1 ha realizado 256 iteraciones, por lo que el resultado final es de 2^24 = 16777216 iteraciones. El tiempo resultante es aproximadamente 33,554432 segundos, según las condiciones expuestas en el ejemplo anterior.

 1\ \mu Segundo*2\ Ciclos*16777216\ Iteraciones\ =\ 33554432\ \mu Segundos\ \left\{ 33,554432\ Segundos \right\}

Para determinar el tiempo se han de modificar los bits que representan los valores más significativos, correspondientes al R2.

Malgastar la capacidad de cálculo de la CPU en temporizaciones o retardos por software solo tiene sentido cuanto el microprocesador únicamente ha de atender a un proceso. El trabajo normal es utilizar los timers y las interrupciones para realizar las tareas de temporización, y dejar a la CPU libre para otros procesos.

NAME   RETARDO_2

ORG    0

RETARDO: MOV    R2,#0FFH
RET3:    MOV    R1,#0FFH
RET2:    MOV    R0,#0FFH
RET1:    DJNZ   R0,RET1
         DJNZ   R1,RET2
         DJNZ   R2,RET3

         END

Diagrama de flujo de un temporizador por software con tres registros.

5.2. Estructura de un programa en ensamblador

El siguiente programa muestra la estructura básica de un programa en ensamblador.

;**********************************************************
; Ejemplo de estructura de un programa en ensamblador para
; los microcontroladores 8051.
;
; Programa para hacer parpadear todos los bits del puerto 0
; con un tiempo determinado.
;
; Autor: Rafa Aranda
; Fecha: 20-10-2009
; Versión: 1.0
;**********************************************************

$NOMOD51
$INCLUDE (REG51.INC)

		NAME	ESTRUCTURA
 
STACK	EQU	030H	;Dirección del puntero del stack

;*************************************
; Iniciar los vectores de interrupción
;*************************************

		USING	0

		ORG	0H		;Origen del código (Posición de la memoria ROM)

VECTOR:	JMP	INICIO		;Reset

		ORG	VECTOR+3H	;INT0
         
		ORG	VECTOR+0BH	;Timer 0
          
		ORG	VECTOR+13H	;INT1

		ORG	VECTOR+1BH	;Timer 1

		ORG	VECTOR+23H	;Puerto serie RI + TI

		ORG	VECTOR+2BH	;Timer 2
        
;********************************
; Tareas iniciales de preparación
;********************************         

 		ORG	VECTOR+30H

INICIO:	MOV	SP,#STACK-1	;Fijar el puntero del stack
         	MOV	PSW,#00000000B	;Selecciona el banco de registros 0
		MOV	P1,#0H		;Preparar el puerto	


;*******************
; Programa principal
;*******************

PROGRAMA:	MOV	P1,#0H		;Poner los bits del puerto 0 a 0
		CALL	RETARDO		;Realizar un retardo
		MOV	P1,#0FFH	;Poner los bits del puerto 0 a 1
		CALL	RETARDO		;Realizar un retardo
		JMP	PROGRAMA	;Reiterar de forma infinita

;***************************
; Subrutina de temporización
;***************************

RETARDO:	MOV	R2,#7FH
RET_3:		MOV	R1,#0FFH
RET_2:		MOV	R0,#0FFH
RET_1:		DJNZ	R0,RET_1	
		DJNZ	R1,RET_2
		DJNZ	R2,RET_3
		RET

	END

 

 
copyright © 2007-2010  alciro.org  All rights reserved.         
Share |