Anexo C

Anuncio
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
CODEPAGE
CODEPAGE
CODEPAGE
CODEPAGE
CODEPAGE
NAME=vectors
NAME=page
NAME=idlocs
NAME=config
NAME=devid
NAME=eedata
START=0x0
START=0x18
START=0x200000
START=0x300000
START=0x3FFFFE
START=0xF00000
ACCESSBANK NAME=accessram
DATABANK
NAME=gpr0
DATABANK
NAME=gpr1
DATABANK
NAME=gpr2
DATABANK
NAME=gpr3
DATABANK
NAME=usb4
DATABANK
NAME=usb5
DATABANK
NAME=usb6
DATABANK
NAME=usb7
ACCESSBANK NAME=accesssfr
START=0x0
START=0x60
START=0x100
START=0x200
START=0x300
START=0x400
START=0x500
START=0x600
START=0x700
START=0xF60
END=0x17
END=0x7FFF
END=0x200007
END=0x30000D
END=0x3FFFFF
END=0xF000FF
PROTECTED
PROTECTED
PROTECTED
PROTECTED
PROTECTED
END=0x5F
END=0xFF
END=0x1FF
END=0x2FF
END=0x3FF
END=0x4FF
PROTECTED
END=0x5FF
PROTECTED
END=0x6FF
PROTECTED
END=0x7FF
PROTECTED
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
Integrado
ANEXO C
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
#include <P18F2550.INC>
; Procesador utilizado
; Incluir el fichero con símbolos y etiquetas
;*******************************************************************
;Declaración de variables
cont equ 0x000
cont1 equ 0x001
ORG
0x000
goto INICIO
ORG
0x018
; Reset del vector
; Dirigir al inicio del programa
; 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
#include <P18F2550.INC>
; Procesador utilizado
; Incluir el fichero con símbolos y etiquetas
;*******************************************************************
;Declaración de variables
cont equ 0x00
cont1 equ 0x01
cont2 equ 0x02
ORG
0x00
goto INICIO
ORG
0x18
; Reset del vector
; Dirigir al inicio del programa
; Saltar Vector Interrupción
;*******************************************************************
; Comienza el programa
;*******************************************************************
INICIO
movlb B'00001111'
movlw 0xFF
movwf cont
movwf cont1
movlw 0x10
movwf cont2
clrf PORTB,1
clrf LATB,1
movlw B'00001110'
movwf TRISB,1
;
;
;
;
Reset del puerto b
Reset del puerto b
Configurar I/O en el registro wreg
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
Integrado
ANEXO C
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
clrf LATB,1
; Reset puerto B. Apagan los LEDS
; 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
#include <P18F2550.INC>
; Procesador utilizado
; 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
goto INICIO
ORG
0x18
; Inicio en el Vector de Reset
; Va a la primera instrucción del programa
; Salta los Vectores de Interrupción
;*******************************************************************
; Comienza el programa
;*******************************************************************
INICIO
movlb B'00001111'
movlw B'00001110'
movwf TRISB,1
; Selecciono Registro del Banco 1
; Configurar I/O en el registro wreg
; Configuramos la puerta B
BUCLE
clrf PORTB,1
clrf LATB,1
clrf cont
ESPERA
btfsc PORTB,1,1
call INCREMENTO
goto ESPERA
INCREMENTO
clrf PORTB,1
incf cont
Universidad de Sevilla
; Reset de la Puerta B. Inicializar el vector B
; Inicializamos el contador
; Esperamos que se pulse la tecla, es decir, esperamos
;que RB1 pase de "0" a "1"
; Si se pulsó pasamos al subprograma INCREMENTO
; No se pulsó, seguimos esperando
; Incrementamos contador
Pág. 155
Diseño
Integrado
ANEXO C
Código en Ensamblador
swapf cont,1
rlcf cont,0
movwf PORTB,1
SOLTAR
btfsc PORTB,1,1
goto SOLTAR
return
; Cambiamos la parte alta y baja el contador
; Rotación a izquierda y almaceno registro trabajo
; Sacamos el valor de w por puerto B
; Esperamos que pase de "1" a "0"
; Se soltó la tecla,
;*******************************************************************
; 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
#include <P18F2550.INC>
; Procesador utilizado
; Incluir el fichero con símbolos y etiquetas
;*******************************************************************
;Declaración de variables
ctr equ 0x00
ORG
goto
ORG
goto
ORG
goto
ORG
; Variable que va a contar el número de pulsaciones
0x00
INICIO
0X08
RUT_INTER
0X18
RUT_INTER
0x20
; Inicio en el Vector de Reset
; Va a la primera instrucción del programa
; Cuando se produzca interrupción salta rutina
; Cuando se produzca interrupción salta rutina
; Salta los Vectores de Interrupción
;*******************************************************************
; Comienza el programa
;*******************************************************************
INICIO
movlb B'00001111'
movlw B'00001110'
movwf TRISB,1
movlw B'11000111'
movwf T0CON,1
;
;
;
;
;
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
movlw B'10000000'
movwf RCON,1
movlw B'11111100'
movwf INTCON2,1
movlw B'10100000'
movwf INTCON,1
ESPERA
goto ESPERA
Universidad de Sevilla
Selecciono Registro del Banco 1
Configurar I/O en el registro wreg
Configuramos la puerta B
Ponemos valor para configurar el TMR0
Movemos al regisro de configuración
; Contamos 12 veces
; Habilitamos Interupciones
; Configuramos la interrupción
Pág. 157
Diseño
Integrado
ANEXO C
Código en Ensamblador
;*******************************************************************
; Rutina de interrupción
;*******************************************************************
RUT_INTER
decfsz ctr,1
goto NO_CERO
comf LATB,1,1
;
comf PORTB,1,1
movlw d'8'
movwf ctr
NO_CERO
movlw d'12'
movwf TMR0L,1
bcf INTCON,TMR0IF,1
retfie
; Salta sino ha llegado al cero
; Complementa PORTB
; Inicializa la variable de control
; Inicia el contador
; Limpia el falg Interrupción.
;*******************************************************************
; Fin del programa
END
Pág. 158
Universidad de Sevilla
Descargar