Está en la página 1de 19

Universidad Rafael Urdaneta

Facultad de Ingeniería
Escuela de Ingeniería en Computación
URU 2020B - Cátedra: Microprocesadores I
Profesor: Claudio Bustos
Sección: “A”

Trabajo final con Lenguaje Ensamblador y PIC16F84A.


(Codificación y revisión (A, B y C).

Realizado por:
Heberto Urribarri, CI: 27.962.940
Víctor Atencio, CI: 28.252.900

Maracaibo, diciembre del 2020


Índice.

A) Programas Básicos: 3
B) Programas con entradas: 7
C) Otras herramientas: 12
A) Programas Básicos:
A.1. ​Codifique un programa en Ensamblador para PIC16F84A que permita
encender en forma intermitente todos los bits del puerto B (RB7:RB0).

R:

Definimos los puertos B (PORTB) como salida de datos, apuntamos al banco de


memoria 1 a través de la instrucción, bsf STATUS, RP0, luego se asignaron los
puertos B como salida se limpió ​el registro TRISB asociado los puertos con el
comando clrf, así se consigue que todos los bits del registro tengan un valor de 0.
Retornamos al banco de memoria 0, que es done el programa se va a realizar.
Limpiamos todo el registro que corresponde al PORTB. El programa comienza en
​ ara invertir todos los bits que
la etiqueta inicio, y luego se usa el comando comf p
están en el PORTB, pasando de este modo a estar en posición de encendido. Se
llama a un retardo, y se apagan o limpian con la instrucción clrf se llama a otro
retardo y se reinicia el bucle con la instrucción goto inicio la cual apunta al inicio
del programa, enciendo en forma intermitente todos los bits del puerto B.
A.2. ​Codifique un programa en ensamblador para PIC16F84A que permita
encender en forma intermitente los 4 bits menos significativos de los puertos A y B
(RA3:RA0 y RB3:RB0), en forma alternada (cuando los bits del puerto A se
enciendan se apagaran los del puerto B, y viceversa).

R:

Se carga en registro de trabajo (w) el número en binario “00001111”,


correspondiente a los cuatro bits menos significativos que se planean encender
con la instrucción movlw. Luego este valor que se encuentra en el registro de
trabajo se mueve al registro asociado al PORTA con la instrucción movwf y se
llama a un retardo. Seguidamente cuando se retorna de la etiqueta “retardo”, se
apagan todos los bits del registro PORTA con la instrucción clrf, se carga
nuevamente el valor binario ‘00001111’ en el registro de trabajo que se carga
posteriormente a PORTB, se llama a un retardo, se limpia PORTB, y se usa la
instrucción “goto inicio” para reiniciar el ciclo infinitamente.
B) Programas con entradas:
B.1. ​Codifique un programa en Ensamblador para PIC16F84A que permita encender en
forma intermitente los 4 bits menos significativos de los puertos A y B (RA3:RA0 y
RB3:RB0) cuando el bit 7 del puerto B sea 0 (RB7=0) y mantenga apagados estos
mismos bits (RA3:RA0 y RB3:RB0) en forma permanente cuando RB7=1.

R:

Para el siguiente programa inicialmente se entra al banco de memoria 1 con la


instrucción ‘bsf STATUS, RP0‘ esto con el fin de colocar las terminales en estado
de entrada o salida de datos. Se limpia el registro TRISA y mueve el literal “
b'10000000'“ al registro de trabajo y posteriormente se inserta en el registro
‘TRISB’ con lo cual el RB:7 y se retorna al banco de memoria 0, donde se realizará
el programa. Se verifica el estado del puerto RB7 con la instrucción ‘btfss’ en caso
de ser 1 el estado del puerto se hará un salto de línea donde se limpiarán los
registros PORTA y PORTB, hasta llegar a una instrucción ‘goto inicio’ que
reiniciará el ciclo. En caso de ser el estado 0, se llamará a la instrucción
‘intermitente’ donde la misma moverá el literal “b'00001111'” al registro de trabajo
y posteriormente a PORTA y PORTB, llamara a un retardo y luego limpiará la
mismas entradas enciendo y apagando los 4 bits menos significativos de cada
registro de forma intermitentes. Se verifica nuevamente el estado RB7, en caso de
seguir en un estado ‘alto’ se redirige de nuevo a la etiqueta intermitente, de caso
contrario se retorna al inicio y se sigue con el bucle infinitamente.
B.2. ​Codifique un programa en Ensamblador para PIC16F84A que permita
encender en forma secuencial ascendente un solo bit del puerto B (RB7:RB0)
cuando el bit 4 del puerto A sea 1 (RA4=1) y en forma secuencial descendente
cuando RA3=1. El bit se mantendrá sin cambios cuando RA4=0 y RA3=0. El bit
encendido deberá detenerse y mantenerse encendido en RB7 (si es ascendente) y
en RB0 (si es descendente).

R: ​Para el siguiente programa inicialmente se entra al banco de memoria 1 con la


instrucción ‘bsf STATUS, RP0‘ esto con el fin de colocar las terminales en estado
de entrada o salida de datos. Se mueve al registro TRISA el literal “b'00011000’“ al
generar que RA3 y RA4 sean entradas de datos, posteriormente se limpia el
registro ‘TRISB’ y se retorna al banco de memoria 0, donde se realizará el
programa. Se mueve el literal “b'00001000'” al registro PORTB, para iniciar con
RB4 encendido. Luego se entra en la etiqueta de ‘inicio’ donde se comienza
verificando el estado de RA3, en caso de ser 0, salta y se verifica el estado de
RA4 donde nuevamente si el estado es 0 se retorna a instrucción inicio para
retomar el ciclo. En caso que RA3 o RA4 estén en estado alto se llamará a las
subrutinas ‘movIzq’ o ‘movDer’ respectivamente. Para la subrutina ‘movIzq’ se
verifica el estado del puerto RB7, esto con la intención que el mismo está en un
estado alto, no correr el bit más hacia la izquierda y quedarse ‘estático’ el bit
encendido en RB7, de este no se el caso, se sigue a la siguiente operación ‘RLF
PORTB’ donde se corre un bit a la izquierda. La misma operación se realiza si el
estado de RA4 está encendido, con la diferencia que se usa la instrucción ‘RRF
PORTB’ en vez de ‘RLF PORTB’, para correr el bit hacia la derecha. Al final de
estas secuencias se retorna de donde fueron llamadas y se reinicia con el bucle.
C) Otras herramientas:
C.1. ​¿Qué es el Timer 0 (TMR0) del PIC16F84A? ¿Cuáles bits del registro
OPTION_REG permiten configurarlo?

R: ​El Timer 0 es un temporizador/contador que posee el PIC16F84A. Básicamente


es un contador binario ascendente de 8 bits, que se incrementa de dos formas
posibles: una de ellas depende del oscilador del sistema y la otra de la señal
entrante en el pin RA4/T0CKI.
Cuando se usa con la señal externa este puede incrementar ya sea con un flanco
de subida o de bajada según se decida previamente, en este caso usualmente se
usa como contador de eventos externos, y cuando se incrementa mediante la
señal de reloj se usa como temporizador
Se puede escribir (un valor de 8 bits 0 a 255) o leer en cualquier momento que lo
necesitemos. Como el Timer0 es un simple contador de 8 bits, tiene un límite de
cuenta y cuando llega a él e incrementa una vez más se desborda y comienza de
0 nuevamente. Cuando se usa como temporizador usualmente se divide la señal
de reloj con un divisor de frecuencia o Preescaler, el cual toma un valor de
potencia 2 desde 0 a 256 (2, 4, 8, 16, 32, 64, 128, 256).

El registro OPTION_REG se encuentra ubicado en la dirección 81h en banco 1 de


la memoria de datos, tiene 8 bits que sirven de configuración y controla del TMR0,
lo cuales son lo que están en la siguiente imagen
PS2, PS1, PS0 (Prescaler rate select bits), correspondientes a los bits 2, 1, 0
respectivamente sirven para definir el rango del prescaler a utilizar, mediante
combinaciones de estos bits se tienen diferentes valores para el prescaler, el que
a su vez dependerá de a quien se le a asignado el prescaler (TMR0 o WDT)
mediante el bit3.

PSA (Prescaler assignment bit): correspondiente al bit 3 determina a quien se le


asignará el prescaler. 0 para el TIMER0, 1 para WDT
T0SE (TMR0 Source Edge bit): si se usa el TIMER0 como contador con este
bit se elige si se quiere que el timer0 PIC cuente por flanco de subida, esto es
cuando la señal que llega por el pin RA4/T0CKI pase de 0 a 1, o que cuente por
flanco de bajada , esto es cuando la señal que llega por el pin RA4/T0CKI pase
de 1 a 0, si T0SE=1 se contará por flanco de bajada, si T0SE=0 se contará por
flanco de subida
T0CS correspondiente al bit 5 se elegirá la forma con la que se incrementara el
contador, al poner este bit a 1 se elige utilizar el timer0 PIC como contador, si se le
pone a 0 se elige utilizar el timer0 PIC como temporizador.
El INTEDG bit6 es para cuando se utilice una interrupción externa por el pin INT,
con este bit se elige si se quiere que la interrupción sea por flanco de subida o por
flanco de bajada.
El RBPU’ bit7 al poner este bit a 0 se activan unas resistencias pull up internas
que el microcontrolador tiene en el puerto B.
C.2. ​Analice un programa en Ensamblador para PIC16F84A que utilice cualquier
subrutina de retardo basada en el TMR0. Determine ¿cuál es el retardo máximo
posible en el programa analizado?

R:​ Cuando se usa el timer0 como temporizador, usando un oscilador de 4MHz, el


mismo aumentará con cada ciclo de máquina, el cual tiene un tiempo de 1
microsegundo. De esta forma el tiempo que el timer0 tarda en desbordarse viene
dada por la ecuación: ​Tiempo = prescaler (256 - carga) + 2.

Tiempo dado en ciclos de máquinas, por lo que se debe de multiplicar por el


tiempo de ciclo de máquina que se usará (en caso de 4MHz 1us). El valor de
carga corresponde con el valor inicial que le cargamos al timer0 desde donde
comenzará a contar. De este como con un oscilador de 4MHz (el cual se usa para
este proyecto), el prescaler más alto posible (1:256), y cargando un valor de 0,
para que cuente los 8 bits (256 posiciones) se tiene que el tiempo máximo que el
mismo puede lograr sería 65538 us , es decir 65.538 ms En la siguiente imagen se
muestra un programa usando el TIMER0 para encender en forma intermitente, los
bits del PORTB, colocando en el prescaler 256, y cargando el número 0 con la
intención de obtener el tiempo más prolongado en la secuencia. También se limpia
el bit INTCON para evitar alguna interrupción
C.3. ​¿Cuáles tipos de interrupciones posee el PIC16F84A? ¿Cuáles bits del
registro INTCON se usan por tipo?

El PIC 16F84A posee cuatro mecanismos diferentes de interrupción:

● Por el pin RB0/INT que regresa al PIC del modo SLEEP (interrupción externa)
Interrupción externa, la cual ocurre cuando en el pin RB0/INT se tena un
flanco de subida o bajada. El flanco de la señal que producirá la
interrupción se elige con el bit INTEDG del registro OPTION. De este modo
cuando se produzca el flanco se producirá una interrupción y se pondrá en
marcha el proceso que atenderá la interrupción.

● Interrupción por cambio de estado en las líneas del puerto B


Tiene que ver con un cambio en el estado de los pines altos del puerto B
(RB4 a RB7). Esta interrupción se llevará a cabo n cualquier cambio en el
estado de las cuarta líneas más altas del puerto B pasando ya sea de 0 a 1
o de 1 a 0.
● Por desbordamiento del registro TMR0. Cuando este pasa de 255 a 0

● Al completar la escritura de la EEPROM


En la librería EEPROM se genera un bucle que lee el bit EEIF hasta
que indica que la escritura ha finalizado y d de esta manera se indica
que la escritura ha finalizado. Ahora si se activa el bit GIE y el bit
EEIE, se tendrá una interrupción cuando la escritura de un byte en la
EEPROM de datos haya finalizado y se activa el bit EEIF.

El registro INTCOIN contiene los bits para habilitar cada una de las fuentes de
interrupción y las banderas que informan el origen de la interrupción.
C.4. ​Analice un programa en Ensamblador para PIC16F84A que utilice dos tipos
de interrupción como mínimo. Explique ¿cómo es el proceso de habilitación de
estas interrupciones durante su ejecución?

R:​ Utilizando la interrupción del Timer0. la línea 3 del puerto B se enciende cada
600ms y apaga durante otros 300ms. esto como un ejemplo para esta
interrupción, hay un periodo de 50ms gracias a un preescaler de 256, y esto se
repite las veces necesarias para llegar a 600ms para que se vea el efecto. se
repite 12 veces para 600ms y 6 veces para 300ms. Para nuestra interrupción se le
asigna una dirección que es ORG 4. Cuando hace la cuenta de los 50ms se
genera una interrupción que se llama TMR0_INT. En primer caso se hace el
MOVLW y se recarga el periodo de 50ms a la variable TMRO. luego se
decrementa en 1 a la variable tiempo y lo guarda en la misma variable. Cuando
llega a cero se finaliza la interrupción. y además regresamos e iniciamos en cero
la interrupción global GIE. Esto para que se haga el bucle para mantenerla
encendida el tiempo de debe de estar y luego para que se mantenga apagado el
tiempo en el que deba estar.

También podría gustarte