TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: ochi en 11 de Junio de 2008, 06:23:58

Título: incluir código en ensamblador en un código en C
Publicado por: ochi en 11 de Junio de 2008, 06:23:58
hola, estoy intentando utilizar la memoria EPROM  de mi dspic, en el datasheet de este me viene el código en ensamblador de las funciones de lectura y escritura y estoy tratando de hacerme una librería (eprom.h) con estas funciones para poder utilizarlas. esto es lo que me pone:

EXAMPLE 6-1: DATA EEPROM READ

MOV #LOW_ADDR_WORD,W0 ; Init Pointer
MOV #HIGH_ADDR_WORD,W1
MOV W1,TBLPAG
TBLRDL [ W0 ], W4 ; read data EEPROM

EXAMPLE 6-4: DATA EEPROM WORD WRITE

; Point to data memory
MOV #LOW_ADDR_WORD,W0 ; Init pointer
MOV #HIGH_ADDR_WORD,W1
MOV W1,TBLPAG
MOV #LOW(WORD),W2 ; Get data
TBLWTL W2,[ W0] ; Write data
; The NVMADR captures last table access address
; Select data EEPROM for 1 word op
MOV #0x4004,W0
MOV W0,NVMCON
; Operate key to allow write operation
DISI #5 ; Block all interrupts with priority <7 for
; next 5 instructions
MOV #0x55,W0
MOV W0,NVMKEY ; Write the 0x55 key
MOV #0xAA,W1
MOV W1,NVMKEY ; Write the 0xAA key
BSET NVMCON,#WR ; Initiate program sequence
NOP
NOP
; Write cycle will complete in 2mS. CPU is not stalled for the Data Write Cycle
; User can poll WR bit, use NVMIF or Timer IRQ to determine write complete


Entonces lo que hago es definirme :

unsigned int leeEprom (unsigned int direccion){

   char dirAlta, dirBaja;
   dirAlta = (char)(direccion >> 8);
   dirBaja = (char)(direccion & 0x00ff);
        asm(todo el código de lectura);
}




void escribeEprom (unsigned int direccion, unsigned int dato){

   char dirAlta, dirBaja;
   char datoAlto, datoBajo;
   dirAlta = (char) (direccion >> 8);
   dirBaja = (char) (direccion & 0x00ff);
   datoAlto = (char) (direccion >> 8);
   datoBajo = (char) (direccion & 0x00ff);
        asm(todas las instrtucciones de escritura);
}


pero me da errores de compilación por todos lados, me dice qeu no sabe lo que es W0 y W1, pero eso son registros internos del dspic. ¿Alguna idea de mi error? Muchas gracias
Título: Re: incluir código en ensamblador en un código en C
Publicado por: gera en 11 de Junio de 2008, 11:35:25
qué compilador estas usando? Para empotrar código en asm se usan las directivas:
//código en C
#asm
//código en asm
#endasm
//sigue código en C.

El hecho que no reconozca los registros que decís, quizás se debe a que no incluiste las librerías necesarias que contienen las definiciones de tales registros. Lo que podrías hacer es, con datasheet en mano, definir vos mismo el registro.
Suerte!
Título: Re: incluir código en ensamblador en un código en C
Publicado por: firepic en 11 de Junio de 2008, 18:35:42
Saludos!
Bueno creo que ya tu inquietud te la respondió gera, cierto ochi?
Lo único que te quería mencionar era que trata de usar siempre la herramienta "código" al colocar código, y valga la redundancia.
Esa herramienta es la que está como un "#" en la parte superior.

De esa forma, por ejemplo se escribiría:
Código: [Seleccionar]
dirAlta = (char) (direccion >> 8);
Muy diferente si escribes:
dirAlta = (char) (direccion >> 8);

Es decir, para evitar que salgan esos muñequitos en el código donde no deben.
Ok saludos, nos leemos!  :mrgreen:

P.D. mejor aún, puedes usar la herramienta de código C, donde dice GeSHi, le cambias a C, y así te reconocerá las instrucciones y las pintará con colorcito y todo.