Stránka 1 z 1

PIC + CAN BUS + C

Napsal: 18 led 2010, 22:49
od steve22184
Zdravim, na stránkach Microchipu sa nachádza aplikačná poznámka AN878
http://www.microchip.com/stellent/idcpl ... e=en012117 Jedná sa o procesory PIC18F s integrovaným modulom CAN . Je tam na stiahnutie aj kód v Cčku. A o to mi ide, nemožem ho skompilovat. Skúšal som aj HI-TECH PICC18 kompilátor aj MICROCHIP C18 kompilátor, ale výsledok stále rovnaký. Oba prekladače hlásia rovnakú chybu:

Kód: Vybrat vše

Executing: "C:\Program Files\HI-TECH Software\PICC-18\PRO\9.63\bin\picc18.exe" -C -E"ECANDemo.cce" "ECANDemo.c" -O"ECANDemo.obj" -Q -MPLAB -18F8680
Executing: "C:\Program Files\HI-TECH Software\PICC-18\PRO\9.63\bin\picc18.exe" -C -E"ECAN.cce" "ECAN.c" -O"ECAN.obj" -Q -MPLAB -18F8680
Skipping link step.  Not all sources built successfully.
BUILD FAILED: Mon Jan 18 22:04:11 2010
Nie je mi jasné prečo prekladač nehlási nieakú konkrétnu chybu. V zdrojovom texte som našiel pasáže, ktorým moc nerozumiem, napríklad:

Kód: Vybrat vše

 #define _SetStdRXFnValue(f, val)
    ##f##SIDH = (long)ECAN_##f##_VAL >> 3L;
    ##f##SIDL = (long)ECAN_##f##_VAL >> 5L

#define _SetXtdRXFnValue(f, val)
    ##f##SIDH = (long)ECAN_##f##_VAL >> 21L;
    ##f##SIDL = (((long)ECAN_##f##_VAL >> 13L) & 0xe0) |
                    ((long)(ECAN_##f##_VAL) & 0x03L)   |
                    0x08;               
    ##f##EIDH = (long)ECAN_##f##_VAL >> 8L;
    ##f##EIDL = ECAN_##f##_VAL;


#define _SetStdRXMnValue(m, val)  
    RXM##m##SIDH = (long)ECAN_RXM##m##_VAL >> 3L;   
    RXM##m##SIDL = (long)ECAN_RXM##m##_VAL >> 5L

#define _SetXtdRXMnValue(m, val)               
    RXM##m##SIDH = (long)ECAN_RXM##m##_VAL >> 21L;  
    RXM##m##SIDL = (((long)ECAN_RXM##m##_VAL >> 13L) & 0xe0) | 
                    ((long)(ECAN_RXM##m##_VAL) & 0x03L);
    RXM##m##EIDH = (long)ECAN_RXM##m##_VAL >> 8L;
    RXM##m##EIDL = ECAN_RXM##m##_VAL;
Čo znamenajú tie "dvojité mriežky" nieako sa nemožem toho dopátrať, lebo editor MPLABU to zobrauje načerveno a to znamená zlý zápis (syntax)!? Alebo je to nieaká špecialitka fakt neviem. Porposil by som niekoho skúsenejšieho o vysvetlenie, prípadne o rozbehnutie toho demo kódu. Vopred ďakujem.

Napsal: 19 led 2010, 00:08
od mtajovsky
## je operátor preprocessoru C k připojování parametrů makra definovaného direktivou #define. Příklad:

// definice makra
#define MOJEMAKRO(polozka, ident) \
case ident: \
polozka##_##ident = ident;\
break

// pouziti makra
switch(x) {
MOJEMAKRO(soucast, 99);
}

Pak preprocessor před překladem expanduje řádek:

MOJEMAKRO(soucast, 99);

na kód:

case 99:
soucast_99 = 99;
break;

a tento výsledný text se předá překladači. Uzavírací středník můžete dát buď do definice makra nebo do kódu, což působí konformnějším dojmem, ale je to jinak jedno.

Co je mi divné, že v těch vašich makrech je parametr val malým písmem a v těle definice makra velkým a navíc s podtržítkem. Třeba preprocessor Visual C++ to považuje za něco jiného a parametr pak nedosadí. Stejně se chová Borland.

Napsal: 19 led 2010, 23:20
od steve22184
Tak už som to trochu pochopil, to som nevedel ža takto sa pripájajú parametre makrám, vďaka za vysvetlenie. Už sa mi to podarilo aj skompilovať. Ten kód je ok, ja som mal zle nastavené parametre prekladača :oops: