Actividad 5 - Programación Elemental


Introduccion
Los sistemas embebidos son dispositivos electronicos que resuelven una o varias tareas espcificas. Cuentan con entradas y salidas, y las aciones que realizan se pueden programar. Los lenguajes de programacion mas empleados son ensamblador o assembler y el C.

Objetivo del trabajo practico.

Conocer el repertorio de instrucciones del microcontrolador.
Aprender a programar en lenguaje ensamblador.
Aprender a programar en lenguaje C.
Desarrollo

Resolver los siguientes problemas en los dos lenguajes, ASM y C.
Simular su funcionamiento usando el simulador del MPLB y usando el simulador ISIS de PROTEUS.
Armar el circuito y probar el funcionamiento real.
Publicar en el blog los programas fuente.
Archivo del simulador ISIS.
Fotografia del circuito armado.
Video de corta duracion donde se resuelve el ejercicio 9.
Manejo de PORTS

Ejercicio 1

Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A al que está conectado un array de interruptores. Por ejemplo, si por el Puerto A se introduce "---11001", por el Puerto B aparecerá "xxx11001" (el valor de las tres líneas superiores no importa).

Funciones Matemáticas

Ejercicio 2

Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A, al que está conectado un array de interruptores, sumándole el valor de una constante, por ejemplo 74.
Es decir: (PORTB)=(PORTA)+Constante
Ejercicio 3

Por el Puerto B se obtiene el dato del Puerto A multiplicado por 2.
Es decir: (PORTB)=2(PORTA)=(PORTA)+(PORT A).

Máscaras

Ejercicio 4

Por el Puerto B obtiene el dato del Puerto A, pero en la salida los bits pares se fijan siempre a "1". El orden de los bits será "b7 b6 b5 b4 b3 b2 b1 b0", siendo los pares el b6, b4, b2 y el b0.
Por ejemplo, si por el Puerto A se introduce el dato b'---01100', por el Puerto B se visualiza  b'01011101'. Observar que los bits pares están a "1" (efectivamente: Puerto B = b'x1x1x1x1') y los impares permanecen con el dato del puerto de entrada (efectivamente: Puerto A = b'---x1x0x' y Puerto B = b'xxxx1x0x').

Ejercicio 5

Por el Puerto B obtiene el dato del Puerto A, pero en las salida los bits impares se fijan siempre a "0". El orden de los bits será "b7 b6 b5 b4 b3 b2 b1 b0", siendo los impares el b7, b5, b3 y b1.
Por ejemplo si por el Puerto A se introduce el dato b'---01100', por el Puerto B se visualiza  b'00000100'. Observar que los bits impares están a "0" (efectivamente: Puerto B = b'0x0x0x0x') y los pares permanecen con el dato del puerto de entrada (efectivamente: Puerto A = b'---0x1x0' y Puerto B = b'---0x1x0').

Ejercicio 6

Por el Puerto B se obtiene el dato del Puerto A invirtiendo los bits pares. Los impares se dejan como en la entrada. El orden de los bits será "b7 b6 b5 b4 b3 b2 b1 b0", siendo los pares el b6, b4, b2 y el b0.
Por ejemplo, si por el Puerto A se introduce "---11001", por el Puerto B aparecerá "xxx01100".  Observar que los bits pares están invertidos (efectivamente: Puerto A = "---1x0x1" y Puerto B = "xxxx0x1x0") y en los impares permanece el dato del puerto de entrada (efectivamente: Puerto A = "---x1x0x' y Puerto B = b'xxxx1x0x').
Ayuda: Utiliza la función XOR y la máscara b'01010101'

Funciones lógicas

Ejercicio 7
Por el Puerto B se obtiene el dato del Puerto A invertidos los unos y ceros. Por ejemplo, si por el Puerto A se introduce "---11001", por el Puerto B aparecerá "xxx00110" (no importa el estado de los tres bits superiores del Puerto B).

Ejercicio 8

Por el Puerto B obtiene el dato del Puerto A intercambiando los nibbles alto y bajo. Por ejemplo, si por el Puerto A se introduce "---11001" por el Puerto B aparecerá "1001xxx1".

Ejercicio 9

Por el Puerto B obtiene el dato del Puerto A desplazando un bit hacia la izquierda, por la derecha entrará un "1". Por ejemplo, si por el Puerto A se introduce "---11001", por el Puerto B aparecerá "xx110011" (no importa el estado de los dos bits superiores del Puerto B).

Ejercicio 10

Por el Puerto B se obtiene el dato del Puerto A desplazando un bit hacia la derecha, por
la izquierda entrará un "0". Por ejemplo, si por el Puerto A se introduce "---11001", por el Puerto B aparecerá "0xxx1100".

Funciones especiales

Ejercicio 11

Por el Puerto B se obtiene el dato de las cinco líneas del Puerto A al que están conectado un array de interruptores. Por ejemplo, si por el Puerto A se introduce "---11001", por el Puerto B aparecerá "xxx11001" (el valor de las tres líneas superiores no importa).
Esta operación la realizará una única vez. Después el programa entrará en modo "Standby" o de bajo consumo del cual no podrá salir después.

Comparaciones

Ejercicio 12

Compara el dato del puerto de entrada PORTA con un "Numero". Tres posibilidades:
  - Si (PORTA) = Numero se encienden todos los LEDs de salida.
  - Si (PORTA) > Numero se activan los LEDs pares de salida.
  - Si (PORTA) < Numero se encienden los LEDs del nibble alto y se apagan los del bajo.
Hay que destacar que al no haber instrucciones de comparación, estas se realizan mediante restas.

BCD

Ejercicio 13

Un número binario de 8 bits es convertido a BCD. El resultado se guarda en tres posiciones de memorias llamadas Centenas, Decenas y Unidades. Además al final las unidades estarán en el nibble bajo del registro W y las decenas en el nibble alto. En los diodos LEDs conectados al puerto de salida se visualizarán las decenas y las unidades.
El máximo número a convertir será el 255 que es el máximo valor que puede adquirir el número binario de entrada de 8 bits.
El procedimiento utilizado es mediante restas de 10 tal como se explica en el siguiente ejemplo que trata de la conversión del número 124 a BCD:

(Centenas)    (Decenas)    (Unidades)    ¿(Unidades)<10?     ¿(Decenas)=10?
----------    ---------    ----------    --------------    -------------------------
       0               0              124          NO, resta 10       Incrementa (Decenas).
       0               1              114          NO, resta 10       NO. Incrementa (Decenas).
       0               2              104          NO, resta 10       NO. Incrementa (Decenas).
       0               3              94           NO, resta 10        NO. Incrementa (Decenas).
       0               4              84           NO, resta 10        NO. Incrementa (Decenas).
       0               5              74           NO, resta 10        NO. Incrementa (Decenas).
       0               6              64           NO, resta 10        NO. Incrementa (Decenas).
       0               7              54           NO, resta 10        NO. Incrementa (Decenas).
       0               8              44           NO, resta 10        NO. Incrementa (Decenas).
       0               9              34           NO, resta 10        NO. Incrementa (Decenas).
       1               0              24           NO, resta 10        Sí. (Decenas)=0, y además
                                                                               incrementa (Centenas)
       1               1              14           NO, resta 10        NO. Incrementa (Decenas)
       1               2              4             SÍ, se acabó. El número a convertir será la constante "Numero".

Salto Indexado

Ejercicio 14

Controla el nivel de un depósito de líquido. Utiliza (entre paréntesis las líneas del microcontrolador a la que se han conectado):
Tres sondas detectoras: SV, Sonda de Vacío (RA0); SLL, Sonda de LLenado (RA1); SR, Sonda de Rebose (RA2).
Dos bombas de agua: B1 (RB5), B2 (RB6).
Cinco indicadores: Vacio (RB0), Llenandose (RB1), Lleno (RB2), Rebose (RB3), Alarma (RB4).
Su funcionamiento:
Cuando ninguna de las sondas está mojada se entiende que el depósito está vacío y se accionarán las dos bombas. El indicador "Vacio" se iluminará.
Cuando el nivel del líquido toque la sonda de vacío "SV" seguirá llenándose el depósito con las dos bombas. El indicador "Llenandose" se ilumina.
Cuando el nivel del líquido toca la sonda de llenado "SLL", para la bomba B2, quedando B1 activada en modo mantenimiento. El indicador "Lleno" se ilumina.
Si el nivel del líquido moja la sonda de rebose "SR" se apaga también la bomba B1, quedando las dos bombas fuera de servicio. El indicador "Rebose" se enciende.
Cuando se produce un fallo o mal funcionamiento en las sondas de entrada (por ejemplo que se active la sonda de rebose y no active la de vacío) se paran las dos bombas. El indicador "Alarma" se ilumina.

Según el enunciado del problema, teniendo en cuenta las conexiones citadas y poniendo la salida no utilizada (RB7) siempre a cero, la tabla de verdad resultante es:

 RA2.. RA0 | RB7 ...                   ... RB0
 ----------|------------------------------------------------------------------
  0   0   0  |  0   1   1   0   0   0   0   1    (Configuración 0. Estado "Vacio").
  0   0   1  |  0   1   1   0   0   0   1   0    (Configuración 1.Estado "Llenandose").
  0   1   0  |  0   0   0   1   0   0   0   0    (Configuración 2. Estado "Alarma").
  0   1   1  |  0   0   1   0   0   1   0   0    (Configuración 3. Estado "Lleno").
  1   0   0  |  0   0   0   1   0   0   0   0    (Configuración 4. Estado "Alarma").
  1   0   1  |  0   0   0   1   0   0   0   0    (Configuración 5. Estado "Alarma").
  1   1   0  |  0   0   0   1   0   0   0   0    (Configuración 6. Estado "Alarma").
  1   1   1  |  0   0   0   0   1   0   0   0    (Configuración 7. Estado "Rebose").

Tablas

Ejercicio 15

Por el display de 7 segmentos conectado al Puerto B se visualiza una de las 26 letras del alfabeto internacional: de la "A" a la "Z". La letra a visualizar lo determina el orden leído por el Puerto A. Así por ejemplo:
Si por el Puerto A se lee "---0000"  (cero) la letra visualizada será la "A" que es la que está en el orden cero.
Si por el Puerto A se lee "---1101" (veinticinco) la letra visualizada será la "Z" que es la que está en el orden veinticinco.

Por ahora no se contempla la posibilidad que el número de entrada sea mayor de 25.

Retardos

Ejercicio 16

Los diodos pares conectados al puerto de salida se encienden durante 0,5 segundos y los impares permanecen apagados. Después al contrario durante el mismo tiempo.

Ejercicio 17

Por la barra de diodos leds conectada al puerto de salida, un led encendido rota a la izquierda 0,3 s en cada posición. Cuando llega al final se apagan todos los leds y repite de nuevo la operación.

Ejercicio 18

Por la barra de LEDs conectada al puerto de salida un LED encendido rota a la izquierda durante 0.5 s en cada posición empezando por la línea RB0. El número de posiciones a desplazar lo fija el valor de las tres primeras líneas del Puerto A entrada.
Así por ejemplo, si (PORTA)=b'---00011' (3 decimal), la secuencia de salida sería:
00000000, 00000001, 00000010, 00000100, 00000000, 00000001, 00000010,... ( y repite)

Ejercicio 19

Por la barra de diodos LEDs conectada al puerto de salida se visualizará un juegos de luces que al lector le resulte divertido. Hay que utilizar una tabla de datos.

Ejercicio 20

Si la línea RA0 del Puerto A es "0", por el display se visualiza un contador descendente (9, 8, 7, 6, 5, 4, 3, 2, 1, 0, 9, ..) con una cadencia de 0,5 segundos.
Si la línea RA0 del Puerto A es "1", por el display se visualizará un contador ascendente (0, 1, 2, 3, 5, 6, 7, 8, 9, 0, 1, 2, ..) con una cadencia de 0,5 s.

Ejercicios resueltos.

Ejercicios realizados en assembler.

1)

 ;Ejercicio 1                

                LIST P=PIC16F84A ; Procesador utilizado.
                INCLUDE <P16F84A.INC> ; Definición de algunos operandos utilizados.
                Constante EQU d'74' ; En sistema decimal se pone así.
                 __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;========================================================================
     
                ORG 0x000 ; El programa comienza en la dirección 0.
                goto Inicio
                ORG 0x004
                retfie
;========================================================================
Inicio
                bsf STATUS,RP0 ;Acceso al Banco 1.
                clrf TRISB ; Las líneas del Puerto B se configuran como salida.
                movlw b'00011111' ; Las 5 líneas del Puerto A se configuran como entradas.
                movwf TRISA
                bcf STATUS,RP0 ; Acceso al Banco 0.
Loop
                movf PORTA,W ; Carga los datos del puerto A en (W).
                addlw Constante ; (W)=(PORTA)+Constante.
                movwf PORTB ; El contenido de W se carga en el puerto B.
                goto Loop
;========================================================================            
  END ; Fin del programa.
;========================================================================

2)


;Ejercicio 2
;========================================================================
 
 
                         LIST P=PIC16F84A ; Procesador utilizado.
                         INCLUDE <P16F84A.INC>
                         __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
                        constante EQU .74
;========================================================================                       ORG 0x000 ; El programa comienza en la dirección 0.
                      goto Inicio
                      ORG 0x004
                       retfie

Inicio
                       bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
                       clrf TRISB ;Puerto B como salida
                       movlw b'00011111'
                       movwf TRISA ; puerto A como entrada
                       bcf STATUS,RP0 ; Acceso al Banco 0.

Loop
                       movf PORTA,W ; Carga los datos del Puerto A en (W).
                       addlw constante ; (W)=(PORTA)+(constante)
                       movwf PORTB ; El contenido de W se carga en el Puerto B.
                       goto Loop
;========================================================================
                       END ; Fin del programa.
;========================================================================

3)


;Ejercicio 3
;========================================================================
                      LIST P=PIC16F84A ; Procesador utilizado.
                      INCLUDE <P16F84A.INC>
                      __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;========================================================================
                       ORG 0x000 ; El programa comienza en la dirección 0.
                       goto Inicio
                       ORG 0x004
                       retfie

Inicio
                       bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
                       clrf TRISB ;Puerto B como salida
                       movlw b'00011111'
                       movwf TRISA ; puerto A como entrada
                       bcf STATUS,RP0 ; Acceso al Banco 0.

Loop
                       movf PORTA,W ; Carga los datos del Puerto A en (W).
                       addwf PORTA,W ; (W)=(PORTA)+(PORTA)=2(PORTA).
                       movwf PORTB ; El contenido de W se carga en el Puerto B.
                       goto Loop
;========================================================================
                      END ; Fin del programa.
;========================================================================

4)


;Ejercicio 4
;========================================================================
                    P=16F84A ; Procesador utilizado.
                    INCLUDE <P16F84A.INC> ; Definición de algunos operandos utilizados.
                    __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSCLIST
                    Mascara EQU b'01010101' ; Máscara de bits pares siempre a "1".

;========================================================================                      ORG 0x000
                     goto Inicio
                     ORG 0X004
                     retfie
;========================================================================
Inicio
                    bsf STATUS,RP0 ; Pone a 1 el bit 5 del STATUS. Acceso al Banco 1.
                    clrf TRISB ; Las líneas del Puerto B se configuran como salidas.
                    movlw b'00011111'
                    movwf TRISA ; Las líneas del Puerto A se configuran como entradas.
                    bcf STATUS,RP0 ; Pone a 0 el bit 5 de STATUS. Acceso al Banco 0.

Loop
                    movf PORTA,W ; Carga el registro de datos del Puerto A en W
                    iorlw Mascara ; Pone a "1" los bits pares.
                    movwf PORTB ; El contenido de W se deposita en el Puerto B.
                    goto Loop ; Crea un bucle cerrado e infinito.
;========================================================================                        
                    END
;========================================================================

5)


;Ejercicio 5
;=======================================================================
                   LIST P=PIC16F84A ; Procesador utilizado.
                   INCLUDE <P16F84A.INC>
                   __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
                   Mascara EQU b'01010101'

;========================================================================                    ORG 0X000
                   goto Inicio
                   ORG 0x004
                   retfie
;========================================================================
Inicio  
                   bsf STATUS,RP0
                   clrf TRISB
                   movlw b'00011111'
                   movwf TRISA
                   bcf STATUS,RP0
Loop
                  movf PORTA,W
                  andlw Mascara
                  movwf PORTB
                  goto Loop
;========================================================================
                  END ; Fin del programa.
;========================================================================

6)


;Ejercicio 6
                   LIST P=PIC16F84A
                   INCLUDE <P16F84A.INC>
                   __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
                  ERRORLEVEL -302
;========================================================================
                  Mascara EQU b'01010101'
;========================================================================
                  ORG 0x000
                  goto Inicio
                  ORG 0X004
                  retfie
;========================================================================
Inicio
                  bsf STATUS,RP0
                  clrf TRISB
                  movlw b'00011111'
                  movwf TRISA
                  bcf STATUS,RP0

Loop
                  movf PORTA,W ; Carga el registro de datos del Puerto A en W
                  xorlw Mascara ; Pone a "0" los bits pares.
                  movwf PORTB ; El contenido de W se deposita en la salida.
                  goto Loop ; Se crea un bucle cerrado e infinito.
;========================================================================
                  END ; Fin del programa.
;========================================================================

7)


;Ejercicio 7

 
                  LIST P=PIC16F84A ; Procesador utilizado.
                  INCLUDE <P16F84A.INC> ; Definición de algunos operandos utilizados.
                  __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC

;========================================================================
                 ORG 0X000
                 goto Inicio
                 ORG 0x004
                 retfie
Inicio
                bsf STATUS,RP0 ; Acceso al Banco 1.
                clrf TRISB ; Las líneas del Puerto B se configuran como salida.
                movlw b'00011111' ; Las 5 líneas del Puerto A se configuran como entrada.
                movwf TRISA
                bcf STATUS,RP0 ; Acceso al Banco 0.

Loop
                comf PORTA,W ; Invierte el contenido del Puerto A y el resultado lo
                movwf PORTB ; lleva a la salida para que se visualice.
                goto Principal ; Crea un bucle cerrado e infinito.
;========================================================================
                END ; Fin del programa.
;========================================================================

8)


;Ejercicio 8

                 __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
                 LIST P=PIC16F84A ; Procesador utilizado.
                 INCLUDE <P16F84A.INC> ; Definición de algunos operandos utilizados.

;========================================================================
                ORG 0X000
                goto Inicio
                ORG 0X004
                retfie

Inicio
               bsf STATUS,RP0 ; Acceso al Banco 1.
               clrf TRISB ; Las líneas del Puerto B se configuran como salida.
               movlw b'00011111' ; Las 5 líneas del Puerto A se configuran como entrada.
               movwf TRISAbcf STATUS,RP0 ; Acceso al Banco 0.

Loop
              swapf PORTA,W ; Intercambia nibbles del Puerto A y el resultado lo
              movwf PORTB ; lleva al Puerto B para que se visualice.
              goto Principal ; Crea un bucle cerrado e infinito.
;========================================================================
              END ; Fin del programa.
;========================================================================

9)


;Ejercicio 9
              LIST P=PIC16F84A
              INCLUDE <P16F84A.INC>
              __CONFIG_XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
;========================================================================
             ORG 0X000
             goto Inicio
             ORG 0x004
             retfie
;========================================================================
Inicio
             bsf STATUS,RP0
             clrf TRISA
             movlw b'00011111'
             movwf TRISA
             bcf STATUS,RP0
;========================================================================
Loop
              bsf STATUS,C
              movf PORTA,W
              rlf W,W
              movwf PORTB
              goto Loop
;========================================================================
              END
;========================================================================

10)


;Ejercicio 10
             LIST P=PIC16F84A
             INCLUDE <P16F84A.INC>
             __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
;========================================================================
             ORG 0x000
             goto Inicio
             ORG 0x004
             retfie
;========================================================================
Inicio
             bsf STATUS,RP0
             clrf TRISA
             movlw b'00011111'
             movf TRISA
             bcf STATUS,RP0
;========================================================================
Loop
             bcf STATUS,C
             movf PORTA,W
             rrf W,W
             movwf PORTB
             goto Loop
;========================================================================
             END
;========================================================================

11)

                LIST P=PIC16F84A ; Procesador utilizado.
                INCLUDE <P16F84A.INC>
   __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;========================================================================
   
               ORG        0x000 ; El programa comienza en la dirección 0.
                goto         Inicio
                ORG        0x004
                retfie
;========================================================================
Inicio
                bsf          STATUS,RP0 ;Acceso al Banco 1.
                clrf          TRISB ; Las líneas del Puerto B se configuran como salida.
                movlw      b'11111' ; Las 5 líneas del Puerto A se configuran como entradas.
                movwf     TRISA
                bcf           STATUS,RP0 ; Acceso al Banco 0.
                movf        PORTA,W ; Carga los datos del puerto A en W.
                movwf      PORTB ; El contenido de W se carga en el puerto B.
                sleep  ;pone al sistema en modo bajo conumo
;========================================================================          
  END ; Fin del programa.
;========================================================================



12)


   LIST P=PIC16F84A ; Procesador utilizado.
         INCLUDE <P16F84A.INC> ; Definición de algunos operandos utilizados.
  __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
 Número EQU d'13'
;========================================================================
   
  ORG 0x000 ; El programa comienza en la dirección 0.
  goto Inicio
  ORG 0x004
  retfie
;========================================================================
Inicio
  bsf         STATUS,RP0 ;Acceso al Banco 1.
               clrf     TRISB ; Las líneas del Puerto B se configuran como salida.
               movlw b'00011111'
        movwf TRISA ; Las 5 líneas del Puerto A se configuran como entradas
   bcf          STATUS,RP0 ; Acceso al Banco 0.
Loop
    movlw Número
      subwf PORTA,W
  movlw b'11110000
  btfss         STATUS,C
  goto         Es_menor
  movlw b'11111111'
  btfsc         STATUS,Z
  goto         Es_mayor
  movlw .13
  btfsc         STATUS,C
  goto          Es_igual

Es_menor
  movlw b'01010101'
  movwf PORTB
  goto         Loop
Es_mayor
  movlw b'10101010'
  movwf PORTB
  goto         Loop
Es_igual
  movlw b'11111111'
  movwf PORTB
  goto         Loop              
;========================================================================        
  END ; Fin del programa.
;========================================================================


13)


;===============================Ejercicio3==================================
;========================================================================
  LIST P=PIC16F84A
  INCLUDE <P16F84A.inc>
  __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
  Número EQU .124
;========================================================================
  CBLOCk 0x0C
  centenas
  decenas  
  unidades
  ENDC
;========================================================================
  ORG 0x000
  goto Inicio
  ORG 0x004
  retfie
;========================================================================
Inicio
  bsf STATUS,RP0
  clrf TRISB
  movlw b'11111'
  movwf TRISA
  bcf STATUS,RP0

Loop
  clrf cetenas
  clrf decenas
  movlw Número
  movwf unidades

BCD_Resta10
  movlw .10
  subwf unidades,W
  btfss STAUS,C
  goto BIN_BCD_FIN

BCD_IncrementaDecenas
  movwf unidades
  incf decenas,F
  movlw .10
  subwf decenas,W
  btfss STATUS,C
  goto BCD_Resta10

BCD_IncrementaCentenas
  clrf decenas
  incf centenas,F
  goto BCD_Resta10
BIN_BCD_FIN
  swapf decenas,W
  addwf unidades,W
  movwf PORTB
  goto Loop
;========================================================================
  END
;========================================================================


;Ejercicio 14



;Ejercicio 15

16)

;==========================Ejercicio 16=================================
  LIST P=PIC16F84A
  INCLUDE <P16F84A.inc>
  __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
;====================================================================
  ORG  0X000
  goto Inicio
  ORG  0X004
  retfie
  CBLOCK
  d1
  d2
  d3
  ENDC
;====================================================================
Inicio
  bsf STATUS,RP0
  clrf TRISB
  movlw 0xFF
  movwf TRISA
  bcf STATUS,RP0
;====================================================================
Loop
  movlw b'01010101'
  movwf PORTB
  call Retardo_500ms ;retardo de 0,5 seg.
  movlw b'10101010'
  movwf PORTB
  call Retardo_500ms
  goto Loop



Retardo_500ms
   ;499994 cycles
 movlw 0x03
 movwf d1
 movlw 0x18
 movwf d2
 movlw 0x02
 movwf d3
 decfsz d1, f
 goto $+2
 decfsz d2, f
 goto $+2
 decfsz d3, f
 goto Retardo_500ms

   ;6 cycles
 goto $+1
 goto $+1
 goto $+1
;====================================================================
  END
;====================================================================


17)

                LIST  P=PIC16F84A
  INCLUDE <P16F84A.inc>
  __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
;==========================================================
;Variables
  CBLOCK
  Número
  d1
  d2
  ENDC
;==========================================================
  ORG  0x000
  goto Inicio
  ORG  0x004
  retfie
;==========================================================
Inicio
  bsf  STATUS,RP0
  clrf TRISB
  movlw 0xFF
  movwf TRISA
  bcf  STATUS,RP0
;==========================================================
Loop

  rlf Número,F
  movf Número,W
  movwf PORTB
  call Retardo_0.3s
  goto Loop

Retardo_0.3s
   ;299993 cycles
  movlw 0x5E
  movwf d1
  movlw 0xEB
  movwf d2
Retardo_0.3s_0
  decfsz d1, f
  goto $+2
  decfsz d2, f
  goto Retardo_0.3s_0

   ;3 cycles
  goto $+1
  nop

   ;4 cycles (including call)
  return
;==========================================================
  END
;==========================================================


;Ejercicio 18




19)

;======================Ejercicio19=========================
  LIST P=PIC16F84A
  INCLUDE <P16F84A.inc>
  __CONFIG _XT_OSC & _WDT_OFF & _PWRTE_ON & _CP_OFF
;==========================================================
    ORG  0x000
    goto  Inicio
   ORG   0x004
    retfie
;==========================================================
Inicio
    bsf   STATUS,RP0
    clrf  TRISB
    movlw  0xFF
   movwf  TRISA
    bcf   STATUS,RP0
;==========================================================
Loop
   movlw .0
    call  Tabla
    movwf  PORTB
  movlw .1
    call  Tabla
    movwf  PORTB
  movlw .2
    call  Tabla
    movwf  PORTB
  movlw .3
    call  Tabla
    movwf  PORTB
    goto  Loop

Tabla
    addwf  PCL,F
    retlw  b'01010101'
    retlw  b'10101010'
    retlw  b'01110000'
    retlw  b'11111111'
;==========================================================
    END
;==========================================================



20)

  LIST P=PIC16F84A
  INCLUDE <P16F84A.INC>
  __CONFIG _CP_OFF & _WDT_OFF & _PWRTE_ON & _XT_OSC
;====================================================================
;Equivalencias
  #DEFINE  Cero movlw .0
  #DEFINE  Uno  movlw .1
  #DEFINE  Dos  movlw .2
  #DEFINE  Tres movlw .3
  #DEFINE  Cuatro movlw .4
  #DEFINE  Cinco movlw .5
  #DEFINE  Seis movlw .6
  #DEFINE  Siete movlw .7
  #DEFINE  Ocho movlw .8
  #DEFINE  Nueve movlw .9
;Variables
  CBLOCK
  d1
  d2
  d3
  ENDC
;====================================================================      
  ORG  0x000 ; El programa comienza en la dirección 0.
  goto Inicio
  ORG  0x004
  retfie

;====================================================================
Inicio
  bsf  STATUS,RP0 ;Acceso al Banco 1.
  clrf  TRISB ; Las líneas del Puerto B se configuran como salida.
  movlw  b'11111' ; Las 5 líneas del Puerto A se configuran como entradas.
  movwf  TRISA
  bcf  STATUS,RP0 ; Acceso al Banco 0.
Loop

  btfsc PORTA,0
  goto Contador_Ascendente
  goto Contador_Descendente

Contador_Ascendente
  call Retardo_0.5s
  Cero
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Uno
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Dos
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Tres
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Cuatro
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Cinco
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Seis
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Siete
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Ocho
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Nueve
  call Tabla
  movwf PORTB
  call Retardo_0.5s

Contador_Descendente
  call Retardo_0.5s
  Nueve
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Ocho
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Siete
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Seis
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Cinco
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Cuatro
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Tres
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Dos
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Uno
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  Cero
  call Tabla
  movwf PORTB
  call Retardo_0.5s
  goto Loop
;====================================================================

Retardo_0.5s
   ;999990 cycles
  movlw 0x07
  movwf d1
  movlw 0x2F
  movwf d2
  movlw 0x03
  movwf d3
Retardo_0.3s_0
  decfsz d1, f
  goto $+2
  decfsz d2, f
  goto $+2
  decfsz d3, f
  goto Retardo_0.3s_0

   ;6 cycles
  goto $+1
  goto $+1
  goto $+1

   ;4 cycles (including call)
  return
Tabla
  addwf PCL,F
  retlw b'00111111'
  retlw b'00000110'
  retlw b'01001011'
  retlw b'01001111'
  retlw b'01100110'
  retlw b'00111101'
  retlw b'01111101'
  retlw b'00000111'
  retlw b'01111111'
  retlw b'01101111'
;====================================================================
  END
;====================================================================

Ejercicios realizados en CCS.
Ejercicio 1.


#include "ejecicio_1.h"


void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_wdt(WDT_18MS);

while(TRUE)
   {
   output_b(input_a());
   }
}


Archivo header.


#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)

Ejercicio 2.


#include "ejercicio_2.h"


void main()
{
      setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_wdt(WDT_18MS);
 

       while(TRUE)
      {
         output_b(input_a()+2); //en el puerto B se ve puerto A+2
      }
}





Archivo header.


#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)


Ejercicio 3.

#include "ejercicio_3.h"

void main()
{
      setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   
while(TRUE)
{
      output_b(input_a()*2);
      }
}


Archivo header.


#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)


Ejercicio 4.

#include "ejercicio_4.h"

void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_wdt(WDT_18MS);
 
 
while(TRUE)
{
   output_b(input_a()|0b01010101);
   }
}


Archivo header.


#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)

Ejercicio 5.


#include "ejercicio_5.h"

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_wdt(WDT_18MS);
   while(TRUE)
   {
   output_b(input_a()|0b01010101);
   }
}



Archivo header.

#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)

Ejercicio 6.



#include "ejercicio_6.h"


void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_wdt(WDT_18MS);

   while(TRUE)
   {
   output_b(input_a()^0b01010101);
   }
}



Archivo header.

#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)


Ejercicio 7.


#include "ejercicio_7.h"

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_wdt(WDT_18MS);
   while(TRUE)
   {
  output_b(!input_a());
   }
}



Archivo header.

#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)


Ejercicio 8.





#include "ejercicio_8.h"

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);setup_wdt(WDT_18MS);
   while(TRUE)
   {
   output_b(swap(input_a()));
   }
}


Archivo header.

#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)


Ejercicio 9.


#include "ejercicio_9.h"

void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   int8 numero;
   while(TRUE)
   {
   numero=input_a();
   rotate_left(&numero,1);
   output_b(numero|0x01);
   }
}



Archivo header.



#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)



Ejercicio 10.


#include "ejercicio_10.h"

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   int8 numero;
   while(TRUE)
   {
   numero=input_a();
   rotate_right(&numero,1);
   output_b(numero|0x01);
   }
}



Archivo header.



#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)






Ejercicio 11.



#include "C:\Documents and Settings\Administrador\Mis documentos\Laboratorio\aprender\ejercicio_11\ejercicio_11.h"


void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   output_b(input_a());
   sleep();
}



Archivo header.



#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)


Ejercicio 12.



#include "ejercicio_12.h"

int8 numero;

void main()
{
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   while(TRUE)
   {
      numero=0b00001111;

      if(input_a()==numero)
      {
         output_b(11111111);
      }

      if(input_a()>numero)
      {
         output_b(01010101);
      }

      if(input_a()<numero)
      {
         output_b(11110000);
      }

   }
}





Archivo header.

#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)

Ejercicio 13.


#include "ejercicio_13.h"

int8 numero;
int8 centenas;
int8 decenas;
int8 unidades;

void main(){
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   numero==124;

   while(TRUE){
        if(unidades==124){
           (unidades--10);
           (decenas++);
        }
        if(unidades==114){
           (unidades--10);
           (decenas++);
        }
        if(unidades==104){
           (unidades--10);
           (decenas++);
        }
        if(unidades==94){
           (unidades--10);
           (decenas++);
        }
        if(unidades==84){
          (unidades--10);
           (decenas++);
        }
         if(unidades==74){
           (unidades--10);
           (decenas++);
        }
         if(unidades==64){
           (unidades--10);
           (decenas++);
        }
         if(unidades==54){
           (unidades--10);
           (decenas++);
        }
         if(unidades==44){
           (unidades--10);
           (decenas++);
        }
         if(unidades==34){
           (unidades--10);
           (decenas++);
        }
         if(unidades==24){
           (unidades--10);
           (decenas==0)&(centenas++);
        }
         if(unidades==14){
           (decenas++);
        }
         if(unidades==4){
            (output_b(numero));
   }
   }
}




Archivo header.

#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)


Ejercicio 14.



#include "ejercicio_14.h"

BYTE CONST TABLE[8]={0b01100001,0b01100010,0b00010000,0b00100100,0b00010000,0b00010000,0b00010000,0b00001000};
void main(){

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

   while(TRUE){
         input_a();
         output_b(TABLE[input_a()]);
           
   }    
   }




Archivo header.

#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)


Ejercicio 16.

#include "ejercicio_16.h"


void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   while(TRUE){
         output_b(0b01010101);
         delay_ms(500);
         output_b(0b10101010);
         delay_ms(500);
   }
}




Archivo header.

#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)

Ejercicio 17.

#include "ejercicio_17.h"




void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);
   while(TRUE){
         output_b(0b00000001);
         delay_ms(300);
         output_b(0b00000010);
         delay_ms(300);
         output_b(0b00000100);
         delay_ms(300);
         output_b(0b00001000);
         delay_ms(300);
         output_b(0b00010000);
         delay_ms(300);
         output_b(0b00100000);
         delay_ms(300);
         output_b(0b01000000);
         delay_ms(300);
         output_b(0b10000000);
         delay_ms(300);
   }
}




Archivo header.

#include <16F84A.h>

#FUSES WDT                      //Watch Dog Timer
#FUSES XT                       //Crystal osc <= 4mhz for PCM/PCH , 3mhz to 10 mhz for PCD
#FUSES PUT                      //Power Up Timer
#FUSES NOPROTECT                //Code not protected from reading

#use delay(clock=4000000)

No hay comentarios:

Publicar un comentario