нашел всю прогу целиком, просто писал надругом компе.
код прилагается, проблема таже.
#define __AVR_AT90USB1286__ 1
#define F_CPU 16000000L // ÷àñòîòà êâàðöà â Ãö
#include ‹avr/io.h›
#include ‹avr/interrupt.h›
#include ‹avr/iousb1286.h›
#include ‹avr/pgmspace.h›
#include ‹util/delay.h›
#define CPU_PRESCALE(n) (CLKPR = 0x80, CLKPR = (n))
#define MaxResolution 100
#define SetBit(reg, bit) reg |= (1‹‹bit)
#define ClearBit(reg, bit) reg &= (~(1‹‹bit))
#define InvBit(reg, bit) reg ^= (1‹‹bit)
#define BitIsSet(reg, bit) ((reg & (1‹‹bit)) != 0)
#define BitIsClear(reg, bit) ((reg & (1‹‹bit)) == 0)
char i=7;
char L_PORTA=0; L_PORTC=0; L_PORTD=0;
char Data1,Data2,Data3,Data4,Data5,Buffer;
int Joy_1,Joy_2,Joy_3,Joy_4,Joy_5;
/////////////////////////////////////////////////////////
ISR (TIMER1_COMPA_vector)
{
if ((L_PORTA&0X0
==(PORTA&0x0
) Joy_2=1;
if ((L_PORTD&0x01)==(PORTD&0x01)) Joy_3=1;
if ((L_PORTC&0x02)==(PORTC&0x02)) Joy_4=1;
if ((L_PORTC&0x0
==(PORTC&0x0
) Joy_5=1;
L_PORTA=PORTA;
L_PORTC=PORTC;
L_PORTD=PORTD;
}
void ReadJoy1(void)
{
if ((PORTA & (1‹‹0)) != 0 )//ïðîâåðêà íà 1
{
SetBit(Buffer,i); i=i-1;
}
ClearBit(Buffer,i); i=i-1;
if (i==1)
{
i=7;
Data1=Buffer;
SetBit(PORTA,2); // çàâåðøèòü îïðîñ
ClearBit(PORTA,5);// çàïðîñ 2-ãî äæîñòèêà
}
Joy_1=0;
}
/////////////////////////////////////////////////////////
void ReadJoy2(void)
{
if ((PORTA & (1‹‹3)) != 0 )//ïðîâåðêà íà 1
{
SetBit(Buffer,i); i=i-1;
}
ClearBit(Buffer,i); i=i-1;
if (i==1)
{
i=7;
Data2=Buffer;
SetBit(PORTA,5); // çàâåðøèòü îïðîñ
ClearBit(PORTD,2);// çàïðîñ 3-ãî äæîñòèêà
}
Joy_2=0;
}
//////////////////////////////////////////////////////////////
void ReadJoy3(void)
{
if ((PORTD & (1‹‹0)) != 0 )//ïðîâåðêà íà 1
{
SetBit(Buffer,i); i=i-1;
}
ClearBit(Buffer,i); i=i-1;
if (i==1)
{
i=7;
Data3=Buffer;
SetBit(PORTD,2); // çàâåðøèòü îïðîñ
ClearBit(PORTC,2);// çàïðîñ 3-ãî äæîñòèêà
}
Joy_3=0;
}
/////////////////////////////////////////////////////////////
void ReadJoy4(void)
{
if ((PORTC & (1‹‹0)) != 0 )//ïðîâåðêà íà 1
{
SetBit(Buffer,i); i=i-1;
}
ClearBit(Buffer,i); i=i-1;
if (i==1)
{
i=7;
Data4=Buffer;
SetBit(PORTC,2); // çàâåðøèòü îïðîñ
ClearBit(PORTC,5);// çàïðîñ 3-ãî äæîñòèêà
}
Joy_4=0;
}
////////////////////////////////////////////////////////////
void ReadJoy5(void)
{
if ((PORTC & (1‹‹3)) != 0 )//ïðîâåðêà íà 1
{
SetBit(Buffer,i); i=i-1;
}
ClearBit(Buffer,i); i=i-1;
if (i==1)
{
i=7;
Data5=Buffer;
SetBit(PORTC,5); // çàâåðøèòü îïðîñ
ClearBit(PORTA,2);// çàïðîñ 3-ãî äæîñòèêà
}
Joy_5=0;
}
////////////////////////////////////////////////////////
int main(void)
{
DDRA=0b00100100;
DDRD=0b00000100;//íàñòðîéêà ïîðòîâ
DDRC=0b00100100;
//ÍÀÑÒÐÎÉÊÀ ÒÀÉÌÅÐÀ
cli();
TCCR1B=(1‹‹WGM12)|(1‹‹CS10);
TIMSK1=(1‹‹OCIE1A);
ClearBit(PORTA,2);//ïåðâûé çàïðîñ
OCR1A=0x0F0F;
sei();
while (1)
{
if (Joy_1==1)
ReadJoy1();
if (Joy_2==1)
ReadJoy2();
if (Joy_3==1)
ReadJoy3();
if (Joy_4==1)
ReadJoy4();
if (Joy_5==1)
ReadJoy5();
}
}