I'm not that much into assemler, so I try to reuse existing asm-code as i2c-driver. I've found original Philips code for that. I try now to link it with c-code but get always linker warnings. Any help appreciated!
NAME . . . . . . . . . USAGE MODULE NAMES -------------------------------------------- ?C_START . . . . . . . CODE; ** L51 GENERATED ** ?C_STARTUP ?C_STARTUP . . . . . . CODE; ?C_STARTUP ASMS ?IIC_TEST_DEVICE . . . CODE; IIC_DRIVER ?IIC_TEST_DEVICE?BYTE. DATA; IIC_DRIVER ?INIT_IIC?BYTE . . . . DATA; IIC_DRIVER ?_IIC_WRITE_SUB?BYTE . ILLEGAL ** UNRESOLVED ** ASMS IIC_ERROR. . . . . . . BIT; IIC_DRIVER MAIN . . . . . . . . . CODE; ASMS _IIC_WRITE_SUB . . . . ILLEGAL ** UNRESOLVED ** ASMS _INIT_IIC. . . . . . . CODE; IIC_DRIVER ASMS *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: _IIC_WRITE_SUB MODULE: asms.obj (ASMS) *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL SYMBOL: ?_IIC_WRITE_SUB?BYTE MODULE: asms.obj (ASMS) *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: ?_IIC_WRITE_SUB?BYTE MODULE: asms.obj (ASMS) ADDRESS: 0277H *** WARNING L2: REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _IIC_WRITE_SUB MODULE: asms.obj (ASMS) ADDRESS: 027FH
#include <REG552.H> #include "iic.h" #define myIICaddr 0x55 // my own i2c slave address /*------------------------------------------------ MAIN C Function ------------------------------------------------*/ void main (void) { unsigned char reg = 0; // Init routines Init_IIC(myIICaddr); // set control-register: stop counting, enable alarm reg = 0xC4; if(IIC_Write_Sub(RTC_ADDRESS, 1, , 0x00) != I2C_OK) { // error } while (1) { ; } }
$LIST $REGISTERBANK (0,1) $NOSYMBOLS $PAGEWIDTH (130) NAME IIC_DRIVER ; ; Includes: EQREG652.ASM ; $NOLIST $INCLUDE (EQREG652.ASM) $LIST ; ; Public labels defined in this Module: ; ************************************* public ?IIC_Test_Device public ?IIC_Test_Device?BYTE public _Init_IIC public ?Init_IIC?BYTE ; $EJECT ; ...snipp... ?BI?IICBit Segment Bit Rseg ?BI?IICBit ; public IIC_Error IIC_Error: dbit 1 ; IIC Error Bit ; ?BA?IICBitAdr Segment Data BitAddressable Rseg ?BA?IICBitAdr ; IICCntrl: ds 1 ; Bit Addressable IIC Control Register ; ?DT?IICPar Segment Data Rseg ?DT?IICPar ?IIC_Test_Device?BYTE: ?IIC_Write?BYTE: ?Init_IIC?BYTE: ; SlaveAddress: ds 1 ; Slave Address Include R/W DataCount1: ds 1 ; Block 1 Count DataIndex1: ds 1 ; Block 1 Transfer Buffer Address SubAddress: ds 1 ; Sub Address ( If Any ) DataCount2: ds 1 ; Block 2 Count DataIndex2: ds 1 ; Block 2 Transfer Buffer Address ; $EJECT ; $EJECT IICCode Segment Code InBlock Rseg IICCode ; ...snipp... ***************************************************************** ; * Init_IIC: * ; * PROCEDURE ( OwnSlaveAddress ) ; * ; * DECLARE OwnSlaveAddress BYTE ; * ; * * ; * Initialises the IIC SIO1 data, sets the Own Slave Address * ; * * ; * NOTE: This procedure must be called * ; * after power on before use of any other IIC procedure * ; ***************************************************************** _Init_IIC: mov s1adr,SlaveAddress ; Setup Own Slave Address mov s1con,#NSTA_NSTO_AA ; Assert Acknowledge on Slave Address mov IICCntrl,#0 ; Initialise Control / Status Register setb es1 ; Enable SIO1 Interrupt
Even though all your fine input, I still believe it must be something with syntax or asm <-> c-code. When I look at the map file generatet I see the the functions public and later illegal:
B:0022H.1 SEGMENT IICBIT D:0020H SEGMENT IICBITADR D:0010H SEGMENT IICPAR C:10F6H SEGMENT IICCODE C:164DH SEGMENT IICINITCODE C:165BH SEGMENT IICINTCODE C:0E00H SEGMENT IICINTSTATES C:1117H PUBLIC ?IIC_READ D:0010H PUBLIC ?IIC_READ?BYTE C:1111H PUBLIC ?IIC_READ_STATUS D:0010H PUBLIC ?IIC_READ_STATUS?BYTE C:1101H PUBLIC ?IIC_READ_SUB D:0010H PUBLIC ?IIC_READ_SUB?BYTE C:10F6H PUBLIC ?IIC_TEST_DEVICE D:0010H PUBLIC ?IIC_TEST_DEVICE?BYTE C:110DH PUBLIC ?IIC_WRITE D:0010H PUBLIC ?IIC_WRITE?BYTE C:10FDH PUBLIC ?IIC_WRITE_MEMORY D:0010H PUBLIC ?IIC_WRITE_MEMORY?BYTE C:1105H PUBLIC ?IIC_WRITE_SUB D:0010H PUBLIC ?IIC_WRITE_SUB?BYTE C:1122H PUBLIC ?IIC_WRITE_SUB_READ D:0010H PUBLIC ?IIC_WRITE_SUB_READ?BYTE C:1109H PUBLIC ?IIC_WRITE_SUB_SWINC D:0010H PUBLIC ?IIC_WRITE_SUB_SWINC?BYTE C:111EH PUBLIC ?IIC_WRITE_SUB_WRITE D:0010H PUBLIC ?IIC_WRITE_SUB_WRITE?BYTE C:164DH PUBLIC ?INIT_IIC D:0010H PUBLIC ?INIT_IIC?BYTE B:0022H.1 PUBLIC IIC_ERROR ...snipp... INTER-MODULE CROSS-REFERENCE LISTING ------------------------------------ NAME . . . . . . . . . . . USAGE MODULE NAMES ------------------------------------------------ ...snipp... ?IIC_READ. . . . . . . . . CODE; IIC ?IIC_READ?BYTE . . . . . . DATA; IIC ?IIC_READ_STATUS . . . . . CODE; IIC ?IIC_READ_STATUS?BYTE. . . DATA; IIC ?IIC_READ_SUB. . . . . . . CODE; IIC ?IIC_READ_SUB?BYTE . . . . DATA; IIC PAGE RTC ?IIC_TEST_DEVICE . . . . . CODE; IIC ?IIC_TEST_DEVICE?BYTE. . . DATA; IIC ?IIC_WRITE . . . . . . . . CODE; IIC ?IIC_WRITE?BYTE. . . . . . DATA; IIC ?IIC_WRITE_MEMORY. . . . . CODE; IIC ?IIC_WRITE_MEMORY?BYTE . . DATA; IIC ?IIC_WRITE_SUB . . . . . . CODE; IIC ?IIC_WRITE_SUB?BYTE. . . . DATA; IIC RTC ?IIC_WRITE_SUB_READ. . . . CODE; IIC ?IIC_WRITE_SUB_READ?BYTE . DATA; IIC ?IIC_WRITE_SUB_SWINC . . . CODE; IIC ?IIC_WRITE_SUB_SWINC?BYTE. DATA; IIC ?IIC_WRITE_SUB_WRITE . . . CODE; IIC ?IIC_WRITE_SUB_WRITE?BYTE. DATA; IIC ?INIT_IIC. . . . . . . . . CODE; IIC ?INIT_IIC?BYTE . . . . . . DATA; IIC ASMS ...snipp... IIC_ERROR. . . . . . . . . BIT; IIC IIC_READ_SUB . . . . . . . ILLEGAL ** UNRESOLVED ** PAGE RTC IIC_WRITE_SUB. . . . . . . ILLEGAL ** UNRESOLVED ** RTC INITLCD. . . . . . . . . . CODE; LCD ASMS INIT_GLOBALS . . . . . . . CODE; RTC ASMS INIT_IIC . . . . . . . . . ILLEGAL ** UNRESOLVED ** ASMS
The error messages you listed before are telling you that the _IIC_WRITE_SUB function and its argument space (?_IIC_WRITE_SUB?BYTE) were not found. I don't see them in the listing you posted. I do see ?IIC_WRITE_SUB and ?IIC_WRITE_SUB?BYTE but these are not the same. Also, the unresolved symbols in this listing: IIC_READ_SUB, IIC_WRITE_SUB, and INIT_IIC are not included in the listing. ?IIC_READ_SUB, ?IIC_WRITE_SUB, and ?IIC_INIT are included, but these names do not match. Jon