пример, но для пик. Но смысл тот же 3 define нужно поправить(+)
(«Телесистемы»: Конференция «Микроконтроллеры и их применение»)

миниатюрный аудио-видеорекордер mAVR

Отправлено abivan 03 апреля 2003 г. 10:32
В ответ на: Вопрос знатокам Си... отправлено IgorB 03 апреля 2003 г. 09:53

Главное адрес порта передать и адрес бита, чтобы маску сделать.
malloc использую свой простой рукописный. Можно под контекст буфер статиком забить, но указатель на контекст глобальным держать нужно. Чтобы к модулю можно было обратиться из любой функции.



#define ptr char*

//для синхронного USART
#define AdcData_DirAddr PORTBIT(TRISC, 0)
#define AdcData_Addr PORTBIT(PORTC, 0)
#define AdcClk_Addr PORTBIT(PORTA, 4)

static bit AdcData_Dir @ AdcData_DirAddr;
static bit AdcData @ AdcData_Addr;
static bit AdcClk @ AdcClk_Addr;

char *pADCContext;


int main(){
rcode rc;

pADCContext = ADA_CreateContext( AdcData_DirAddr, AdcData_Addr,
AdcClk_Addr, ADA_DELAY);

ADA_SetContext(pADCContext);
rc=ADA_Recive((ptr)&Res, sizeof(t_UAdcResOut));

}

//Это модуль обмена....

typedef struct{
ptr pDirData;
ptr pData;
BYTE bMaskData;

ptr pClk;
BYTE bMaskClk;

BYTE bDelay;
}t_ADAContext;

static t_ADAContext ADAContext;

/****************************************************************/
/* Имя ADA_CreateContext */
/* */
/* Тип Модуль АЦП-ЦАП библиотеки */
/* */
/* Назначение Захватывает память размером sizeof(t_ADAContext)*/
/* Создает контекст расположения линий обмена с */
/* модулем и частоту этого обмена. */
/*==============================================================*/
/* */
/**/ ptr /**/
/* Код возврата : */
/* Указатель на созданный контекст */
/* - нормальное завершение */
/* NULL - отсутствует свободная память */
/* */
/**/ ADA_CreateContext(unsigned uDataDirAddr, /**/
/**/ unsigned uDataAddr, unsigned uClkAddr, BYTE bDelay)/**/
/* */
/* uDataDirAddr - Адрес бита управления линией данных */
/* uDataAddr - Адрес бита линии данных */
/* uClkAddr - Адрес бита управления линией клоков */
/* bDelay - Длительность периода клоков T=2*bDelay */
/* Скважность 1/2 */
/* */
/****************************************************************/
{

t_ADAContext *p;

p=(t_ADAContext*)malloc(sizeof(t_ADAContext));
if(!p) return(NULL);
p->bMaskData=1<<(uDataAddr&0x7);
p->bMaskClk=1<<(uClkAddr&0x7);

p->pClk=(ptr)(uClkAddr>>3);
p->pData=(ptr)(uDataAddr>>3);

p->pDirData=(ptr)(uDataDirAddr>>3);

p->bDelay=bDelay;
return((ptr)p);
}

/*******************************************************/
/* Имя ADA_SetContext */
/* */
/* Тип Модуль АЦП-ЦАП библиотеки */
/* */
/* Назначение Установить контекст для данного модуля */
/*=====================================================*/
/* */
/**/ void /**/
/* */
/**/ ADA_SetContext(ptr p) /**/
/* */
/* p - Указатель на устанавливаемый контекст */
/* */
/*******************************************************/
{
memcpy(&ADAContext,p,sizeof(t_ADAContext));
}

/*******************************************************/
/* Имя ADA_Recive */
/* */
/* Тип Модуль АЦП-ЦАП библиотеки */
/* */
/* Назначение Получить N байт от модуля */
/* */
/*=====================================================*/
/* */
/**/ rcode /**/
/* Код возврата : */
/* Количество прочитанных байт */
/* - нормальное завершение */
/* ADA_r_ERROR_BAD_FRAME - Ошибка приема фрейма */
/* Возникает при: */
/* - длине посылки большей размера буфера приема*/
/* - неверной КС */
/* ADA_r_ERROR_COME - Ошибка модуля. */
/* Тип ошибки в errno */
/* */
/**/ ADA_Recive(ptr pData, BYTE bSize) /**/
/* */
/* pData - Указатель на буфер для приема данных */
/* bSize - Размер приемного буфера */
/* */
/*******************************************************/
{
BYTE i, bAddr, bBuff;
BYTE bRcSize;
t_sCRC CRC, CRC1;

*ADAContext.pDirData |= ADAContext.bMaskData;
bRcSize=GetByte();
if(!bRcSize)
return(ADA_r_ERROR_BAD_FRAME);
bRcSize--;
bAddr=GetByte(); // Read AddrByte
CRC=CalcSimpleCRC(&bAddr, sizeof(bAddr), SMPCRCNULL);
if(pData==NULL){
if(bRcSize>sizeof(bBuff))
return(ADA_r_ERROR_BAD_FRAME);
pData=&bBuff;
}else if(bRcSize>bSize)
return(ADA_r_ERROR_BAD_FRAME);

for(i=0; i pData[i]=GetByte();
CRC1=GetByte();
CRC=CalcSimpleCRC(pData, bRcSize, CRC);
if(CRC1!=CRC) return(ADA_r_ERROR_BAD_FRAME);
if( ((t_CmdAddr*)&bAddr)->ErrBit ){
errno=pData[0];
return(ADA_r_ERROR_COME);
}
errno=EZERO;
return(bRcSize);
}

static BYTE GetByte(){
BYTE i=8, bByte=0;
do{
*ADAContext.pClk|=ADAContext.bMaskClk;
ADADelay(ADAContext.bDelay);
bByte>>=1;
if(*ADAContext.pData & ADAContext.bMaskData) bByte|=0x80;
*ADAContext.pClk &= ~ADAContext.bMaskClk;
ADADelay(ADAContext.bDelay);
}while(--i);
return(bByte);
}


Всего, Иван.

Составить ответ  |||  Конференция  |||  Архив

Ответы



Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание  |||  Без кадра

E-mail: info@telesys.ru