TRADUCTOR

martes, 14 de mayo de 2013

Ejercicios de programación

  En el laboratorio se propusieron ejercicios de programación para realizar en el MPLAB en lenguaje Assembler, con el fin de practicar dicho lenguaje y afianzar los conocimientos adquiridos.
  A continuación, se presentarán los enunciados de los ejercicios con su correspondiente resolución:

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



;Actividad 5 ejercicio 1
;================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;================================================================
; Defino las variables
;================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf   STATUS,RP0
;================================================================
ORG 0x000
goto     Main
ORG      0X004
retfie

Main
bank1
clrf      TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf        PORTA,W ;muevo el PORTA al work
movwf PORTB       ;muevo el work al file(PORTB)
goto        Loop
;================================================================
END




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


;Actividad 5 Ejercicio 2 
;================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;================================================================
; Defino las variables
;================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf  STATUS,RP0
  k EQU .74
;================================================================
ORG 0x000
goto     Main
ORG      0X004
retfie

Main
bank1
clrf       TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf       PORTA,W      ;mueve el valor del PORTA a W
addlw k ;suma el literal(K) al work(porta)
movwf PORTB         ;se pasa el work al PORTB
goto Loop
;================================================================
END


Ejercicio 3
Por el Puerto B se obtiene el dato del Puerto A multiplicado por 2.
Es decir: (PORTB)=2(PORTA)=(PORTA)+(PORT A).
;Actividad 5 Ejercicio 3
;================================================================
LIST p=PIC16F84A
INCLUDE <p16F84a.inc>
__CONFIG _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
ERRORLEVEL -302
;================================================================
; Defino las variables
;================================================================
#DEFINE bank0 bcf STATUS,RP0
#DEFINE bank1 bsf  STATUS,RP0
  k EQU .74
;================================================================
ORG  0x000
goto     Main
ORG      0X004
retfie

Main
bank1
clrf       TRISB
movlw 0x1F
movwf TRISA
bank0
Loop
movf PORTA,W   
addwf PORTA,W
movwf PORTB       
goto Loop
;=======================================================================

END

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').
;Actividad 5 ejercicio 4
;=======================================================================
 LIST      p=PIC16F84A
 INCLUDE   <p16F84a.inc>
 __CONFIG  _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
 ERRORLEVEL  -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0  bcf STATUS,RP0
#DEFINE bank1  bSf STATUS,RP0

;=======================================================================
 ORG  0x000
 goto Main
 ORG  0X004
 retfie

Main
 bank1
 clrf TRISB
 movlw 0x1F
 movwf TRISA
 bank0
Loop
 movf PORTA,W  ;muevo el PORTA al work
 iorlw b'01010101' ;hago una or entre el literal(valor en binario)y    ; el work (PORTA)
 movwf PORTB  ;muevo el work al file(PORTB)
 goto Loop
;=======================================================================
 END



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').
;Actividad 5 ejercicio 5
 LIST   p=PIC16F84A
 INCLUDE   <p16F84a.inc>
 __CONFIG  _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
 ERRORLEVEL  -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0  bcf STATUS,RP0
#DEFINE bank1  bSf STATUS,RP0

;=======================================================================
 ORG  0x000
 goto Main
 ORG  0X004
 retfie

Main
 bank1
 clrf TRISB
 movlw 0x1F
 movwf TRISA
 bank0
Loop
 movf PORTA,W  ;muevo el PORTA al work
 andlw b'10101010' ;hago una and entre el literal(valor en binario)y el

;work (PORTA)
 movwf PORTB  ;muevo el work al file(PORTB)
 goto Loop
;=======================================================================
 END



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'
;Actividad 5 ejercicio 6
;=======================================================================
 LIST   p=PIC16F84A
 INCLUDE   <p16F84a.inc>
 __CONFIG  _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
 ERRORLEVEL  -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0  bcf STATUS,RP0
#DEFINE bank1  bSf STATUS,RP0

;=======================================================================
 ORG  0x000
 goto Main
 ORG  0X004
 retfie

Main
 bank1
 clrf TRISB
 movlw 0x1F
 movwf TRISA
 bank0
Loop
 movf PORTA,W  ;muevo el PORTA al work
 xorlw b'01010101' ;hago una xor entre el literal(valor en binario) y

;el work (PORTA)
 movwf PORTB  ;muevo el work al file(PORTB)
 goto  Loop
;=======================================================================
 END



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).
;Actividad 5 ejercicio 7
;=======================================================================
 LIST     p=PIC16F84A
 INCLUDE   <p16F84a.inc>
 __CONFIG  _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
 ERRORLEVEL  -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0  bcf STATUS,RP0
#DEFINE bank1  bSf STATUS,RP0

;=======================================================================
 ORG  0x000
 goto Main
 ORG  0X004
 retfie

Main
 bank1
 clrf TRISB
 movlw 0x1F
 movwf TRISA
 bank0
Loop
 comf PORTA,W  ;complemento el PORTA y lO guardo en el work
 movwf PORTB  ;muevo el work al file(PORTB)
 goto Loop
;=======================================================================
 END

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".
;Actividad 5 ejercicio 8
;=======================================================================
 LIST      p=PIC16F84A
 INCLUDE   <p16F84a.inc>
 __CONFIG  _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
 ERRORLEVEL  -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0  bcf STATUS,RP0
#DEFINE bank1  bSf STATUS,RP0

;=======================================================================
 ORG  0x000
 goto Main
 ORG  0X004
 retfie

Main
 bank1
 clrf TRISB
 movlw 0x1F
 movwf TRISA
 bank0
Loop
 swapf PORTA,W
 movwf PORTB
 goto Loop

;=======================================================================
 END

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).
;Actividad 5 ejercicio 9
;=======================================================================
 LIST      p=PIC16F84A
 INCLUDE   <p16F84a.inc>
 __CONFIG  _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
 ERRORLEVEL  -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0  bcf STATUS,RP0
#DEFINE bank1  bSf STATUS,RP0

;=======================================================================
 ORG  0x000
 goto Main
 ORG  0X004
 retfie

Main
 bank1
 clrf TRISB
 movlw 0x1F
 movwf TRISA
 bank0
Loop
 rlf  PORTA,W
 bsf  PORTB,RB0
 movwf PORTB
 goto Loop

;=======================================================================
 END

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".
;Actividad 5 ejercicio 10
;=======================================================================
 LIST   p=PIC16F84A
 INCLUDE   <p16F84a.inc>
 __CONFIG  _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
 ERRORLEVEL  -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0  bcf STATUS,RP0
#DEFINE bank1  bSf STATUS,RP0

;=======================================================================
 ORG  0x000
 goto Main
 ORG  0X004
 retfie

Main
 bank1
 clrf TRISB
 movlw 0x1F
 movwf TRISA
 bank0
Loop
 rrf  PORTA,W
 movwf PORTB
 bcf  PORTB,RB7
 goto Loop

;=======================================================================
 END

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.
 ;Actividad 5 ejercicio 11
;=======================================================================
 LIST      p=PIC16F84A
 INCLUDE   <p16F84a.inc>
 __CONFIG  _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
 ERRORLEVEL  -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0  bcf STATUS,RP0
#DEFINE bank1  bSf STATUS,RP0

;=======================================================================
 ORG  0x000
 goto Main
 ORG  0X004
 retfie

Main
 bank1
 clrf TRISB
 movlw 0x1F
 movwf TRISA
 bank0
Loop
 movf PORTA,W
 movwf PORTB
 Sleep
 goto Loop
 ;=======================================================================
 END

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.
Actividad 5 Ejercicio 12
;=======================================================================
 LIST   p=PIC16F84A
 INCLUDE   <p16F84a.inc>
 __CONFIG  _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
 ERRORLEVEL  -302
;=======================================================================
; Defino las variables
;=======================================================================
#DEFINE bank0  bcf STATUS,RP0
#DEFINE bank1  bSf STATUS,RP0
Numero EQU   .4
;=======================================================================
 ORG  0x000
 goto Main
 ORG  0X004
 retfie

Main
 bank1
 clrf TRISB
 movlw 0x1F
 movwf TRISA
 bank0

Inicio
 movlw  Numero
 subwf  PORTA,W
 btfss  STATUS,Z
 goto  NoEsCero
 goto        EsCero


EsCero
 movlw  b'11111111'
 movwf  PORTB
 goto  Inicio
NoEsCero
 btfss  STATUS,C
 goto  NoEsUno
 goto        EsUno
EsUno
 movlw  b'01010101'
 movwf  PORTB
 goto  Inicio
NoEsUno
 movlw  b'11110000'
 movwf  PORTB
 goto  Inicio
 END

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

;Actividad 5 Ejercicio 13 
;===============================================================================
  LIST          p=PIC16F84A
  INCLUDE   <p16f84a.inc>
  __CONFIG  _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
  ERRORLEVEL  -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE  bank0  bcf STATUS,RP0
#DEFINE  bank1  bsf STATUS,RP0

  cblock     0x0c
  Numero
  Centenas
  Decenas
  Unidades
  endc
;===============================================================================
  ORG       0x000
  bank1
  movlw     0xFF
  movwf    TRISA
  clrf         TRISB
  bank0
inicio
  movlw   .73         ;Numero elegido entre 0 - 255
  movwf   Numero
  clrf       Centenas
  clrf       Decenas
  clrf       Unidades
again
  movf      Numero,w
  movwf    Unidades
  movlw    .10
  subwf     Numero,f
  movf      Numero,w
  btfss      STATUS,0
  goto      carry0
  incf       Decenas,f
  movlw  .10
  subwf   Decenas,w
  btfss    STATUS,2
  goto    again
  clrf     Decenas
  incf    Centenas,f
  goto   again

carry0
  rlf  Decenas,f
  rlf  Decenas,f
  rlf  Decenas,f
  rlf  Decenas,w
  addwf  Unidades,w
  movwf  PORTB
  goto  inicio

  END




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

;===============================================================================
;Actividad 5 Ejercicio 14
;===============================================================================
  LIST   p=PIC16F84A
  INCLUDE   <p16f84a.inc>
  __CONFIG  _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
  ERRORLEVEL  -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
 #DEFINE  bank0  bcf STATUS,RP0
 #DEFINE  bank1  bsf STATUS,RP0
;===============================================================================
  ORG 0x000
  bank1
  movlw  0x1F
  movwf  TRISA
  clrf  TRISB
  bank0
inicio 
  movf  PORTA,w
  andlw  b'00000111'

  addwf  PCL,F
   goto  vacio 
  goto  llenandose
  goto  alarma
  goto  lleno
  goto  alarma
  goto  alarma
  goto  alarma
  goto  rebose

vacio
  movlw    b'01100001'   ;Estado "Vacio"
  movwf  PORTB
  goto  inicio      
llenandose
    movlw  b'01100010'      ;Estado "Llenandose"
  movwf  PORTB
  goto  inicio
alarma
   movlw  b'00010000'         ;Estado "Alarma"
  movwf  PORTB
  goto  inicio
lleno
    movlw  b'00100100'      ;Estado "Lleno"
  movwf  PORTB
  goto  inicio
rebose
  movlw  b'00001000'      ;Estado "Rebose"
  movwf  PORTB
  goto  inicio
  END
  


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.
;===============================================================================
;Actividad 5 Ejercicio 15  
;===============================================================================
  LIST   p=PIC16F84A
  INCLUDE   <p16f84a.inc>
  __CONFIG  _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
  ERRORLEVEL  -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE  bank0  bcf STATUS,RP0
#DEFINE  bank1  bsf STATUS,RP0
;===============================================================================
  ORG 0x000
  bank1
  movlw  0x1F
  movwf  TRISA
  clrf  TRISB
  bank0
  clrf  PORTB
inicio
  movf  PORTA,w
  sublw  .25
  btfss  STATUS,C
  goto  $-4
  movf  PORTA,w
  call  tabla
  movwf  PORTB
  goto  inicio

tabla
  addwf  PCL,f
  retlw  0x77
  retlw  0x7c
  retlw  0x39
  retlw  0x5e
  retlw  0x79
  retlw  0x71
  retlw  0x6f
  retlw  0x76
  retlw  0x19
  retlw  0x1e
  retlw  0x7a
  retlw  0x38
  retlw  0x37
  retlw  0x54
  retlw  0x3f
  retlw  0x73
  retlw  0x67
  retlw  0x50
  retlw  0x60
  retlw  0x78
  retlw  0x1c
  retlw  0x3e
  retlw  0x1d
  retlw  0x70
  retlw  0x6e
  retlw  0x49
  END


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.
;Actividad 5 Ejercicio 16
;===============================================================================
  LIST   p=PIC16F84A
  INCLUDE   <p16f84a.inc>
  __CONFIG  _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
  ERRORLEVEL  -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE  bank0  bcf STATUS,RP0
#DEFINE  bank1  bsf STATUS,RP0
  cblock  0x0c
  contador
  multiplicador
  endc
;===============================================================================
  ORG 0x000
  bank1
  movlw  0x1F
  movwf  TRISA
  clrf  TRISB
  bank0
  movlw  b'01010101'
  movwf  PORTB
loop
  call  delay500ms
  comf  PORTB
  call  delay500ms
  comf  PORTB
  goto  loop

;===============================================================================
delay500ms
  movlw  b'11000101'
  movwf  OPTION_REG
  clrf  multiplicador
iniTMR0 
  movlw  .61           ;499200 ciclos = (256-61).4.64.10
  movwf  TMR0      ;TMR0.instr.pre.multi
incTMR0
  incf  TMR0,f
  btfss  INTCON,T0IF
  goto  incTMR0
  bcf   INTCON,T0IF
  incf  multiplicador,f
  movf  multiplicador,w
  sublw  .10
  btfss  STATUS,2
  goto  iniTMR0
  return
  END

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.
===========================================================================
;Actividad 5 Ejercicio 17
;===============================================================================
  LIST   p=PIC16F84A
  INCLUDE   <p16f84a.inc>
  __CONFIG  _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
  ERRORLEVEL  -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE  bank0  bcf STATUS,RP0
#DEFINE  bank1  bsf STATUS,RP0
  cblock  0x0c
  cont1
  cont2
  endc
;===============================================================================
  ORG 0x000
  bank1
  movlw  0x1F
  movwf  TRISA
  clrf  TRISB
  bank0
inicio
  clrf  PORTB
  call  delay300ms
  bsf   PORTB,0
repeat
  call  delay300ms



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)
;===============================================================================
;Actividad 5 Ejercicio 18
;===============================================================================
  LIST   p=PIC16F84A
  INCLUDE   <p16f84a.inc>
  __CONFIG  _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
  ERRORLEVEL  -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE  bank0  bcf STATUS,RP0
#DEFINE  bank1  bsf STATUS,RP0
  cblock  0x0c
  limite
  multiplicador
  endc
;===============================================================================
  ORG 0x000
  bank1
  movlw  0x1F
  movwf  TRISA
  clrf  TRISB
  bank0

  clrf  PORTB
  movf  PORTA,w
  andlw  b'00000111'
  call  tabla
  movwf  limite
inicio
  call  delay500ms
  bsf   PORTB,0
repeat
  call   delay500ms
  rlf   PORTB,f
  movf  PORTB,w
  subwf  limite,w
  btfss  STATUS,2
  goto  repeat
  clrf  PORTB



;================================================================================
tabla
  addwf  PCL,f
  retlw  b'00000001'
  retlw  b'00000010'
  retlw  b'00000100'
  retlw  b'00001000'
  retlw  b'00010000'
  retlw  b'00100000'
  retlw  b'01000000'
  retlw  b'10000000'

;================================================================================
delay500ms
  movlw  b'11000101'
  movwf  OPTION_REG
  clrf  multiplicador
iniTMR0
  movlw  .61       ;499200 ciclos = (256-61).4.64.10
  movwf  TMR0      ;                TMR0.instr.pre.multi
incTMR0
  incf  TMR0,f
  btfss  INTCON,T0IF
  goto  incTMR0
  bcf   INTCON,T0IF
  incf  multiplicador,f
  movf  multiplicador,w
  sublw  .10
  btfss  STATUS,2
  goto  iniTMR0
  return
  

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.
;Actividad 5 Ejercicio 19
;=========================================================================
  LIST   p=PIC16F84A
  INCLUDE   <p16f84a.inc>
  __CONFIG  _XT_OSC & _CP_OFF & _PWRTE_ON & _WDT_OFF
  ERRORLEVEL  -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE bank0  bcf STATUS,RP0
#DEFINE bank1  bsf STATUS,RP0
   cblock  0x0c
   cont1
   cont2
   counter
   endc
;===============================================================================
   bank1
   clrf  TRISB
   movlw  0x1F
   movwf  TRISA
   bank0
inicio
   clrf  PORTB
   call  delay100ms
   bsf   PORTB,0
   call  delay100ms
   bsf   PORTB,1
   call  delay100ms
   bsf   PORTB,2
   call  delay100ms
   bsf   PORTB,3
   call  delay100ms
   bsf   PORTB,4
   call  delay100ms
   bsf   PORTB,5
   call  delay100ms
   bsf   PORTB,6
   call  delay100ms
   bsf   PORTB,7
   call  delay100ms
   bcf   PORTB,7
   call  delay100ms
   bcf   PORTB,6
   call  delay100ms
   bcf   PORTB,5
   call  delay100ms
   bcf   PORTB,4
   call  delay100ms
   bcf   PORTB,3
   call  delay100ms
   bcf   PORTB,2
   call  delay100ms
   bcf   PORTB,1
   call  delay100ms
   incf  counter
   movf  counter,w
   sublw  .3
   btfss  STATUS,2
   goto  inicio
   clrf  counter
   clrf  PORTB
   call  delay100ms
   call  delay100ms
   movlw  b'01010101'
   movwf  PORTB
aca1
   call  delay100ms
   call  delay100ms
   comf  PORTB
   incf  counter
   movf  counter,w
   sublw  .9
   btfss  STATUS,2
   goto  aca1
   clrf  counter
   clrf  PORTB
   call  delay100ms
   movlw  b'00001111'
   movwf  PORTB
aca2
   comf  PORTB
   call  delay100ms
   call  delay100ms
   incf  counter
   movf  counter,w
   sublw  .8
   btfss  STATUS,2
   goto  aca2
   clrf  PORTB

   


;===================================================================================
delay100ms
  movlw .31
  movwf cont1
  movlw .79
  movwf cont2       ;99998 ciclos
delayloop
  decfsz cont1, f
  goto $+2
  decfsz cont2, f
  goto delayloop
  return

  END

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.
;Actividad 5 Ejercicio 20
;====================================================================================
  LIST   p=PIC16F84A
  INCLUDE   <p16f84a.inc>
  __CONFIG  _XT_OSC & _PWRTE_ON & _WDT_OFF & _CP_OFF
  ERRORLEVEL  -302
;===============================================================================
; DEFINO VARIABLES
;===============================================================================
#DEFINE  bank0  bcf STATUS,RP0
#DEFINE  bank1  bsf STATUS,RP0
  cblock  0x0c
  contador
  multiplicador
  endc
;===============================================================================
  ORG 0x000
  bank1
  movlw  0x1F
  movwf  TRISA
  clrf  TRISB
  bank0
  clrf  PORTB
  btfss  PORTA,0
  goto  descendente
  goto  ascendente

ascendente
  clrf  contador
  movf  contador,w
  call   tabla
  movwf  PORTB
loop
  incf  contador,f
  movf  contador,w
  sublw  .10
  btfsc  STATUS,2
  goto  ascendente
  movf  contador,w
  call   tabla
  movwf  PORTB
  call  delay500ms
  btfss  PORTA,0
  goto  descendente
  goto  loop

descendente
  clrf  contador
  movf  contador,w
  call  tabla
  movwf  PORTB
  movlw  .9
  movwf  contador
  call  tabla
  movwf  PORTB
loop1
  decf  contador,f
  movf  contador,w
  btfsc  STATUS,2
  goto  descendente
  call   tabla
  movwf  PORTB
  call  delay500ms
  btfsc  PORTA,0
  goto  ascendente
  goto  loop1

;===================================================================================
tabla
  addwf  PCL,F
  retlw  b'00111111'   ;cero
  retlw  b'00000110'   ;uno
  retlw  b'01011011'   ;dos
  retlw  b'01001111'   ;tres
  retlw  b'01100110'   ;cuatro
  retlw  b'01101101'   ;cinco
  retlw  b'01111100'   ;seis
  retlw  b'00000111'   ;siete
  retlw  b'01111111'   ;ocho
  retlw  b'01100111'   ;nueve
;===================================================================================
delay500ms
  movlw  b'11000111'
  movwf  OPTION_REG
  clrf  multiplicador
  movlw  .61
  movwf  TMR0
incTMR0
  incf  TMR0,f
  btfss  INTCON,T0IF
  goto  incTMR0
  bcf   INTCON,T0IF
  incf  multiplicador,f
  movf  multiplicador,w
  sublw  .10
  btfss  STATUS,2
  goto  incTMR0
  return

  END

Además, para probar el correcto funcionamiento de los programas realizados, utilizamos un simulador denominado "Isis", con el siguiente circuito:


En el PORTA, tenemos una serie de "pulsadores" donde podemos implicar un 1 o un 0 lógicos al micro, y en el PORTB, están los indicadores de estado, para poder saber si poseemos un 1 o un 0 lógico en cada bit.

No hay comentarios:

Publicar un comentario