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)
Suscribirse a:
Entradas (Atom)
No hay comentarios:
Publicar un comentario