jueves, 31 de marzo de 2016

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, pero puede utilizar cualquier otro)


; Bits de configuración para el pic16f877a:

    __config _CP_OFF & _HS_OSC & _WDT_OFF & _PWRTE_ON & _BODEN_OFF & _LVP_OFF & _CPD_OFF & _WRT_OFF & _DEBUG_OFF 
    ; _HS_OSC : si OSC >= 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 cristal de 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     
    movwf    VDelay0  
    movlw     .213     
    movwf    VDelay1    
    nop            
    goto       $+1        
    decfsz    VDelay1,f
    goto       $-3  
    decfsz    VDelay0,f
    goto       $-
    goto       $+1    
    nop             
    return             
   
    END

CIRCUITO EN PROTEUS:

Si desea armar el circuito en 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)

 

miércoles, 30 de marzo de 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
            movwf    RegParteAlta
            movlw    k
            movwf    RegParteBaja
        else
            clrf    RegParteAlta
            movlw    Numero
            movwf    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: