Zike
Вот как это делал я:
Цитата
#define MUX_STATE (0 << REFS1)|(0 << REFS0)
#define ADC_STATE (1 << ADEN)|(1 << ADPS2)|(1 << ADPS1)|(1 <<ADPS0)
//#ifdef F_CPU
#define F_CPU 16000000UL
//#endif
int pps=0;
unsigned char h=0,m=0,sec=0;
glcdRect_t r;
int x, _x,i,j, crc;
unsigned byte;
int ReadADC(unsigned char ChannelNum)
{
ADMUX = ChannelNum | MUX_STATE;
ADCSRA = (1 << ADSC) | ADC_STATE;
while ( (ADCSRA & ( 1 << ADIF))==0);
ADCSRA|=0x10;
return ADCW;
}
beep()
{
for (int i=0;i<100;i++)
{
PORTD |= _BV(PD2);
_delay_ms(1);
PORTD &= ~_BV(PD2);
_delay_ms(1);
}
}
void tri_beep()
{
beep();
_delay_ms(100);
beep();
_delay_ms(100);
beep();
_delay_ms(100);
}
void timer_init(void)
{
TCNT1H=TCNT1L=0;
OCR1A=15624;
TCCR1A=0;
TCCR1B=(1<<WGM12)|(1<<CS12)|(1<<CS10); //clk/64 1000000/64=15625
TIMSK=(1<<OCIE1A);
}
SIGNAL(SIG_OUTPUT_COMPARE1A)
{
char *text;
// beep();
sprintf(text," %i ",pps);
glcdMoveTo(10,10);
glcdPrint(text, 0);
_x=x;
PORTD |=_BV(PD0);
x=ReadADC(0);
PORTD &=~_BV(PD0);
if (x != _x)
{
sprintf(text," %i ",x);
glcdMoveTo(50,153);
glcdPrint(text, 0);
if (x>_x) glcdFillRect(105,170,125,170-x/5,BLUE);
if (x<_x) glcdFillRect(105,10,125,170-x/5,WHITE);
}
pps=0;
}
send_pack(unsigned int byte)
{
int x;
unsigned char i,_bit;
unsigned int recieved_byte;
recieved_byte=0x00;
for (i=0;i<16;i++)
{
PORTD |=((byte >> i) & 0x01)<<0;
x=ReadADC(0);
if (x>50) recieved_byte |= 1 << i;
if (x<51) recieved_byte |= 0 << i;
PORTC=recieved_byte;
PORTD &= ~_BV(PD0);
}
if (recieved_byte==byte) return 1;
return 0;
}
void main()
{
char *text;
#define cnt 1
#ifndef USE_AUTOINIT
glcdDisplayInit(); // в дальнейшем проверить запуск без этой строки...
#endif
DDRD = 0xFF;
DDRC = 0xFF;
ADCSRA=0x87;
glcdClearScreen(1);
glcdFillRect(0,0,132,176,RGB(0x66,0x66,0x66));
glcdSetFgColor(BLUE);
glcdSetFrColor(BLUE);
glcdSetBkColor(WHITE);
glcdSetOrientation(3);
glcdSelectFont(f9x14, 0); // font is stored in FLASH, demontrate read callback
glcdMoveTo(10,10);
timer_init();
asm("sei");
while (1)
{
asm("cli");
pps++;
crc=send_pack((((unsigned)rand())<<1)+rand());
if (crc==1) PORTD |= _BV(PD7);
if (crc==0)
{
PORTD |= _BV(PD5);
// tri_beep();
}
asm("sei");
}
/*
PORTD |= _BV(PD0);
_x=x;
x=ReadADC(0);
if (x != _x)
{
sprintf(text," %i ",x);
glcdMoveTo(50,153);
glcdPrint(text, 0);
if (x>_x) glcdFillRect(105,170,125,170-x/5,BLUE);
if (x<_x) glcdFillRect(105,10,125,170-x/5,WHITE);
}
*/
}
Правда, оговорюсь, передавал и принимал сигнал один и тот же контроллер, и передавал я побитно, а анализировал побайтно.
Но посмотрите, может быть поможет.