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