TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado 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
-
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!
-
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:
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.