Vous êtes sur la page 1sur 8

Índice

I Objetivo 1

II Materiales y equipo 1

III Marco teórico 1


3.1 Puerto B de PIC16F877A . . . . . . . . . . . . . . . . . . . . . . 1
3.2 Rotate Right F through Carry (RRF) . . . . . . . . . . . . . . . . 2

IV Desarrollo 3

V Observaciones y conclusiones 5

i
I. Objetivo

Realizar un programa en lenguaje ensamblador para el microcontrolador 16F877 que


realice una secuencia de LEDs de izquierda a derecha (encender bit más significativo
hasta el bit menos significativo apagando el anterior, repetir indefinidamente).

II. Materiales y equipo

PIC 16F877A

Programador Volnia USP 3.0 plus

8 LEDs

Resistencias: 1 de 10 kΩ y 8 de 330 Ω

2 capacitores de 27 pF

Oscilador de 4 MHz

Fuente de voltaje

Protoboard

III. Marco teórico

3.1. Puerto B de PIC16F877A

El puerto B es un puerto bidireccional de 8 bits. Su dirección de datos correspondiente


es TRISB. Configurar uno de los bits de TRISB en 1 hará que la terminal correspondiente
del Puerto B se utilice como entrada, mientras que poniéndolo en 0 hará que la terminal
se tome como salida.
Los bits de los que se compone el Puerto B son RB0, RB1, RB2, RB3, RB4, RB5, RB6
y RB7. En la figura 3.1 se muestran las terminales de cada puerto subrayadas de distintos
colores, desde el Puerto A al Puerto E. Las terminales correspondientes al puerto B están
subrayadas de color amarillo.
Cada una de estas terminales corresponde a un bit del Puerto B. Cada terminal tiene
una función, ya sea como entrada o salida del puerto B, pero algunas cuentan con otras
funciones. Las funciones de cada bit se describe en la tabla correspondiente de la figura
3.2.

1
Figura 3.1: Terminales de puertos del PIC16F877A.

Figura 3.2: Funciones del Puerto B.

3.2. Rotate Right F through Carry (RRF)

La instrucción RRF o Rotate Right F through Carry es una instrucción orientada a


byte del PIC16F877A. Lo que hace esta instrucción es que rota el contenido de un registro
F hacia la derecha, mediante la bandera de Carry o acarreo.
La sintáxis de esta instrucción es como se describe a continnuación.
[ etiqueta ] RRF f ,d

Si ’d’ es ’0’, el resultado coloca en el registro W. Si ’d’ es ’1’ el resultado se coloca en


el registro F.

2
IV. Desarrollo

Lo primero que se realizó fue la redacción del código a cargar en el PIC. Para esto
se utilizó la instrucción RRF (Rotate Right through Carry). Como el objetivo es hacer
una secuencia de LEDs basta con poner un bit en ’1’ e ir rotando este número para que
siempre quede sólo un bit en ’1’ y por lo tanto sólo se encienda un LED a la vez. También
de esta manera se consigue hacerlo en orden.
La sección principal de código resultó de la siguiente manera. El código completo se
encuentra en la sección de Anexos.

CondicionInicial
BSF PORTB, 7 ; Se e n c i e n d e e l LED c o n e c t a d o a l
p i n RB7 (MSB)
GOTO EncenderLEDs

EncenderLEDs
CALL Retardo ; Llamada a l a r u t i n a de r e t a r d o
RRF PORTB, 1 ; R e c o r r e e l 1 que ha b i a en RB7
a RB6
GOTO EncenderLEDs

Aunque hay dos instrucciones de rotación del bit de acarreo, RRF (Rotate Right
through Carry) y RLF (Rotate Left through Carry), se seleccionó RRF por la condición
de que debe encenderse primero el LED que corresponda al bit más significativo.
Habiendo redactado el código, este se ensambló en MPLAB. Posteriormente se cargó el
archivo .HEX al PIC, usando el programador Volnia USP 3.0 plus, como se muestra en
la figura 4.1.

Figura 4.1: Ventana de software del programador al ser cargado el archivo .HEX.

Posteriormente se armó el circuito de la figura 4.2 en el protoboard para verificar su


funcionamiento una vez implementado.
El circuito consiste del PIC16F877A, un oscilador de 4 MHz, diversas resistencias y
8 LEDs, cada uno conectado a cada una de las terminales del Puerto B.

3
Figura 4.2: Circuito para secuenciador de LEDs.

Lo que se obtuvo fue una secuencia de LEDs desde el bit más significativo, en este
caso la terminal RB7, hasta el menos significativo, RB0, secuencia que continúa indefini-
damente mientras se encuentre alimentado el circuito.
Como primera acción se enciende el LED conectado a la terminal RB7. Figura 4.3.

Figura 4.3: Terminal RB7 con LED encendido.

Después se enciende el LED conectado a la terminal RB6. Figura 4.4.

Figura 4.4: Terminal RB6 con LED encendido.

Después se enciende el LED conectado a la terminal RB5. Figura 4.5.

Figura 4.5: Terminal RB5 con LED encendido.

Esto sucede sucesivamente de LED en LED hasta el bit menos significativo que co-
rresponde a la terminal RB0. Figura 4.6.

Figura 4.6: Terminal RB0 con LED encendido.

Una vez que se han encendido cada uno de los LEDs vuelve a encenderse el LED
conectado a la terminal RB7 y se repite el proceso.

4
V. Observaciones y conclusiones

Con esta práctica nos dimos cuenta de que algunas de las instrucciones que tiene el
PIC16F877A facilitan y simplifican la elaboración del código, ya que se requieren menos
lı́neas de código. Esta práctica pudo haberse realizado poniendo en ’1’ y ’0’ cada uno de
los bits manualmente, pero resultó más sencillo utilizar la instrucción RRF para ello.

Referencias

[1] PIC16F87XA Data Sheet. 28/40/44-Pin Enhanced Flash Microcontrollers. Micro-


chip Technology Inc. 2003.

5
Anexos

CONFIG WDT OFF& PWRTE OFF& XT OSC& LVP OFF& CP OFF

LIST p=16F877A
INCLUDE <P16F877A . INC>

ORG 0 x00 ; I n i c i o de programa

N EQU 0 x00
c on t 1 EQU 0 x20
c on t 2 EQU 0 x21

; CODIGO PRINCIPAL DEL PROGRAMA

Inicio
BCF STATUS, RP0 ; Accede a banco de memoria 0
BCF STATUS, RP1
CLRF PORTB ; Pone en 0 t o d o s l a s t e r m i n a l e s
de PORTB
BSF STATUS, RP0 ; Accede a banco de memoria 1
CLRF TRISB ; Configura todas l a s terminales
de PORTB como s a l i d a s
BCF STATUS, RP0 ; Regresa a banco de memoria 0
GOTO CondicionInicial

CondicionInicial
BSF PORTB, 7 ; Se e n c i e n d e e l LED c o n e c t a d o a l
p i n RB7 (MSB)
GOTO EncenderLEDs

EncenderLEDs
CALL Retardo ; Llamada a l a r u t i n a de r e t a r d o
RRF PORTB, 1 ; R e c o r r e e l 1 que ha b i a en RB7
a RB6
GOTO EncenderLEDs

; SUBRUTINA DE RETARDO

Retardo
MOVLW N ; E s c r i b e 0 x00 en W
MOVWF c o nt 1 ; E s c r i b e 0 x00 en co n t1
Repite1
MOVLW N ; E s c r i b e 0 x00 en W
MOVWF c o nt 2 ; E s c r i b e 0 x00 en co n t2
Repite2
DECFSZ cont2 , 1

6
GOTO Repite2
DECFSZ cont1 , 1
GOTO Repite1
RETURN ; Retorno a r u t i n a EncenderLEDs

END

Vous aimerez peut-être aussi