TODOPIC
Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: zer0007 en 09 de Diciembre de 2004, 05:04:00
-
Estoy probando un poyecto para CCS (algoritmo de KEELOQ para CCS de Microchip) y tengo un problema: las variables que estan declaradas en otros .c del proyecto no me las reconoce en los .c en que se usan y (claro esta) no estan declaradas, por que es eso ¿? Gracias
-
Porque no pones el o los archivos y tal ves sea mas facil ayudarte...

-
OK, como dice Marcos seria bueno ver los archivos, yo compile en una oportunidad una AN de microchip escrita por un tal Lucio, y estaba hecho para CCS pero en una version muy vieja, pero la pude compilar lo que si te puedo decir es que nunca la use pues no pude hacerme de los encoders, creo que me anduvo con la version 3.094 del PCW
saludos
ARIEL
-
Hola
Prueba a declararlas otra vez en el modulo que te interese, pero utilizando el modificador extern.
modulo 1:
int x; //aqui esta declarada realmente
funcion()
{
...
}
------------------------------
modulo 2:
extern int x; //Le indica al compilador que ya esta declarada en otro modulo
main()
{
...
}
Saludos
-
El primer error que me da es: Undefined identifier DKEY
fastdecc.c
//-------------------------------------------------------------------------
// Keeloq Decryption Algorithm
//
// optimized for CCS PIC C compiler v. 2.535
//
// version 1.00 08/07/2000 Lucio Di Jasio
//
//=========================================================================
#include "decccs.h"
byte aux;
void Decrypt()
{
byte i, j, key;
sbyte p;
p = 1;
for (j=66; j>0; j--)
{
key = DKEY[p--]; ERROR !!!
if (p<0)
p+=8;
for (i=8; i>0; i--)
{
// NLF
if ( BIT_TEST( Buffer[3],6))
{
if ( !BIT_TEST( Buffer[3],1))
aux = 0b00111010; // 10
else
aux = 0b01011100; // 11
}
else
{
if ( !BIT_TEST( Buffer[3],1))
aux = 0b01110100; // 00
else
aux = 0b00101110; // 01
}
// move bit in position 7
if ( BIT_TEST( Buffer[2],3))
#asm
swapf aux,f
#endasm
if ( BIT_TEST( Buffer[1],0))
aux<<=2;
if (BIT_TEST( Buffer[0],0))
aux<<=1;
// xor with Buffer and Dkey
aux ^= Buffer[1] ^ Buffer[3] ^ key;
// shift in buffer
shift_left( Buffer, 4, BIT_TEST( aux,7));
key<<=1;
} // for i
} // for j
} // decrypt
En cambio esta declarada en
//-------------------------------------------------------------------------
//
// Keeloq Normal Key Generation and Decryption
// Compiled using CCS PIC C compiler v. 2.535
//
// version 1.00 08/07/2000 Lucio Di Jasio
//
//=========================================================================
#include "fastdecc.c" // for CCS optimized version
byte DKEY[8]; // Decryption key DECLARACION
byte SEED[4]; // seed value = serial number
word NextHop; // resync value for 2 Chance
//----------------------------------------------------------------------
void LoadManufCode()
{
DKEY[0]=0xef; // DKEY=0123456789ABCDEF
DKEY[1]=0xcd;
DKEY[2]=0xAB;
DKEY[3]=0x89;
DKEY[4]=0x67;
DKEY[5]=0x45;
DKEY[6]=0x23;
DKEY[7]=0x01;
}
//----------------------------------------------------------------------
//
// Key Generation routine
//
// Normal Learn algorithm
//
// INPUT: Serial Number (Buffer[4..7])
// Manufacturer code
// OUTPUT: DKEY[0..7] computed decryption key
//
void NormalKeyGen()
{
byte HOPtemp[4]; // HOP temp buffer
byte SKEYtemp[4]; // temp decryption key
// check if same Serial Number as last time while output active
// it was stored in Seed
if (( SEED[0] != Buffer[4]) ||
( SEED[1] != Buffer[5]) ||
( SEED[2] != Buffer[6]) ||
( SEED[3] != (Buffer[7] & 0x0f)) ||
(COut == 0))
{
// no new KeyGen is needed
memcpy( HOPtemp, Buffer, 4); // save hopping code to temp
memcpy( SEED, &Buffer[4], 4); // make seed = Serial Number
SEED[3] &= 0x0f; // mask out function codes
// compute LSb of decryption key first
memcpy( Buffer, SEED, 4); // get SEED in
Buffer[3] |= 0x20; // add constant 0x20
LoadManufCode();
Decrypt();
memcpy( SKEYtemp, Buffer, 4); // save result for later
// compute MSb of decryption key
memcpy( Buffer, SEED, 4); // get SEED in
Buffer[3] |= 0x60; // add constant 0x60
LoadManufCode();
Decrypt();
memcpy( &DKEY[4], Buffer, 4); // move it into DKEY MSb
memcpy( DKEY, SKEYtemp, 4); // add LSb
// ready for Decrypt
memcpy( Buffer, HOPtemp, 4); // restore hopping code
}
else // same Serial Number as last time...
{ // just keep on using same Decription Key
}
} // Normal KeyGen
//----------------------------------------------------------------------
//
// Valid Decryption Check
//
// INPUT: Serial Number (Buffer[4..7])
// Hopping Code (Buffer[0..3])
// OUTPUT: TRUE if discrimination bits == lsb Serial Number
// and decrypted function code == plain text function code
byte DecCHK()
{
// verify discrimination bits
if ( DisLo != IDLo) // compare low 8bit of Serial Number
return FALSE;
if ( ( (Buffer[3] ^ IDMi) & 0x3)!= 0) // compare 9th and 10th bit of SN
return FALSE;
// verify function code
if ( ((Buffer[3] ^ Buffer[7]) & 0xf0)!= 0)
return FALSE;
return TRUE;
} // DecCHK
//----------------------------------------------------------------------
//
// Hopping Code Verification
//
// INPUT: Hopping Code (Buffer[0..3])
// and previous value stored in EEPROM EHop
// OUTPUT: TRUE if hopping code is incrementing and inside a safe window (16)
//
byte ReqResync()
{
F2Chance= TRUE; // flag that a second (sequential) transmission
NextHop = Hop+1; // is needed to resynchronize receiver
return FALSE; // cannot accept for now
}
byte HopCHK()
{
FHopOK = FALSE; // Hopping Code is not verified yet
FSame = FALSE; // Hopping Code is not the same as previous
// make it a 16 bit signed integer
Hop = ((word)HopHi << 8) + HopLo;
if ( F2Chance)
if ( NextHop == Hop)
{
F2Chance = FALSE; // resync success
FHopOK = TRUE;
return TRUE;
}
// verify EEPROM integrity
if ( EHop != ETemp)
return ReqResync(); // memory corrupted need a resync
// main comparison
ETemp = Hop - EHop; // subtract last value from new one
if ( ETemp < 0) // locked region
return FALSE; // fail
else if ( ETemp > 16) // resync region
return ReqResync();
else // 0>= ETemp >16 ; open window
{
if ( ETemp == 0) // same code (ETemp == 0)
FSame = TRUE; // rise a flag
FHopOK = TRUE;
return TRUE;
}
} // HopCHK
Creo que conpila los .c por orden alfabetico y no coje primero el main y compila a partir de ahí, alguien sabe una solucion mas "elegante" que el extern ?
Gracias por vuestra respusto, es el AN744, no me lo deja subir por que dice que no hay suficiente espacio (134K"s en un rar ¿?)
Gracias otra vez.
-
Como tienes configurado el ccs??, es decir, en el menú "Options-->Include dirs" tienes puesto el directorio donde se encuentran los ficheros de los includes, no?
Prueba también a poner en los includes <nombrefichero> en lugar de "nombrefichero".
Son cosas básicas, lo sé, pero hay que preguntarlas al principio para asegurarse de que el compilador encuentra todos los ficheros a compilar, antes de meterse uno a revisar el código.
Otra cosilla (por favor no me lo tomes a mal) cuando dices "Creo que conpila los .c por orden alfabetico " estas totalmente equivocado, el compilador recoge los ficheros por orden de aparición en el programa, es decir si encuentra antes el fichero2.c que el fichero1.c se irá primero a por el fichero2.c y lo que hace es mezclar esos ficheros con el fichero principal (el fichero donde se incluye el main() ) para luego compilar todo el código fuente (nunca compila los archivos por separado) y obtener finalmente un .hex
Ya nos contarás.
Un saludo.
PD: Otra cosilla a costa de que me llameis tocapel.... si puedes mete el código con el boton parrilla que sale cuando posteas (#) así al meter el código se puede leer mejor ya que respeta la indentación.
PD2: En cuanto a lo de subir archivos al foro esta complicado, creo que el foro ha llegado al máximo de su capacidad y no deja adjuntar archivos. Lo que se suele hacer es subir el fichero a este subforo http://miarroba.com/foros/ver.php?id=348538 y publicar un enlace por aquí para que la gente pueda acceder al archivo.
-
Hola
El problema esta en que #include fuerza al compilador (antes de compilar) a incluir en el fichero fuente el fichero especificado en include.
#include "fastdecc.c" // for CCS optimized version
byte DKEY[8]; // Decryption key DECLARACION
byte SEED[4]; // seed value = serial number
Por lo tanto al incluirse "fastdecc.c" antes de la declaracion de la variable DKEY, el compilador se encuentra primero con:
for (j=66; j>0; j--)
{
key = DKEY[p--]; ERROR !!!
if (p<0)
p+=8;
Una variable que hasta el momento desconoce.
Esto se da con bastante frecuencia en desarrolos grandes de programas que implican varios modulos. La solucion correcta para estos casos es utilizar "extern".
Pero si a ti no te gusta o no te parece "elegante" puedes hacer otra cosa bastante sencilla (aunque menos ortodoxa):
byte DKEY[8]; // Decryption key DECLARACION
#include "fastdecc.c" // for CCS optimized version
byte SEED[4]; // seed value = serial number
Pon el include despues de la declaracion de la variable DKEY
...y problema resuelto.
Saludos
-
Hola de nuevo:
Es que me llamaba "la parienta" y he tenido que abreviar. 
Sigo:
Otra cosa que puedes hacer es colocar todas las variables "problematicas" en un fichero de cabezera.h e incluirlo al principio de todo.
Saludos
-
Gracias y lo pruebo luego.
-
Me ha compilado y lo he hecho poniendo como unico sourcefile el main.c ya eque este ya hacia las llamadas a los respectivos.c, y por lo menos ahora compila

ahora a tocar el codigo a ver si logro aprender algo, gracias a todos y os mantendre informados
-
Me ha compilado y lo he hecho poniendo como unico sourcefile el main.c ya eque este ya hacia las llamadas a los respectivos.c, y por lo menos ahora compila <img src="http://pics.miarroba.com/caretos/bounce.gif" alt="Rebotado" title="Rebotado" />
ahora a tocar el codigo a ver si logro aprender algo, gracias a todos y os mantendre informados
saludos, lograste hacerl funcionar el encoder? comentame yo estoy tratando de hacer lo mismo pero en ASM y me falta el archivo Fastdec.inc, te funciono?
-
Hola Andrés71
has escrito en un tema que tiene casi 4 años de antiguedad :(
dificilmente te respondan
saludos
Hernán