1. Juan Carlos Gamboa P. (200019045)
PROGRAMACIÓN DEL MICROCONTROLADOR
PIC 16xxx
Prácticas de laboratorio
1. Practica 4. Direccionamiento con PIC
2. Practica 5. Operaciones aritméticas básicas con PIC
3. Practica 6. Operaciones con puertos en PICs
4. Practica 7. Conversión A/D
2. Juan Carlos Gamboa P. (200019045)
PRACTICA No. 4
CARGA DE REGISTROS Y MODOS DE DIRECCIONAMIENTO
1. Escribir un programa que transfiera el contenido de un registro a otro registro de
manera directa en un PIC 16c54. Simúlelo.
Para el direccionamiento directo fue necesaria la implementación del registro de
trabajo (W) necesario para este tipo de acciones. Básicamente, se carga el registro de
trabajo con el comando MOVLW con una constante cualquiera, y posteriormente,
mediante el comando MOVWF se transfiere el contenido cargado en el registro de
trabajo a una determinado registro ubicado en algún espacio de memoria X.
3. Juan Carlos Gamboa P. (200019045)
A continuación, como se puede observar en la fig. 1, se ubican los registros y el
espacio de memoria del pic16c54. Por último, se observa como la constante 11 es
transferido de registro en registro, es decir, del registro 0x08 al 0x0C.
Figura 1. Registros del pic16c54.
2. Realizar un programa que efectué la transferencia de datos de un registro a otro
utilizando direccionamiento indirecto (con el registro INDF). Simúlelo.
En el direccionamiento indirecto, se utilizan los registros FSR e INDF, ubicados en los
registros especiales. El registro FSR sirve como puntero para el direccionamiento
indirecto. Al operar registro INDF se transfiere el valor cargado en el registro W al
registro donde está apuntando FSR dentro de la RAM.
El resultado de la simulación es análogo a la fig. 1. Se pretende transferir datos de un
registro a otro de manera indirecta.
4. Juan Carlos Gamboa P. (200019045)
PRACTICA No. 3
OPERACIONES LÓGICAS Y ARITMÉTICAS BÁSICAS
1. Escribir un programa que sume el contenido de dos registros y guarde el resultado en
otros dos registros consecutivos.
5. Juan Carlos Gamboa P. (200019045)
2. Realizar un programa que efectúe la multiplicación de datos contenidos en dos
registros. El resultado debe guardarse en otros dos registros consecutivos.
6. Juan Carlos Gamboa P. (200019045)
3. Escriba un programa que divida el contenido de dos registros entre el contenido de
otro registro y guarde el resultado en otros dos registros consecutivos.
7. Juan Carlos Gamboa P. (200019045)
Ambas operaciones, tanto división como multiplicación se realizan mediante
rotaciones y sumas sucesivas del bit contenido en el carry. En la división se emplea el
comando rlf, que rota el hacia la izquierda los bits que representan el numero decimal.
Por otro lado, para la multiplicación se empleo la instrucción rrf, el cual de manera
análoga que el comando anterior rota los bits del vector pero en sentido contrario, es
decir, hacia la derecha. El código anterior, para ambos casos se inicia cargando las
constantes a multiplicar, después se crea un vector contador el cual estará encargado
de contar 8 rotaciones de posición. Después se llama a una subrutina encargada de
generar las rotaciones y sumas sucesivas. Cuando el contador llegue a cero se detiene
dicha función y se almacenan en dos vectores la parte alta y baja del resultado ya que
la multiplicación de dos vectores de 8 bits genera uno de 16 bits. Se comprueba el
resultado por medio de la calculadora.
8. Juan Carlos Gamboa P. (200019045)
PRACTICA No. 6
OPERACIONES CON PUERTOS Y OTRAS UNIDADES
PERIFÉRICAS
1. Escribir un programa que coloque en el puerto B los datos contenidos en el registro f8
de la siguiente manera: los cuatro bits superiores salen sin ninguna alteración y los
cuatro bajos son enmascarados con el número "5".
2. Realizar un circuito básico que permita el funcionamiento de un microcontrolador PIC
54, en el cual se disponga de 8 leds conectados al puerto B y un pulsador conectado al
RTCC.
3. Escribir un programa que cuente los pulsos que entran por el pin RTCC. Cuando la
cuenta llegue a 10d, active por un segundo el LED 0 el puerto B.
Hemos integrado estos dos puntos en uno solo. Por un lado generamos un contador de
rebotes por el puerto RTCC y el resultado son cargados en el puerto B del PIC
implementado.
Se implemento un Software PIC Simulator IDE, que nos permite simular en tiempo real
y observar los resultados de la programación del PIC. Debido a que el Software no
soporta el PIC16c54 se escogió el PIC16f84a que está habilitado para su
implementación.
9. Juan Carlos Gamboa P. (200019045)
A continuación, se muestra el código Assembler del PIC:
Se declaran los contadores para el retardo. Además, como se requiere que el conteo
llegue a 10d, creamos un vector que posteriormente se cargara con .10, se crea un
vector auxiliar para guardar el valor del Timer0 en cada ciclo de conteo. Por último, se
genera un vector para que guarde la diferencia con el fin de ir restando el vector
auxiliar del Timer0 con el valor máximo .10. cuando se haga cero este saltara de una
subrutina y prendera por un 1seg el LED0 del puerto 0.
En la etiqueta de inicio se configuran los puertos, las constantes y el vector
OPTION_REG. Este último se utiliza para configurar el timer0 como contador o
10. Juan Carlos Gamboa P. (200019045)
temporizador. En nuestro caso se configura como contador, en nuestro caso hemos
puesto a “1” los bits T0SC, T0SE y PSA. Esto quiere decir que se habilita el pin RTCC del
PIC como entrada del Timer0, que cambiara por medio de una transición de ALTO a
BAJO y, por último, el prescaler se le asigna al WDG. En la etiqueta Contador_pulsos, lo
que se hace es cargar el valor del Timer0 a W, cabe recalcar que antes de entrar a la
siguiente instrucción se llama una subrutina que convierte el número decimal a BCD
que prácticamente es una tabla con los 10 posibles números. Después se enmascara
con el fin de guardar los 4 bits que nos interesa. Después se realiza una resta sucesiva
entre tmr0_actual y máximo_num se testea el bit Z del STATUS para verificar cuando
es cero para generar un salto a la subrutina de retardo donde se prendera el LED0.
Simulación.
Como se puede observar, del lado derecho observamos el puertoA,0 en donde está
conectado un LED el cual es utilizado para indicar cuando la cuenta llegue a 10d. En
los 7 segmentos se muestra el conteo. También se puede observar las entradas del PIC,
que se identifican por medio de los botones T. y las salidas por el puerto B indicados
en color verde.
Por último, se observa que en el momento que el conteo del Timer llega a 10d se
prende el LED conectado al puertoA,0. El cual dura 1seg encendido.
11. Juan Carlos Gamboa P. (200019045)
PRACTICA No. 7
EJERCICIOS CON LOS CONVERTIDORES A/D
1. Realizar el montaje del circuito de la figura, en el cual se dispone de 8 leds conectados
al puerto B y un potenciómetro.
2. Escribir un programa que coloque en el puerto B los datos correspondientes al valor
en hexadecimal producto de la conversión A/D de la señal análoga presente en un pin
del puerto A.
12. Juan Carlos Gamboa P. (200019045)
3. Escribir un programa que entregue una oscilación (ON-OFF) de un LED en el puerto B
con frecuencia variable y proporcional a la entrada análoga.
Para la solución de este enunciado planteamos dos posibles soluciones. Primero,
cuando se haga la conversión de un valor, se testea el bit de interrupción que indica el
fin de la conversión, de voltaje este valor se carga a un ciclo de espera al cual vamos
disminuyendo progresivamente hasta que llegue a cero durante este ciclo de espera el
LED estará encendido. Segundo lugar, configuramos el Timer0 como temporizador y
que produzca una interrupción mediante desbordamiento. Cargamos el valor
producto de la conversión en W , después realizamos la resta de 256-W y este le dará
el tiempo de duración del pulso. El Timer0 comenzara a partir de 256-W y cuando
llegue a 256 desborda a pasa a 0000. Durante ese tiempo que dura en desbordamiento
se activara el LED se testeara el bit de interrupción para apagar el LED y comenzar
todo el proceso de conversión.