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
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.
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.
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.
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.
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.
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.
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.
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
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.
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.
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.

Programación del microcontrolador

  • 1.
    Juan Carlos GamboaP. (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 GamboaP. (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 GamboaP. (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 GamboaP. (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 GamboaP. (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 GamboaP. (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 GamboaP. (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 GamboaP. (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 GamboaP. (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 GamboaP. (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 GamboaP. (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 GamboaP. (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.