PIC + CAN BUS + C

Diskuze a poradna o programátorech a programování různých obvodů

Moderátor: Moderátoři

Odpovědět
Zpráva
Autor
Uživatelský avatar
steve22184
Příspěvky: 18
Registrován: 11 pro 2008, 01:00

PIC + CAN BUS + C

#1 Příspěvek 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.

Uživatelský avatar
mtajovsky
Příspěvky: 3694
Registrován: 19 zář 2007, 02:00
Bydliště: Praha

#2 Příspěvek 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.

Uživatelský avatar
steve22184
Příspěvky: 18
Registrován: 11 pro 2008, 01:00

#3 Příspěvek 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:

Odpovědět

Zpět na „Programování PIC, ATMEL, EEPROM a dalších obvodů“