1. Ejercicio Nº1
; Ejercicio 01:
; Contador Binario: Por el puerto B mostrar los códigos del 0 al 255 en binario.
; Los leds encendidos deberán de apagarse durante 200 ms antes de mostrar el siguiente
; incremento.
; Solución: (Se utiliza un microcontrolador pic16f877a, peropuede utilizar cualquier otro)
; Bits de configuración para elpic16f877a:
__config _CP_OFF & _HS_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _DEBUG_OFF
; _HS_OSC : siOSC >= 4MHZ
; _XT_OSC : si OSC <= 4MHZ
; OBSERVACIÓN: Si utliza otro microcontrolador, los bits de configuración podrian variar.
; Revisar datasheet. Por ejemplo para un pic16f84a, puede utilizar:
; __config _CP_OFF & _WDT_OFF & _XT_OSC & _PWRTE_OFF
; OJO: _XT_OSC si utiliza un cristalde 4MHZ o menor. Si utiliza uno de mayor valor asegúrese
; que el microcontrolador lo soporte. En ese caso utilizar _HS_OSC.
; Para este programa,en la subrutina de retardo se consideró OSC=20MHZ
list p=16f877a ; Cambie aquí si utiliza otro uC
include <p16f877a.inc>; Cambie aquí si utiliza otro uC
cblock 0x20 ; A partir de esta dirección es la memoria RAM del usuario (Banco-0)
VDelay0 ; Si utiliza otro uC revise datasheet y verique a partir de que dirección es
VDelay1 ; la memoria RAM del usuario. Por ejemplo para un pic16f84a, ésta comienza
endc ; en la dirección 0x0C.
ORG 0x00
bcf STATUS,RP1
bsf STATUS,RP0 ; Acceso banco 1
clrf TRISB ; Todo puerto B config como salidas
bcf STATUS,RP0 ; Acceso banco 0
Inicio:
clrf PORTB
Principal:
call delay_200ms
incf PORTB,f ; OBS: Si PORTB=255 --> PORTB+1 = 0
goto Principal
; Subrutina de retardo:
delay_200ms:
movlw .156
movw f VDelay0
movlw .213
movw f VDelay1
nop
goto $+1
decfsz VDelay1,f
goto $-3
decfsz VDelay0,f
goto $-7
goto $+1
nop
return
END
CIRCUITO EN PROTEUS:
Si desea armar el circuitoen una protoboard, conectar un diodo led a cada uno de los pines RB<0:7> con su respectiva resistencia serie
a tierra (330ohm)
(Hacer click en la imagen para agrandar)
Publicado por Jeizon1L en 13:38 No hay comentarios:
Enviar por correo electrónicoEscribe un blogCompartir con Tw itterCompartir con FacebookCompartir en Pinterest
miércoles, 30 de marzode 2016
Ejercicio Nº2
; Ejercicio 02:
; Definir un número de 16 bits (Ejem: d'25503') y guardar la parte alta
; de éste en un registro "NumH" y la parte baja en "NumL"
; Solución: (Autor: JeysonJMG)
; Lo normal para almacenar un número de 16bits , seria dar los valores directamente
; a NumH y NumL, sin embargo para variar un poco y facilitar las cosas, he creado
; la siguiente macro que nos permite ingresar cualquier numero entre 0 y 65536 (decimal)
2. ; y guardar la parte alta y baja en los registros que nosotros le indiquemos.
; En cuanto a optimización del código, no se ve afectado ya que se hace uso de las
; directivas if,else,endif que de acuerdo a determinadas situaciones verá que parte del
; codigo deberá ensamblar al momento de compilar. Es decir, como lo dije en un principio
; seria como dar los valores directamente a NumH y NumL. Nos facilita y resulta más
; cómodo la lectura del codigo y el ingreso del número. Jeizon1L
; ********** MACRO **********
CargarNumero16bits macro Numero,RegParteAlta,RegParteBaja
local j,k ; Variables macro locales
;Observación: Numero es constante (cualquier valor entre 0x00y 0xFFFF)
if Numero>.255
j=Numero/.256
k=Numero-j*.256
movlw j
movw f RegParteAlta
movlw k
movw f RegParteBaja
else
clrf RegParteAlta
movlw Numero
movw f RegParteBaja
endif
endm
, ************************
; Programa:
__config _CP_OFF & _HS_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _DEBUG_OFF
RADIX DEC
list p=16f877a ; uC utilizado
include <p16f877a.inc> ; fichero pregrabado en mplab del uC utilizado
CBLOCK 0x20 ; Memoria RAM del usuario (Banco-0)
NumH
NumL
endc
ORG 0
;Numero de 16bits (entre 0x00 (0)y 0xFFFF(65535)):
Numero=.25503
CargarNumero16bits Numero,NumH,NumL
;*******************
sleep
END
Simulación en MPLAB: