Está en la página 1de 8

Diseño

Integrado

Anexo C: Códigos en Ensamblador

Para poder ensamblar estos códigos utilizando el MPLAB es necesario realizar


un ajuste de fichero .lnk (linker) para ajustarlo a las exigencias del dispositivo. En
Concreto debemos especificar el principio y el fin de los vectores de interrupción en la
memoria de programa. El fichero quedará como:

// File: 18f2550.lkr
// Sample linker script for the PIC18F2550 processor

// Not intended for use with MPLAB C18. For C18 projects,
// use the linker scripts provided with that product.

LIBPATH .

CODEPAGE NAME=vectors START=0x0 END=0x17 PROTECTED


CODEPAGE NAME=page START=0x18 END=0x7FFF
CODEPAGE NAME=idlocs START=0x200000 END=0x200007 PROTECTED
CODEPAGE NAME=config START=0x300000 END=0x30000D PROTECTED
CODEPAGE NAME=devid START=0x3FFFFE END=0x3FFFFF PROTECTED
CODEPAGE NAME=eedata START=0xF00000 END=0xF000FF PROTECTED

ACCESSBANK NAME=accessram START=0x0 END=0x5F


DATABANK NAME=gpr0 START=0x60 END=0xFF
DATABANK NAME=gpr1 START=0x100 END=0x1FF
DATABANK NAME=gpr2 START=0x200 END=0x2FF
DATABANK NAME=gpr3 START=0x300 END=0x3FF
DATABANK NAME=usb4 START=0x400 END=0x4FF PROTECTED
DATABANK NAME=usb5 START=0x500 END=0x5FF PROTECTED
DATABANK NAME=usb6 START=0x600 END=0x6FF PROTECTED
DATABANK NAME=usb7 START=0x700 END=0x7FF PROTECTED
ACCESSBANK NAME=accesssfr START=0xF60 END=0xFFF PROTECTED

Programa Parpadeo de un LED

;*******************************************************************
;
; PROYECTO FIN DE CARRERA
; PLACA DETECTOR DE MOVIMIENTO
; Parpadeo de un LED
;
; Realizado: MARTA ARENAS MAS
; Fecha: 22-Mayo-2008
; Versión: v1
;
;*******************************************************************

Universidad de Sevilla Pág. 151


Diseño ANEXO C
Integrado Código en Ensamblador

;******************************************************************
;
; Ficheros Utilizados: P18F2550.INC
; 18F2550.LKR
;

;*******************************************************************
;Este programa enciende y apaga un LED de forma consecutiva
;*******************************************************************

LIST P=18F2550, F=INHX32 ; Procesador utilizado


#include <P18F2550.INC> ; Incluir el fichero con símbolos y etiquetas

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

;Declaración de variables
cont equ 0x000
cont1 equ 0x001

ORG 0x000 ; Reset del vector


goto INICIO ; Dirigir al inicio del programa
ORG 0x018 ; Saltar Vector Interrupción

;*******************************************************************
; Comienza el programa
;*******************************************************************
INICIO
movlb B'00001111'
movlw 0xFF
movwf cont
movwf cont1
clrf PORTB,1 ; Reset del puerto b
clrf LATB ,1 ; Reset del puerto b
movlw B'00001110' ;Configurar I/O en el registro wreg
movwf TRISB,1 ; Configuramos la puerta B
BUCLE
bsf PORTB,7,1 ; Activa bit 7 Puerta B. Enciendo LED 1
SIGO_ON
decfsz cont,1
goto SIGO_ON
decfsz cont1,1
goto SIGO_ON
bcf PORTB,7,1 ; Apaga bit 7 Puerta B. Enciendo LED 1
SIGO_OFF
decfsz cont,1
goto SIGO_OFF
decfsz cont1,1
goto SIGO_OFF
goto BUCLE

;*******************************************************************
; Fin del programa

END

Pág. 152 Universidad de Sevilla


ANEXO C
Código en Ensamblador Diseño
Integrado

Programa Jugando con LEDS

;*******************************************************************
;
; PROYECTO FIN DE CARRERA
; PLACA DETECTOR DE MOVIMIENTO
; Jugando LEDs
;
; Realizado: MARTA ARENAS MAS
; Fecha: 22-Mayo-2008
; Versión: v1
;
;*******************************************************************
;
; Ficheros Utilizados: P18F2550.INC
; 18F2550.LKR
;
;*******************************************************************
;Este programa enciende consecutivamente 3 leds
;*******************************************************************

LIST P=18F2550, F=INHX32 ; Procesador utilizado


#include <P18F2550.INC> ; Incluir el fichero con símbolos y etiquetas

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

;Declaración de variables
cont equ 0x00
cont1 equ 0x01
cont2 equ 0x02

ORG 0x00 ; Reset del vector


goto INICIO ; Dirigir al inicio del programa
ORG 0x18 ; Saltar Vector Interrupción

;*******************************************************************
; Comienza el programa
;*******************************************************************

INICIO
movlb B'00001111'
movlw 0xFF
movwf cont
movwf cont1
movlw 0x10
movwf cont2
clrf PORTB,1 ; Reset del puerto b
clrf LATB,1 ; Reset del puerto b
movlw B'00001110' ; Configurar I/O en el registro wreg
movwf TRISB,1 ; Configuramos la puerta B
LED1
decfsz cont,1
goto LED1
decfsz cont1,1
goto LED1
decfsz cont2,1
goto LED1

Universidad de Sevilla Pág. 153


Diseño ANEXO C
Integrado Código en Ensamblador

movlw 0xFF
movwf cont
movwf cont1
movlw 0x10
movwf cont2
bsf PORTB,7,1 ; Activa bit 7 Puerta B. Enciendo LED 1
LED2
decfsz cont,1
goto LED2
decfsz cont1,1
goto LED2
decfsz cont2,1
goto LED2

movlw 0xFF
movwf cont
movwf cont1
movlw 0x10
movwf cont2
bsf PORTB,6,1 ; Activa bit 6 Puerta B. Enciendo LED 2
LED3
decfsz cont,1
goto LED3
decfsz cont1,1
goto LED3
decfsz cont2,1
goto LED3

movlw 0xFF
movwf cont
movwf cont1
movlw 0x10
movwf cont2
bsf PORTB,5,1 ; Activa bit 5 Puerta B. Enciendo LED 3

APAGA
decfsz cont,1
goto APAGA
decfsz cont1,1
goto APAGA
decfsz cont2,1
goto APAGA
clrf PORTB,1 ; Reset puerto B. Apagan los LEDS
clrf LATB,1 ; Reset puerto B

movlw 0xFF
movwf cont
movwf cont1
movlw 0x10
movwf cont2
goto LED1

;*******************************************************************
; Fin del programa
END

Pág. 154 Universidad de Sevilla


ANEXO C
Código en Ensamblador Diseño
Integrado

Programa Contando Pulsaciones

;*******************************************************************
;
; PROYECTO FIN DE CARRERA
; PLACA DETECTOR DE MOVIMIENTO
; CUENTA PULSACIONES
;
; Realizado: MARTA ARENAS MAS
; Fecha: 22-Mayo-2008
; Versión: v1
;
;*******************************************************************
;
; Ficheros Utilizados: P18F2550.INC
; 18F2550.LKR
;
;*******************************************************************

LIST P=18F2550, F=INHX32 ; Procesador utilizado


#include <P18F2550.INC> ; Incluir el fichero con símbolos y etiquetas

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

;Declaración de variables
cont equ 0x00 ; Variable que va a contar el número de pulsaciones

ORG 0x00 ; Inicio en el Vector de Reset


goto INICIO ; Va a la primera instrucción del programa
ORG 0x18 ; Salta los Vectores de Interrupción

;*******************************************************************
; Comienza el programa
;*******************************************************************

INICIO

movlb B'00001111' ; Selecciono Registro del Banco 1


movlw B'00001110' ; Configurar I/O en el registro wreg
movwf TRISB,1 ; Configuramos la puerta B

BUCLE
clrf PORTB,1
clrf LATB,1 ; Reset de la Puerta B. Inicializar el vector B
clrf cont ; Inicializamos el contador

ESPERA
btfsc PORTB,1,1 ; Esperamos que se pulse la tecla, es decir, esperamos
;que RB1 pase de "0" a "1"
call INCREMENTO ; Si se pulsó pasamos al subprograma INCREMENTO
goto ESPERA ; No se pulsó, seguimos esperando

INCREMENTO
clrf PORTB,1
incf cont ; Incrementamos contador

Universidad de Sevilla Pág. 155


Diseño ANEXO C
Integrado Código en Ensamblador

swapf cont,1 ; Cambiamos la parte alta y baja el contador


rlcf cont,0 ; Rotación a izquierda y almaceno registro trabajo
movwf PORTB,1 ; Sacamos el valor de w por puerto B

SOLTAR
btfsc PORTB,1,1 ; Esperamos que pase de "1" a "0"
goto SOLTAR ; Se soltó la tecla,
return

;*******************************************************************
; Fin del programa

END

Temporizador/Contador e Interrupciones

En este programa se utilizan un temporizador con el fin de que los diodos


luminiscentes parpadeen una vez por segundo aproximadamente. El objetivo
fundamental, una vez que ya se conocen el lenguaje y las aplicaciones básicas del
PIC es aprender el uso de las interrupciones y el temporizador/contador TMR0.

Habilitamos las interrupciones de forma que no existan prioridades en ellas,


trabajar de forma más sencilla, indicamos en la dirección de la interrupción el salto a la
subrutina y configuramos el TMR0 como contador de 8 bits.

Sabiendo que la expresión utilizada para medir la temporización es:

Temp=4. Tosc.(256-TMRL0). Factor de división

Pretendiendo obtener 500ms, la configuración más rápida será:


• TMRL0=12;
• Factor de división 256;

Temp=4. 0.25µseg .(256-12). 256=62,464ms

Para conseguir los 500ms es necesario contabilizar ocho temporizaciones:

8x62.5ms=500ms.

El programa queda como se muestra a continuación

;*******************************************************************
;
; PROYECTO FIN DE CARRERA
; PLACA DETECTOR DE MOVIMIENTO
; TEMPORIZADOR PARA QUE LOS LEDS PARPADEEN
;
; Realizado: MARTA ARENAS MAS
; Fecha: 22-Mayo-2008
; Versión: v1
;
;*******************************************************************

Pág. 156 Universidad de Sevilla


ANEXO C
Código en Ensamblador Diseño
Integrado

;*******************************************************************
;
; Ficheros Utilizados: P18F2550.INC
; 18F2550.LKR
;
;*******************************************************************
; El microprocesador PIC reserva la dirección de memoria 0x08 para el vector de
; interrupción, por tanto en ella se debe de colocar una instrucción de salto,
; para que, cuando el temporizador genere una interrupción , el contador de
; programa se situe en la dirección que comienza la interrupción.

LIST P=18F2550, F=INHX32 ; Procesador utilizado


#include <P18F2550.INC> ; Incluir el fichero con símbolos y etiquetas

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

;Declaración de variables
ctr equ 0x00 ; Variable que va a contar el número de pulsaciones

ORG 0x00 ; Inicio en el Vector de Reset


goto INICIO ; Va a la primera instrucción del programa
ORG 0X08
goto RUT_INTER ; Cuando se produzca interrupción salta rutina
ORG 0X18
goto RUT_INTER ; Cuando se produzca interrupción salta rutina
ORG 0x20 ; Salta los Vectores de Interrupción

;*******************************************************************
; Comienza el programa
;*******************************************************************

INICIO

movlb B'00001111' ; Selecciono Registro del Banco 1


movlw B'00001110' ; Configurar I/O en el registro wreg
movwf TRISB,1 ; Configuramos la puerta B
movlw B'11000111' ; Ponemos valor para configurar el TMR0
movwf T0CON,1 ; Movemos al regisro de configuración

clrf PORTB,1
clrf LATB,1 ; Reset de la Puerta B. Inicializamos el vector B

movlw d'8'
movwf ctr ; La variable de control=8

movlw d'12'
movwf TMR0L,1 ; Contamos 12 veces
movlw B'10000000'
movwf RCON,1 ; Habilitamos Interupciones
movlw B'11111100'
movwf INTCON2,1
movlw B'10100000'
movwf INTCON,1 ; Configuramos la interrupción
ESPERA
goto ESPERA

Universidad de Sevilla Pág. 157


Diseño ANEXO C
Integrado Código en Ensamblador

;*******************************************************************
; Rutina de interrupción
;*******************************************************************

RUT_INTER
decfsz ctr,1 ; Salta sino ha llegado al cero
goto NO_CERO
comf LATB,1,1
; comf PORTB,1,1 ; Complementa PORTB
movlw d'8'
movwf ctr ; Inicializa la variable de control
NO_CERO
movlw d'12' ; Inicia el contador
movwf TMR0L,1
bcf INTCON,TMR0IF,1 ; Limpia el falg Interrupción.
retfie

;*******************************************************************
; Fin del programa

END

Pág. 158 Universidad de Sevilla

También podría gustarte