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

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

Отправлено DSN 12 марта 2004 г. 14:34
В ответ на: поделитесь плз. кодом на СИ для приема Манчестера// ОЧ НАДО. отправлено incognito 12 марта 2004 г. 13:11

для AT904433
вырезки кода обработки
//==========================================================
void Init(void)
{
WDTCR = 0x1F; // enable maximum WDT
//WDTCR = 0x17; // disable WDT

SREG = 0x00; ACSR = 0x00; //1000 0000
EECR = 0x00; EEDR = 0x00; EEAR = 0x00;
// ICR1L = 0x00; ICR1H = 0x00; OCR1L = 0x00; OCR1H = 0x00;
TCNT1L = 0x00; TCNT1H = 0x00; TCCR1B = 0x01; TCCR1A = 0x00;
MCUCR = 0x00; //0000 0000
TIFR = 0x00;
TIMSK = 0x00;
GIFR = 0x00;
GIMSK = 0x40; //interrupt Global
//SP = 0x??;

UBRR = 0x00; //baud 9600 for 10MHz
// UCR = 0xD8; //1101 1010
UCR = 0x00;
USR = 0x00; //0000 0000
UDR = 0x00;
DDRD = 0xfb; PORTD = 0x04;
DDRC = 0x3f; PORTC = 0x00;
DDRB = 0xff; PORTB = 0x00;
TCCR0 = 0x03; TCNT0 = 0x00;
TIMSK = 0x82; //interrupt Timers

}
//----------------------------------------------------------
void savebit(char adrb, char bit){//сохранение принятого бита в буфере.
char adr,msk;
if (bit) {bit=0xff;}else{bit=0x00;}//преобразование значения бита.
adr = adrb>>0x04;//получаем адрес байта из адр. полубитов.
adrb = (adrb>>0x01)&0x07;//получаем адрес бита в байте.
msk = 0x80>>adrb;//получаем маску бита.
bf[adr]=(bf[adr]&(~msk))|(bit&msk);//сохраняем бит в буфере.
}
//----------------------------------------------------------
char checkadr(void){//проверка своего адреса (=<)
char tst=0;
if (bf[1]==adrj[0]) {
if (bf[2]==adrj[1]){
if (bf[3]>=adrj[2]){tst=1;}
}
else {if (bf[2]>=adrj[1]){tst=1;}}
}
else {if(bf[1]>=adrj[0]){tst=1;}}
return(tst);
}
//----------------------------------------------------------
char chkadr(void){//проверка своего адреса (=)
return(((bf[1]==adrj[0])&(bf[2]==adrj[1])&(bf[3]==adrj[2]))|((bf[1]==0)&(bf[2]==0)&(bf[3]==0)));}
//----------------------------------------------------------
//==========================================================
interrupt [TIMER0_OVF0_vect] void TIMER0_OVF_interrupt(void)
{//обработчик таймера 0
rstid();// сброс приемника в случае таймаута.
flgs=0x04;//установить соотв. статус
}
//==========================================================
interrupt [TIMER1_OVF1_vect] void TIMER1_OVF_interrupt(void)
{//обработчик таймера 0 //задает период обработки дисплея.
flgout = 0x01;//уст. флага вывода дисплея.
TCNT1H = 0xF0;//загрузка таймена значением.
TCNT1L = 0x00;
}
//==========================================================
interrupt [INT0_vect] void INT0_interrupt(void)
{//обработчик внешнего прерывания при приеме.
char i=0x00;//счетчик полупериодов.
CLEARBIT(GIMSK,6);//запрет прерывания.
inb = CHECKBIT(PIND,2);//сохранение значения входа.
if (inb) {MCUCR=MCUCR&0xfc|0x02;}else{MCUCR=MCUCR&0xfc|0x03;}//перекл типа прерывания (спад/фронт)
//--------------------------------------
//обработка периода,перепада.
tmptm = TCNT0; TCNT0 = 0x00;//сброс таймера.
i = 0x00;
//подсчет полупериодов i путем вычитания значения полупериода time из значения периода tmptm
for(;tmptm>=time;){tmptm=tmptm-time; i++; if (flgs==1) {if (cntb<0xf0){cntb++;}
if (CHECKBIT(cntb,0)) {savebit(cntb,!inb);}/*if*/ }/*for*/ }//if
//сохранение значений нечетных полупериодов в буфере.

if (i==3) {if (inb) {flgs=0x01; cntb=0x00;}}//проверка на старт бит.
if ((i>2)&(i<5)) {if (!inb) {flgs=0x02;cntm=cntb; cntb=0x00;}}//проверка на стоп бит.
if (i>4) {flgs=0x00;}//неверная длина периода... запретить прием.

if ((cntm>=0x60)&(flgs==0x02)){flgs=0x00;command();}
//если принято достаточно бит и принят стоп бит то приступить к обработке.
//--------------------------------------
//control();//вызов обработчика периодов.
SETBIT(GIMSK,6);//разрешение прерывания.
}
//==========================================================
char chkkey(void)
{
return(keyl != keyh);
}
//=================================================COMMAND=========
void command(void){//обработчик команд.
// speedpck++;
if ((bf[0]==0x92)&checkadr()&chkkey()) {sndbits(0x00,0x01);}//команда 92-присутствие.
if (chkadr()) {//проверка своего адреса.

//команда 93 в ответ 4 бита.
if (bf[0]==0x93) { sndbits(keyl,0x04); countm=0; }

//команда 90 сохранить значения для последующей обработки
if (bf[0]==0x90) {keyh=bf[0x05]; led=bf[0x04]; if((led==0)&((bf[1]+bf[2]+bf[3])==0)){dtin=0;} }

//команда 98 установить яркость из первого байта.
if (bf[0]==0x98) {Brgg=bf[0x04]&0x07; Brgr=(bf[0x04]>>4)&0x07;}

//команда 96/97 передача чисел.
// if (bf[0]==0x96) {sndbits(06,0x04); flgupd = 01; dtint= bf[0x04] + ((long)bf[0x05]*256);}
// if (bf[0]==0x97) {sndbits(07,0x04); flgupd|= 02; dtint= dtint | ((long)bf[0x04]*65536 + (long)bf[0x05]*16777216);}
// if (flgupd == 0x03){dtin = dtint; dtint = 0; flgupd = 0;}

if (bf[0]==0x96) {sndbits(06,0x04); dt[0]= bf[0x04]; dt[1]= bf[0x05]; flgupd = 01; }
if (bf[0]==0x97) {sndbits(07,0x04); dt[2]= bf[0x04]; dt[3]= bf[0x05]; flgupd|= 02; }
}
}
//----------------------------------------------------------
void rstid (void)
{//сброс приемника.
cntb = 0x00;//сброс счетчика полубит.
flgs = 0x00;//сброс флагов.
if (CHECKBIT(PIND,0x02)) {MCUCR=MCUCR&0xfc|0x02;}else{MCUCR=MCUCR&0xfc|0x03;}
MCUCR=MCUCR&0xfc|0x02;
//прерывания...
}
//----------------------------------------------------------
void sndbit(char bt) {//посылка одного бита.
if (bt) {SETBIT(PORTD,0x02);}else{CLEARBIT(PORTD,0x02);} //вывод бита в порт.
DDRD=0xff; //все на вывод.
TCNT0=0x00; //сброс таймера.
do{}while(TCNT0<(time+1)); //ожидание полупериода.
}
//----------------------------------------------------------
void sndbits(char byte, char lng)//посылка lng бит из байта byte.
{GIMSK=0x00;//перекл вывода и запрет прерывания.
SETBIT(PORTD,0x03);//режим вывода.
for(;0 {sndbit(CHECKBIT(byte,lng-1));//посылка прямого бита.
sndbit(!CHECKBIT(byte,lng-1));}//посылка обратного бита.
CLEARBIT(PORTD,0x03);//режим приема.
DDRD=0xfb;PORTD=0x04;GIMSK=0x40;//установка вывода и прерывания.
rstid();//сброс приемника.
}
//----------------------------------------------------------

void main(void)
{
char i,n,cs,cp,flag=0;
_CLI();
Init();
_SEI();
WDTCR = 0x1F; // enable maximum WDT
..................
} /* end program MAIN */

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

Ответы



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

E-mail: info@telesys.ru