Sie sind auf Seite 1von 5

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 ; mueve el contenido de W1 a W2


MOV W5, TRISA ; mueve el contenido de W5 a TRISA
MOV W0,[W1] ; 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