Autor Tema: incluir código en ensamblador en un código en C  (Leído 1674 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado ochi

  • PIC10
  • *
  • Mensajes: 48
incluir código en ensamblador en un código en C
« 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

Desconectado gera

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2188
Re: incluir código en ensamblador en un código en C
« Respuesta #1 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!

"conozco dos cosas infinitas: el universo y la estupidez humana. Y no estoy muy seguro del primero." A.Einstein

Desconectado firepic

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1130
    • JC Servicios
Re: incluir código en ensamblador en un código en C
« Respuesta #2 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.
"Por la presunción solo se ocasiona una lucha, pero con los que consultan juntos hay sabiduría" (Proverbios 13:10).
Visita Mi Sitio Web