Sunteți pe pagina 1din 11

Examen Microprocesadores

Alumno: José Manuel Pérez Vega

Ejercicio 1: Retardo por Software


;******************************************************************************
; This file is a basic template for assembly code for a PIC18F4550. Copy *
; this file into your project directory and modify or add to it as needed. *
; *
; The PIC18FXXXX architecture allows two interrupt configurations. This *
; template code is written for priority interrupt levels and the IPEN bit *
; in the RCON register must be set to enable priority levels. If IPEN is *
; left in its default zero state, only the interrupt vector at 0x008 will *
; be used and the WREG_TEMP, BSR_TEMP and STATUS_TEMP variables will not *
; be needed. *
; *
; Refer to the MPASM User's Guide for additional information on the *
; features of the assembler. *
; *
; Refer to the PIC18FXX50/XX55 Data Sheet for additional *
; information on the architecture and instruction set. *
; *
;******************************************************************************
; *
; Filename: Retardo *
; Date: 19/11/18 *
; File Version: 1.0 *
; *
; Author: José Manuel Pérez Vega *
; *
;******************************************************************************
; *
; Files required: P18F4550.INC *
; *
;******************************************************************************

LIST P=18F4550, F=INHX32 ;directive to define processor


#include <P18F4550.INC> ;processor specific variable definitions

;******************************************************************************
;Configuration bits

CONFIG PLLDIV = 5 ;(20 MHz crystal on PICDEM FS USB board)


CONFIG CPUDIV = OSC1_PLL2
CONFIG USBDIV = 2 ;Clock source from 96MHz PLL/2
CONFIG FOSC = HSPLL_HS
CONFIG FCMEN = OFF
CONFIG IESO = OFF
CONFIG PWRT = OFF
CONFIG BOR = ON
CONFIG BORV = 3
CONFIG VREGEN = ON ;USB Voltage Regulator
config WDT = OFF
config WDTPS = 32768
config MCLRE = ON
config LPT1OSC = OFF
config PBADEN = OFF ;NOTE: modifying this value here won't have an effect
;on the application. See the top of the main() function.
;By default the RB4 I/O pin is used to detect if the
;firmware should enter the bootloader or the main application
;firmware after a reset. In order to do this, it needs to
;configure RB4 as a digital input, thereby changing it from
;the reset value according to this configuration bit.
config CCP2MX = ON
config STVREN = ON
config LVP = OFF
config ICPRT = OFF ; Dedicated In-Circuit Debug/Programming
config XINST = OFF ; Extended Instruction Set
config CP0 = OFF
config CP1 = OFF
config CP2 = OFF
config CP3 = OFF
config CPB = OFF
config CPD = OFF
config WRT0 = OFF
config WRT1 = OFF
config WRT2 = OFF
config WRT3 = OFF
config WRTB = OFF ; Boot Block Write Protection
config WRTC = OFF
config WRTD = OFF
config EBTR0 = OFF
config EBTR1 = OFF
config EBTR2 = OFF
config EBTR3 = OFF
config EBTRB = OFF
;******************************************************************************
;Variable definitions
; These variables are only needed if low priority interrupts are used.
; More variables may be needed to store other special function registers used
; in the interrupt routines.
VAR EQU 0x00
VAR1 EQU 0x01
VAR2 EQU 0x02

;******************************************************************************
;Reset vector
; This code will start executing when a reset occurs.

RESET_VECTOR ORG 0

goto Main ;go to start of main code


;******************************************************************************

;******************************************************************************
;Start of main program
; The main program code is placed here.
ORG 0x1000
Main ; *** main code goes here **
call cfgptos
inicio
movlw 0x01
movwf LATA
call retardo2
movlw 0x00
movwf LATA
call retardo2
goto inicio

; end of main
;******************************************************************************
; Start of subrutines
;******************************************************************************
cfgptos
movlw 0x0F
movwf ADCON1
movlw 0x07
movwf CMCON

movlw 0x00
movwf TRISA

return

retardo
push w
movlw d'240'
movwf VAR
otra
NOP
NOP
decfsz VAR
goto otra
pop w
return
retardo1
movlw d'100'
movwf VAR1
otra1
call retardo
decfsz VAR1
goto otra1
return
retardo2
movlw d'100'
movwf VAR2
otra2
call retardo1
decfsz VAR2
goto otra2
return

;******************************************************************************
;End of program
END

Ejercicio 1: Retardo por Software

Ejercicio 3: Escriba un programa que muestre su nombre y apellidos


en un LCD conectado al puerto B

N1 equ 0x10
M equ 0x20
Nx equ 0x30
Mx equ 0x40
P2 equ 0x41
ORG 0X1000
Main:

LCD2
CALL LCD_IN
CALL I1
CALL NEXT
CALL I22
RETURN

I1
MOVLW 'M'
MOVWF PORTB
CALL MANDAR
MOVLW 'A'
MOVWF PORTB
CALL MANDAR
MOVLW 'N'
MOVWF PORTB
CALL MANDAR
MOVLW 'U'
MOVWF PORTB
CALL MANDAR
MOVLW 'E'
MOVWF PORTB
CALL MANDAR
MOVLW 'L'
MOVLW ' '
MOVWF PORTB

I22
MOVLW 'P'
MOVWF PORTB
CALL MANDAR
MOVLW 'E'
MOVWF PORTB
CALL MANDAR
MOVLW 'R'
MOVWF PORTB
CALL MANDAR
MOVLW 'E'
MOVWF PORTB
CALL MANDAR
MOVLW 'Z'
MOVWF PORTB
CALL MANDAR
MOVLW '.'
MOVWF PORTB
CALL MANDAR
MOVLW 'V'
MOVWF PORTB
CALL MANDAR
MOVLW 'E'
MOVWF PORTB
CALL MANDAR
MOVLW 'G'
MOVWF PORTB
CALL MANDAR
MOVLW 'A'
MOVWF PORTB
CALL MANDAR
MOVLW '.'
MOVWF PORTB
CALL MANDAR
CALL PAUSA
RETURN

LCD_IN
BCF PORTA, 1; RS = 0
MOVLW 0X01
MOVWF PORTB
CALL EJECUTA
MOVLW 0X0C
MOVWF PORTB
CALL EJECUTA
MOVLW 0X3C
MOVWF PORTB
CALL EJECUTA
BSF PORTA, 0; RS = 1
RETURN

EJECUTA
BSF PORTA, 2
CALL DELAY
CALL DELAY
BCF PORTA, 2 ;E
CALL DELAY
RETURN

MANDAR
BSF PORTA, 1
CALL EJECUTA
RETURN

NEXT
BCF PORTA, 1
MOVLW 0XC0
MOVWF PORTB
CALL EJECUTA
RETURN

DELAY
MOVLW D'48'
MOVWF M
DOS
MOVLW D'255'
MOVWF N1
UNO
DECFSZ N1, 1
GOTO UNO
DECFSZ M, 1
GOTO DOS
RETURN

PAUSA
MOVLW D'5'
MOVWF P2
TRESx
MOVLW D'8'
MOVWF Mx
DOSx
MOVLW D'250'
MOVWF Nx
UNOx
NOP
NOP
DECFSZ Nx, 1
GOTO UNOx
DECFSZ M, 1
GOTO DOSx
DECFSZ P2, 1
GOTO TRESx
RETURN

Ejercicio 4: Escriba un programa que guarde una clave de acceso de


tres dígitos en la memoria EEPROM

list p=18f4550
#include p18f4550.inc

UDATA 0XA0 ; Variables en el banco 1 para evitar cambios.


DATO EQU 0X01
DIR EQU 0X02

ORG 0X0100
MAIN
BSF STATUS,5; Banco 1, donde estan los registros de control
; de la EEPROM.
CLRF DIR ; Inicializar variables.
MOVLW 'a'
MOVWF DATO

BSF EECON1,WREN ; Habilita la escritura de la EEPROM.


ESCRITURA BTFSC EECON1,WR ; Esperar hasta que NO haya un proceso de
GOTO ESCRITURA ; escritura ejecutandose.
MOVF DATO,W ; Preparar dato.
MOVWF EEDATA
MOVF DIR,W ; Preparar direccion.
MOVWF EEADR
MOVLW 55h ; Ejecuta secuencia de proteccion (escribir
MOVWF EECON2 ; las constantes 55 y AA en EECON2).
MOVLW 0AAh
MOVWF EECON2
BSF EECON1,WR ; Ordena iniciar la escritura.
INCF DATO,F ; Prepara el dato y direccion siguientes.
INCF DIR,F
MOVF DIR,W
SUBLW .3
BTFSS STATUS,Z
GOTO ESCRITURA ; 3 iteraciones.
ULTIMO BTFSC EECON1,WR ; Avanza hasta que se almacena el ultimo dato.
GOTO ULTIMO
BCF EECON1,WREN ; Deshabilita la escritura de la EEPROM.
END

Ejercicio 5: Escriba una subrutina para mostrar una serie de luces


visibles al ojo humano con LED’s y conectados a puerto D. La
secuencia debe mostrar primero los bits pares y después los impares
de forma alternada.

LIST P=18F4550
#include <P18F4550.INC>

inicial equ 0x00


Var1 equ 0x02
Var2 equ 0x01

RESET_VECTOR ORG 0

goto Main

ORG 0x1000
Main
MOVLW 0X0F
MOVWF ADCON1

CLRF TRISD

ciclo MOVLW 0X05


MOVWF LATD
CALL Ret05
MOVLW 0X0A
MOVWF LATD
CALL Ret05
goto ciclo

Ret05: MOVLW 0X32


MOVWF inicial
ciclo05 CALL Ret10ms
decfsz inicial
goto ciclo05
return
Ret10ms: MOVLW 0X64
MOVWF Var1
ciclo10 CALL Ret100us
decfsz Var1
goto ciclo10
return

Ret100us: MOVLW 0XF0


MOVWF Var2
ciclo100 nop
nop
decfsz Var2
goto ciclo100
return

END

Ejercicio 6: Resuelva el siguiente programa, corrigiendo los errores


de código y de sintaxis. Explique cada una de las instrucciones,
señalando cual fue el error y su corrección.

PORT
status equ 0x03 // registro status inicia en 3
porta equ 0x05
portb equ 0x06
trisa equ 0x85
trisb equ 0x86

org0x050
inicio // etiqueta
CALL PORT
bsf status,5 // “1” el bit 5 del Registro “Status”
bsf porta,0 // “1” el bit 0 del puerto A
bsf porta,1 // “1” el bit 1 del puerto A
clrf portb // Borra el contenido del puerto B
bcf status // Elimina los datos el registro STATUS
activar // etiqueta
btfssporta,0 // btfss porta,0 ; el bit “0” del puerto A es 1? si cumple, salta 1 instrucción
goto giro // IR A otro punto de la función señalado con una etiqueta
clrf portb // Borra el contenido del puerto B
goto fin // IR A otro punto de la función señalado con una etiqueta
giro // etiqueta
btfscporta,1 // BTFSC PORTA,1; el bit 1 del puerto a es 0? si cumple, salta 1 instrucción
goto izq_z // IR A otro punto de la función señalando una etiqueta
call // ERROR; falta el registro que será invocado
goto fin // IR A otro punto de la función señalado con una etiqueta
izq_z //etiqueta
call izq // Invoca a la Subrutina
fin //etiqueta
goto activar // IR A otro punto de la función señalado con una etiqueta
izq //etiqueta
movlw’00000101’ // “00000101” binario al registro W
movwf // Falta el registro que se le va a cargar el contenido de W
call retardo // Invoca a la Subrutina
movlw,00000110’ // movlw ‘00000110’ número binario al registro W
movlwfportb // Carga el dato que se encuentra en W al Puerto B
call retardo_20ms // Invoca la subrutina de retardo
movlwb’00001010’ // MOVLW ‘00001010’ número binario a W
movwfpuertob // MOVWF PORTB dato que está en W al puerto B
call retardo_20ms // Invoca la subrutina de retardo
movlwb’00001001’ // MOVLW ‘00001001’ número binario a W
movwfportb // MOVWF PORTB ;Carga el dato que está en W al puerto B
RETURN

call // ERROR; Invoca una función, falta el registro que será invocado
return // Regresa a donde fue invocada la subrutina inicialmente

der //etiqueta
movlw09 // MOVLW 0x09 Carga el número en hexadecimal a W
movwfportb // MOVWF PORTB ; Carga el dato que está en W al puerto B
call retardo_20ms // Invoca la Subrutina de Retardo
movlw08 // MOVLW 0x08 Carga el número en hexadecimal a WREG
movwfportb // MOVWF PORTB ;Carga el dato que está en W al puerto B
call retardo_20ms // Invoca la Subrutina de Retardo
movlw05’ // MOVLW 0x05 Carga el número en hexadecimal a W
movwfportb // MOVWF PORTB ;Carga el dato que está en W al puerto B
retardo_20ms // CALL RETARDO_20MS

RETARDO_20MS
MOVLW B'10110000' //número binario en W
MOVWF T1CON // dato que está en W al registro de Timer1
BCF PIR1,TMR1IF // “0” las banderas del registro de Timer
BCF T1CON,TMR1ON // “0” las banderas del registro de Timer para apagarlo
MOVLW 0XC7 // número hexadecimal en W
MOVWF TMR1H // valor de W a la parte ALTA registro del Timer
MOVLW 0X77 // número hexadecimal en WREG
MOVWF TMR1L // valor de W a la parte de BAJA registro del Timer
BSF T1CON,TMR1ON // “1” las banderas del registro de Timer para encenderlo
ETQ
BTFSS PIR1,TMR1IF // el bit TMR1IF del puerto PIR es 1? si cumple, salta 1 instrucción
GOTOETQ // IR A otro punto de la función señalado con una etiqueta
BCF PIR1,TMR1IF // “0” la bandera del registro de Timer
Return // REGRESA DONDE FUE LLAMADA
return // Regresa
end // Termina el programa

S-ar putea să vă placă și