LA ESTRUCTURA DEL PROGRAMA EN LANGUAGE ENSAMBLADOR PARA UN DSPIC
;*******************************************************************
; Other Files Required: p30F2010.gld, p30f2010.inc ; Tools Used: MPLAB IDE : 8.92 ;******************************************************************* ; ESTRUCTURA DEL PROGRAMA EN ENSAMBLADOR PARA UN DSPIC .equ __30F2010, 1 .include "p30f2010.inc" ;Configuration bits: ;.............................................................................. config __FOSC, CSW_FSCM_OFF & XT_PLL4 ;use cristal oscilador con el 4x PLL config __FWDT, WDT_OFF ;Desabilitado Watchdog Timer config __FBORPOR, PBOR_ON & BORV_27 & PWRT_16 & MCLR_EN ;Set Brown-out Reset voltage and ;and set Power-up Timer to 16msecs config __FGS, CODE_PROT_OFF ;Desabilitado protecion de codigo ;.............................................................................. ;Declaraciones globales ;.............................................................................. .global __reset ;The label for the first line of code. .global __T1Interrupt ;Declare Timer 1 ISR name global ;.............................................................................. ;Unitialized storage in data space ;.............................................................................. .section .bss Count: .space 2 ;.............................................................................. ;Constants stored in Program space ;.............................................................................. .section .asciitext, "x" .palign 2 ;Align next word stored in Program space to an ;address that is a multiple of 2 Message: .ascii "dsPIC Starter Demo Board" ;.............................................................................. ;Code Section in Program Memory ;.............................................................................. .text ;Start of Code section __reset: MOV #__SP_init, W15 ;Initalize the Stack Pointer MOV #__SPLIM_init, W0 ;Initialize the Stack Pointer Limit Register MOV W0, SPLIM NOP ;Add NOP to follow SPLIM initialization CALL _wreg_init ;Call _wreg_init subroutine clr Count ; Initialize the count variable used in ISR InitPorts: mov #0x003F,W0 ; Setup all analog pins for digital mode mov W0,ADPCFG ; by writing ADPCFG register clr LATB ; Clear all I/O port registers. ;l…………………. .end ;End of program code in this file
ALGUNOS COMANDOS USANDO EN ENSAMBLADOR PARA DSPICS MOV W0,W1 Mueve el contenido del registro W0 al registro W1. Como se sabe un dspics esta compuesto de 16 registros de trabajo desde W0, W1, W2... W15 de 16 bits de extensión de cada registro, por este esta instrucción se puede realizar entre registros de trabajo ( registros W) y registros que disponga el dspic, también son validas las siguientes instrucciones:
MOV W1,W2 MOV W5, TRISA MOV W0,[W1]
; mueve el contenido de W1 a W2 ; mueve el contenido de W5 a TRISA ; mueve el contenido de W0 a la dirección de memoria especificada W1
MOV WREG,0x0100 Al registro W0 también se lo conoce como WREG por ende aquí estamos moviendo el contenido de W0 a la dirección de memoria 0x0100 MOV 0x0102,W6 Mueve la palabra ( 16 bits ) de la localización 0x0102 al registro W6. MOV #0x0003,W0 Mueve un literal ( un numero) al registro WEG=W0 ADD W0,[W4],W5 Sumo el contenido de W0 mas el contenido de la dirección de memoria especificado por W4 y el resultado lo coloco en el registro de W5 , la suma es en forma de palabra ( 16 bits) ADD 0x0106,WREG Suma W0 al contenido de la dirección de memoria especificado por 0x0106 y lo coloco el resultado en W0 ADD RAM100 Sumo el contenido de la dirección de memoria ( variable) especificad por RAM100 al registro W0 y el resultado lo deposito en la variable RAM100 mismo PUSH.S Guarda en la pila de datos el valor de W0, W1, W3, y del registro Status PUSH W0 Guarda en la pila el valor de W0, esta instrucción es equivalente en lenguaje ensamblador con mov a MOV W0,[W15++] PUSH W8 Guarda en la pila de datos el valor de W8 POP.S Retorna de la pila de datos el valor de W0, W1, W3, y del registro Status POP W0 Retorna de la pila de datos el valor de W0, esta instrucción aquí descrita con mov es equivalente a MOV [--W15],W0
BTSC SR,#Z El BIT Z (zero) del registro estatus es cero? Si es salta una instrucción, sino continua con la siguiente instrucción. BSET PORTB,#3 Si el BIT 3 de la pórtico PORTB del Dspic30Fxxxx es 1? Si es salta una instrucción , sino continua con la siguiente instrucción. MOV 0xFF00, W0 MOV WO, TRISB Configuro los pines 15:8 del port B como entradas y los pines 7:0 del port B del dspic como salida LAC W1,A Muevo el contenido de W1 al registro acumulador del DSPIC MPY W4*W5,A Multiplique W4*W5 y el resultado coloquelo en acumulador, esta instrucción se ejecuta en dos ciclos de reloj , he aquí en donde entra en operación las ventajas y características del dspic
SAC.R A,W0 Guarda Acumulador al registro W0 SETM TRISA
; EQUIVALE A TRISA=0xFFFF
BCLR PORTA,#14 ; pongo a 0 logico el ,pin 14 del PORTA
COMANDOS EN MPLAB .bss Ensambla las variables a usarse .bss B1: .space4 ; cuatro bytes reservado para B1 B2: .space1 ; 1 byte reservado par B1 Count: .space 2 ; 2 bytes reservado para Count También tenemos otro comando que es el: .text Es la sección donde va ir el código del programa en si. .text .global __reset __reset: MOV B1,W1 Loop: Bra Loop ; equivalente a goto Done: .end PINES DE UN DSPIC30F4011
EN LOS pines 13, y 14 van conectados el oscilador de cristal de 4, 10, 16, 20 MHZ tal como se les conecta cuando se trabaja con los microcontroladores pudiendo por software incrementar esta velocidad hasta 16 veces ya que dispone de un PLL
Respecto a los dspics te envio ciertas definiciones correspondiente a las secciones. Las secciones son básicamente bloques de memoria que ensambaldor emplea para organizar la memoria. .text define una sección de código ejecutable .bss define una sección de datos no inicializados, solo se reserva el espacio .data seccion de datos inicializados. También se pueden definir secciones por los usuarios ( con la directiva section ,son diferentes atributos que no son mas que extensiones de las tres básicas). .xbss sección de datos no inicializados en la zona de memoria x x.data sección de datos inicializados en la zona de memoria x .nbss seccion de datos no inicializados en la zona de memoria near .ndata seccion de datos inicializados en la zona de memoria near. .ybss seccion de datos no inicializados en la zona de memoria y .ydata seccion de datos inicializados en la zona de memoria y
Los atributos mas importantes son: .code indica codigo ejecuttable en memoria de programa .xmemory indica zona de memoria x .ymemory indica zona de memoria y .near indica zona de memoria near Ejemplos: .section .constantes ,code cte1: .word 0x0002 cte2: . word 0x0003 cte3: . word 0x0005 cte4: . word 0x000A .section .xbss,bss,xmemory ; variables no inicializadas en la memoria de datos x variable:.spce 4 ; se reserva 4 bytes .section .xdata,data,xmemory : variables inicializadas en la memoria de datos x var: .hword 0x1111,0x2222,0x3333,0x2376 ; hword hace que las variables introducidas sean colocadas en forma consecutiva. .section
.ybss,bss,ymemory ; variables no inicializadas en la memoria de datos y var: .space 8 ; se reserva 8 bytes .section .ydata,data,ymemory : variables inicializadas en la memoria de datos y matriz: .hword 0x1411,0x2522,0x3339,0x2376 .section .nbss,bss,near var: .space 8 ; se reserva 8 bytes no inicializados en memoria near Para llamar a subrutinas procedemos asi: .global _main .text _main: mov #0x00FF,W0 ; W0= 0X00FF mov #0xFF00,W1 ; W1= 0xFF00 mov #0xFFFF,W2 ; W2=0xFFFF call subrutina goto main subrutina: mov W0,W3 ;W3=0x00FF mov W1,W4 ;W4=0x00FF mov W2,W5 ; W5=0xFFFF clr W0 ; W0=0x0000 clr W1 ; W1=0x0000 clr W2 ; W2=0x0000 return .end