Está en la página 1de 12

Sistemas Embebidos

 Subrutinas en uC
 Manejo de Tablas
 Uso de Delays
 Macros

José Oliden Martínez


Subrutinas en C

El uso de subrutinas hace al programa mas modular, a esta se llamará por


el comando call y bastará para regresar de ellas el comando return o retlw
k, el cual retornará de la subrutina con el valor de k en W.

--------- Rutina:
--------- ------
Call rutina ------
--------- ------
--------- return

Una tabla es una lista en ROM de constantes en la memoria de programa.


Son esencialmente útiles para la conversión de unos códigos a otros.
José Oliden Martínez
Manejo de Tablas
Para el manejo de tablas en microcontroladores se debe tener en cuenta básicamente el
manejo del puntero de programa. En nuestro caso es el PC, pero debemos darnos cuenta
de que este se divide en PCL y PCH, y que podemos modificar el PCL, pero el PCH se
modifica a través del PCLATH. Se debe tener cuidado con las páginas y además de
direccionar correctamente el PC.
Ahora vamos a ver un ejemplo de manejo de tablas en una visualización de los
números hexadecimales (manejados por el microcontrolador) en un display de 7
segmentos puesto en el puerto D. Utilice displays de Ánodo común y de Cátodo
Común

RD7
PIC
16F877A

RD0
ORG 0x00
Inicio: BSF STATUS,RP0 ;
CLRF TRISD ;
BCF STATUS,RP0 ;.

Solución CLRF
CLRW
PORTD ;
;
; ************************* Cuerpo Principal **************************
Reset: CLRF digito ;
Siguiente: MOVF digito,W ;
CALL Tabla ;
MOVWF PORTD
INCF digito,F ;
Segmento a b c d e f g dp
MOVF digito,W ;
Pin en D 7 6 5 4 3 2 1 0
XORLW 0x0A ;
BTFSC STATUS,Z ;
Número
GOTO Reset ;
0 1 1 1 1 1 1 0 0 0xFC GOTO Siguiente ;
1 0 1 1 0 0 0 0 0 0x60 Tabla:

2 1 1 0 1 1 0 1 0 0xDA ADDWF PCL,F ;


RETLW 0xFC ; 0 en código 7 segmentos
3 1 1 1 1 0 0 1 0 0xF2
RETLW 0x60 ; 1 en código 7 segmentos
4 0 1 1 0 0 1 1 0 0x66
RETLW 0xDA ; 2 en código 7 segmentos
5 1 0 1 1 0 1 1 0 0xB6 RETLW 0xF2 ; 3 en código 7 segmentos
6 1 0 1 1 1 1 1 0 0xBE RETLW 0x66 ; 4 en código 7 segmentos
7 1 1 1 0 0 0 0 0 0xE0 RETLW 0xB6 ; 5 en código 7 segmentos

8 1 1 1 1 1 1 1 0 0xFE RETLW 0xBE ; 5 en código 7 segmentos


RETLW 0xE0 ; 7 en código 7 segmentos
9 1 1 1 1 0 1 1 0 0xF6
RETLW 0xFE ; 8 en código 7 segmentos
Para el display de ánodo común se RETLW 0xF6 ; 9 en código 7 segmentos
intercambian los unos por ceros y
END
viceversa
José Oliden Martínez
Tarea

Realizar un decodificador de BCD a 7 segmentos donde el dato en BCD se


ingrese por el puerto A y el número se visualice por el puerto D

José Oliden Martínez


Manejo de tiempos

Una de las principales utilidades de las subrrutinas es el manejo de tiempos.


Se pueden manejar delays o temporizadores en uC ya que se conoce el
tiempo que demora cada instrucción (4 ciclos de reloj, las de salto demoran
8 ciclos de reloj). Haga los cálculos para un XTAL de 4 MHZ

RUT_TIEMPO:
movlw 3 ; 1 ciclo de instrucción = 1uS
movwf VARIABLE ; 1 ciclo de instrucción = 1uS
LAZO:
decfsz VARIABLE ; 1 ciclo de instrucción = 1uS
goto LAZO ; 2 ciclos de instrucción = 2uS

return

1 ciclo de instrucción = 4 ciclos de reloj


José Oliden Martínez
INICIO

CONFIGURAR
Rutinas de tiempo
CONTA1 = d'166'

DELAY_50mS:
movlw d‘166'
CONTA2 = d'250'
movwf CONTA1
bucle1:
movlw d‘250'
NO movwf CONTA2
CONTA2=CONTA2-1 NO
bucle2:
decfsz CONTA2,F
goto bucle2
decfsz CONTA1,F
CONTA2 = 0? goto bucle1
return

CONTA1 = CONTA1-1 bucle1 = 4 x Tosc x CONTA2 x (3 ciclos de instrucción)

CONTA1 = 0? bucle2 = bucle 1 x CONTA1 = 4 x 0.1x10-6 x 250 x 3 x 166 = 50mS

FIN
* Se está usando un XTAL de 10 MHz

José Oliden Martínez


Rutinas de tiempo
10MHz

Sobre el mismo programa de manejo de tablas (display de 7 segmentos) introduzca un


tiempo para poder visualizar los datos cada segundo.
NOTA. Tenga en cuenta que tipo de display está usando.

DELAY_50ms: DELAY_100ms:
movlw d‘166' call DELAY_50ms
movwf CONTA1 call DELAY_50ms
bucle1: return
movlw d‘250'
DELAY_500ms:
movwf CONTA2
call DELAY_100ms
bucle2:
call DELAY_100ms
decfsz CONTA2,F
call DELAY_100ms
goto bucle2
call DELAY_100ms
decfsz CONTA1,F
call DELAY_100ms
goto bucle1
return
return

José Oliden Martínez


Rutinas de tiempo
20MHz

Sobre el mismo programa de manejo de tablas (display de 7 segmentos) introduzca un


tiempo para poder visualizar los datos cada segundo.
NOTA. Tenga en cuenta que tipo de display está usando.

DELAY_10ms:
DELAY_50ms:
movlw d‘67'
call DELAY_10ms
movwf CONTA1
call DELAY_10ms
bucle1:
call DELAY_10ms
movlw d‘250'
call DELAY_10ms
movwf CONTA2
call DELAY_10ms
bucle2:
return
decfsz CONTA2,F
goto bucle2 DELAY_100ms:

decfsz CONTA1,F call DELAY_50ms

goto bucle1 call DELAY_50ms


return
return

José Oliden Martínez


Tarea

Visualizar los números del 0 al 9 en un display de Ánodo común o de Cátodo Común,


con retardos de 1 segundo entre números.

José Oliden Martínez


Macros en PIC’s

Las macros son pequeñas subrutinas en donde se ingresan valores o


parámetros sobre los cuales se efectúa una acción.

Sintaxis:
[nombre_macro] macro [Reg, bit, etc. ]
[instrucción sola o con Reg, bit, etc.]
endm

Ejemplo:
jmp macro Adr ;goto
goto Adr
endm
José Oliden Martínez
Macros en PIC´s
(ejemplos)
Banco0 macro
bcf STATUS,RP0
bcf STATUS,RP1
endm

sbs macro Reg, Bit ;obviar si bit esta seteado


btfss Reg, Bit
endm

compara macro reg1, constante


movlw constante
xorwf reg1,W
endm

José Oliden Martínez

También podría gustarte