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)
; 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:

Ejercicio pic assembler

  • 1.
    Ejercicio Nº1 ; Ejercicio01: ; 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 guardarla 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: