Autor Tema: Proyecto MPLAB  (Leído 3218 veces)

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

Desconectado zer0007

  • PIC16
  • ***
  • Mensajes: 106
Proyecto MPLAB
« 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

Desconectado MGLSOFT

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 7912
RE: Proyecto MPLAB
« Respuesta #1 en: 09 de Diciembre de 2004, 16:21:00 »
Porque no pones el o los archivos y tal ves sea mas facil ayudarte...GiñoGiño
Todos los dias aprendo algo nuevo, el ultimo día de mi vida aprenderé a morir....
Mi Abuelo.

Desconectado pikman

  • Moderador Local
  • PIC24F
  • *****
  • Mensajes: 679
RE: Proyecto MPLAB
« Respuesta #2 en: 09 de Diciembre de 2004, 17:43:00 »
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
saludos
PikMan

Desconectado juanelete

  • PIC12
  • **
  • Mensajes: 74
RE: Proyecto MPLAB
« Respuesta #3 en: 09 de Diciembre de 2004, 19:03:00 »
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 Sonrisa

Desconectado zer0007

  • PIC16
  • ***
  • Mensajes: 106
RE: Proyecto MPLAB
« Respuesta #4 en: 10 de Diciembre de 2004, 00:32:00 »
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.

Desconectado oshow

  • PIC18
  • ****
  • Mensajes: 321
RE: Proyecto MPLAB
« Respuesta #5 en: 10 de Diciembre de 2004, 08:36:00 »
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.

Desconectado juanelete

  • PIC12
  • **
  • Mensajes: 74
RE: Proyecto MPLAB
« Respuesta #6 en: 10 de Diciembre de 2004, 19:55:00 »
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 Giño

Desconectado juanelete

  • PIC12
  • **
  • Mensajes: 74
RE: Proyecto MPLAB
« Respuesta #7 en: 10 de Diciembre de 2004, 20:29:00 »
Hola de nuevo:

Es que me llamaba "la parienta" y he tenido que abreviar. Sonrisa Gigante

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 Sonrisa

Desconectado zer0007

  • PIC16
  • ***
  • Mensajes: 106
RE: Proyecto MPLAB
« Respuesta #8 en: 13 de Diciembre de 2004, 00:23:00 »
Gracias y lo pruebo luego.

Desconectado zer0007

  • PIC16
  • ***
  • Mensajes: 106
RE: Proyecto MPLAB
« Respuesta #9 en: 13 de Diciembre de 2004, 02:32:00 »
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 Rebotado
ahora a tocar el codigo a ver si logro aprender algo, gracias a todos y os mantendre informados

Desconectado Andres71

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 149
Re: RE: Proyecto MPLAB
« Respuesta #10 en: 08 de Agosto de 2008, 16:55:14 »
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?
"Dice mas el necio cuando calla, que el sabio cuando habla"

ANDRES ALEGRIA
alegriaandres@gmail.com
andresalegria@hotmail.com

Desconectado doppel

  • Moderadores
  • PIC24H
  • *****
  • Mensajes: 1534
Re: Proyecto MPLAB
« Respuesta #11 en: 08 de Agosto de 2008, 18:07:02 »
Hola Andrés71

has escrito en un tema que tiene casi 4 años de antiguedad  :(
dificilmente te respondan


saludos
Hernán
" Para ser exitoso no tienes que hacer cosas extraordinarias. Haz cosas ordinarias, extraordinariamente bien "