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

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

Отправлено :))) 23 января 2006 г. 21:15


//========================= IRCCD.H ===========================================/

#ifndef __IRCCD_H__
#define __IRCCD_H__

#define DEF_IRCCD_WaitEndTime 20
#define DEF_IRCCD_ScanData_MAX_SIZE 80
#define DEF_IRCCD_ScanData_MIN_SIZE 60

//#define DEF_IRCCD_INPUT__INT0
#define DEF_IRCCD_INPUT__INT1
//#define DEF_IRCCD_INPUT__INT0_1


#define DEF_IRCCD_ScanStart ~0
#define DEF_IRCCD_ScanEnd 0
extern unsigned char GLRI_IRCCD_EnableScanCard;
extern unsigned short GLF_IRCCD_Decode_ScanData(void);


extern void GLF_IRCCD_Enable(void);
extern void GLF_IRCCD_Disable(void);

extern unsigned char GLRI_IRCCD_ReaderNum;
extern unsigned short GLF_IRCCD_GetCardCode(void);

#endif //__IRCCD_H__

//-----------------------------------------------------------------------------/

//========================= IRCCD.C ===========================================/

#include "stdafx.h"
#include "IRCCD.h"

#define DEF_IRCCD_TactData_MAX_SIZE (DEF_IRCCD_ScanData_MAX_SIZE*2)

#pragma interrupt_handler timer0_ovf_isr:12
#pragma interrupt_handler int0_isr:2
#pragma interrupt_handler int1_isr:3

unsigned char GLRI_IRCCD_ReaderNum;
unsigned char GLRI_IRCCD_EnableScanCard=DEF_IRCCD_ScanEnd;

static unsigned char GLRI_IRCCD_TactData_Size;
static unsigned char GLAI_IRCCD_TactData[DEF_IRCCD_ScanData_MAX_SIZE];

static unsigned char GLRI_IRCCD_ScanData_Size;
static unsigned short GLAI_IRCCD_ScanData[128];

static unsigned char GLRI_IRCCD_Timer_10ms;


void GLF_IRCCD_Enable(void)
{
GLRI_IRCCD_ReaderNum=0;
#if defined (DEF_IRCCD_INPUT__INT0)
//PD2=========INT0===========
DDRD &= ~(1<<2);
MCUCR = 0x01;
GICR = 0x40;
//---------------------------
#elif defined (DEF_IRCCD_INPUT__INT1)
//PD3=========INT1===========
DDRD &= ~(1<<3);
MCUCR = 0x04;
GICR = 0x80;
//---------------------------
#elif defined (DEF_IRCCD_INPUT__INT0_1)

//PD2+PD3=====INT1+INT0======
DDRD &= ~((1<<2)|(1<<3));
MCUCR = 0x05;
GICR = 0xC0;
//---------------------------
#else
#error " Not Defined ICCD Input"
#endif

TCCR1B = 0x00; //stop
TCNT1 = 0; //setup
TCNT1L = 0x83;
OCR1AH = 0x00;
OCR1AL = 0x7D;
OCR1BH = 0x00;
OCR1BL = 0x7D;
ICR1H = 0x00;
ICR1L = 0x7D;
TCCR1A = 0x00;
TCCR1B = 0x03; //start Timer

TCCR0 = 0x00; //stop
TCNT0 = 0xB2; //set count
OCR0 = 0x4E; //set compare
TCCR0 = 0x05; //start timer
TIMSK |= 0x01; //timer interrupt sources

GLRI_IRCCD_ScanData_Size=0;
GLRI_IRCCD_EnableScanCard=DEF_IRCCD_ScanEnd;
}

void GLF_IRCCD_Disable(void)
{
GICR = 0x00;
TIMSK &= ~0x01;
}

void timer0_ovf_isr(void)
{
TCNT0 = 0xB2; //reload counter value
if(GLRI_IRCCD_Timer_10ms)--GLRI_IRCCD_Timer_10ms;
else {
GLRI_IRCCD_Timer_10ms = DEF_IRCCD_WaitEndTime;
if((GLRI_IRCCD_EnableScanCard==1)||(GLRI_IRCCD_EnableScanCard==2))
{ if((GLRI_IRCCD_ScanData_Size<=DEF_IRCCD_ScanData_MIN_SIZE)
||(GLRI_IRCCD_ScanData_Size>=DEF_IRCCD_ScanData_MAX_SIZE))
GLRI_IRCCD_EnableScanCard=DEF_IRCCD_ScanStart;
else
{
GLRI_IRCCD_ReaderNum=GLRI_IRCCD_EnableScanCard;
GLRI_IRCCD_EnableScanCard=DEF_IRCCD_ScanEnd;
}
}
}
}


void int0_isr(void)
{
if(GLRI_IRCCD_EnableScanCard==1)
{GLAI_IRCCD_ScanData[GLRI_IRCCD_ScanData_Size++&127]=TCNT1;
TCNT1 = 0; //reload counter value
GLRI_IRCCD_Timer_10ms = DEF_IRCCD_WaitEndTime;
}else if(PIND&(1<<2))if(GLRI_IRCCD_EnableScanCard==DEF_IRCCD_ScanStart)
{TCNT1 = 0; //reload counter value
GLRI_IRCCD_Timer_10ms = DEF_IRCCD_WaitEndTime;
GLRI_IRCCD_EnableScanCard=1;
GLRI_IRCCD_ScanData_Size=0;
}
}

void int1_isr(void)
{
if(GLRI_IRCCD_EnableScanCard==2)
{GLAI_IRCCD_ScanData[GLRI_IRCCD_ScanData_Size++&127]=TCNT1;
TCNT1 = 0; //reload counter value
GLRI_IRCCD_Timer_10ms = DEF_IRCCD_WaitEndTime; //reload value
}else if(PIND&(1<<3))if(GLRI_IRCCD_EnableScanCard==DEF_IRCCD_ScanStart)
{TCNT1 = 0; //reload counter value
GLRI_IRCCD_Timer_10ms = DEF_IRCCD_WaitEndTime; //reload value
GLRI_IRCCD_EnableScanCard=2;
GLRI_IRCCD_ScanData_Size=0;
}
}

static unsigned short IRCCD_Decode_TData(void)
{ unsigned short Retval=0,BitMask;
unsigned char START_Code[12]={1,1,1,0,0,1,0,1,1,0,1,0};
unsigned char END_Code[12]={1,0,1,0,1,0,1,0,0,1,1,1};
unsigned char ftmp,TD_Current;

for(TD_Current=0;TD_Current<12;TD_Current++)
{if((GLAI_IRCCD_TactData[TD_Current]&1)!=(START_Code[TD_Current]&1))return 0;
}

for( BitMask=1<<13;BitMask>0;BitMask>>=1)
{
if(GLAI_IRCCD_TactData[TD_Current++])//1
{// 0
if(GLAI_IRCCD_TactData[TD_Current++])return 0;
if(GLAI_IRCCD_TactData[TD_Current++]==0)return 0;
if(GLAI_IRCCD_TactData[TD_Current++])return 0;
}else
{// 1
if(GLAI_IRCCD_TactData[TD_Current++]==0)return 0;
if(GLAI_IRCCD_TactData[TD_Current++])return 0;
if(GLAI_IRCCD_TactData[TD_Current++]==0)return 0;
Retval|=BitMask;
}

}

for(ftmp=0;ftmp<12;ftmp++)
{ if((GLAI_IRCCD_TactData[TD_Current+ftmp]&1)!=(END_Code[ftmp]&1))return 0;
}

return(Retval);
}

unsigned short GLF_IRCCD_Decode_ScanData(void)
{
unsigned char START_SData,SD_current,TD_current,SD_ftmp,START_SData_Marker;
unsigned short CardCode;

if(GLRI_IRCCD_ScanData_Size>DEF_IRCCD_ScanData_MAX_SIZE)return 0;
if(GLRI_IRCCD_ScanData_SizeSTART_SData_Marker=0;

START___Marker:
if(START_SData_Marker) START_SData=0; else START_SData=1;

for(SD_ftmp=START_SData;SD_ftmp<10;SD_ftmp+=2)
if(GLAI_IRCCD_ScanData[SD_ftmp]>GLAI_IRCCD_ScanData[START_SData])START_SData=SD_ftmp;


GLRI_IRCCD_TactData_Size=0;
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=1;
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=1;
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=1;
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=0;
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=0;
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=1;
for(SD_current=START_SData+2+START_SData_Marker;SD_current<(GLRI_IRCCD_ScanData_Size-START_SData);SD_current++)
{

if((SD_current&1)==0)
{
if(((GLAI_IRCCD_ScanData[SD_current]/3)*4) {
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=1;
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=0;
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=0;
SD_current+=1;
}else
{ GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=1;
}
}else
{
if(((GLAI_IRCCD_ScanData[SD_current]/3)*4) {
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=0;
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=1;
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=1;
SD_current+=1;
}else
{GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=0;
}
}

}
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=1;
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=1;
GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size++]=1;

if(CardCode=IRCCD_Decode_TData())return CardCode;

if(GLRI_IRCCD_TactData_Size>DEF_IRCCD_TactData_MAX_SIZE) return 0;
for(TD_current=0;TD_current if(GLAI_IRCCD_TactData[TD_current]&1)GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size-TD_current-1]|=2;
else GLAI_IRCCD_TactData[GLRI_IRCCD_TactData_Size-TD_current-1]&=~2;

for(TD_current=0;TD_current<=GLRI_IRCCD_TactData_Size;TD_current++)
if(GLAI_IRCCD_TactData[TD_current]&2)GLAI_IRCCD_TactData[TD_current]=1;
else GLAI_IRCCD_TactData[TD_current]=0;

if(CardCode=IRCCD_Decode_TData())return CardCode;

if(START_SData_Marker)return(0);else{START_SData_Marker=1;goto START___Marker;}
}


unsigned short GLF_IRCCD_GetCardCode(void)
{
GLRI_IRCCD_EnableScanCard=DEF_IRCCD_ScanStart;
while(1)if(GLRI_IRCCD_EnableScanCard==DEF_IRCCD_ScanEnd)break;
return GLF_IRCCD_Decode_ScanData();
}

//-----------------------------------------------------------------------------/


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

Ответы



Rambler's Top100 Рейтинг@Mail.ru
Перейти к списку ответов  |||  Конференция  |||  Архив  |||  Главная страница  |||  Содержание

E-mail: info@telesys.ru