Witam chce zapiac procka Atmega128 zeby wysylal do kompa polecenia takie same jak by zostal nacisniety przycisk na klawiaturce jak to zrobic >?
Czy wolisz polską wersję strony elektroda?
Nie, dziękuję Przekieruj mnie tamwebserver napisał:Witam chce zapiac procka
Clk Alias P2.1
Dat Alias P2.2
Dim I As Byte , Wartosc As Byte , Parz As Byte , Parzystosc As Bit
Do
Wait 1 ' co sekunde wysyla litere "k"
Wartosc = &H42
Call Wyslij
Waitms 100
Wartosc = &HF0
Call Wyslij
Wartosc = &H42
Call Wyslij
Loop
Sub Czekaj
Parz = 0
$asm
MOV R7,#20 'czekaj 40 us
Et1:
DJNZ R7,ET1
$end Asm
End Sub
Sub Wyslij
For I = 0 To 7
If Wartosc.i = 1 Then
Incr Parz
End If
Next I
Parz = Parz Mod 2
If Parz = 0 Then
Parzystosc = 1
Else
Parzystosc = 0
End If
Dat = 0
Call Czekaj
Clk = 0
Call Czekaj
For I = 0 To 7
Clk = 1
Dat = Wartosc.i
Call Czekaj
Clk = 0
Call Czekaj
Next I
Clk = 1
Dat = Parzystosc
Call Czekaj
Clk = 0
Call Czekaj
Clk = 1
Dat = 1
Call Czekaj
Clk = 0
Call Czekaj
Clk = 1
Dat = 0
Waitms 1
Dat = 1
End SubCytat:kombinowalem z roznymi dlugosciami czasów ale dalem sobie na razie spokoj.. piszczy mi glosniczek systemowy, jak by sie bufor klawiatury przepelniał czy cos..? nie wiem juz sam...
Declare Function Wyslij(bajt As Byte) As Bit
Dim N As Byte
N = 0
Dim Parz As Byte
Parz = 0
Set Portd.0
Set Portd.1
Do
Loop
End
Function Wyslij(bajt As Byte) As Bit
Reset Portd.1 'wysylamy bit startu
Waitus 20
Reset Portd.0
For N = 0 To 7 'w petli wysylamy kolejne bity bajtu
Portd.1 = Bajt.n
Parz = Parz + Bajt.n
Set Portd.0
Waitus 20
Reset Portd.0
Waitus 20
Next N
Set Portd.0 'parzystosc
Parz = Parz Mod 2
Portd.1 = Not Parz.0
Waitus 20
Reset Portd.0
Waitus 20
Set Portd.1 'i bit stopu
Set Portd.0
Waitus 20
Reset Portd.0
Waitus 20
Set Portd.0
Waitus 40
'dla bezpieczenstwa :D
End Function
Wyslij($HA0) 'wysle bajt A0, czyli 160
Wyslij($H1C)
Wait 3 ' "przytrzymajmy" go 3 sekundy, niech się zrobi trochę
'znaków w np. Notatniku
Wyslij($HF0)
Wyslij($H1C)
Wyslij($H1C)
Wait 3 ' "przytrzymajmy" go 3 sekundy, niech się zrobi trochę
'znaków w np. Notatniku
Wyslij($HF0)
Wyslij($H1C)
Wyslij($HF0)
Wyslij($H1C)
Declare Sub Wyslij(byval Bajt As Byte)
Dim N As Byte
N = 0
Dim Parz As Byte
Parz = 0
Dim B As Bit
Set Portd.0
Set Portd.1
Do
Call Wyslij($h1c) 'przyklad
Loop
End
Sub Wyslij(byval Bajt As Byte)
Reset 'wysylamy bit startu
Waitus 20
Reset Portd.0
For N = 0 To 7 'w petli wysylamy kolejne bity bajtu
Portd.1 = Bajt.n
Parz = Parz + Bajt.n
Set Portd.0
Waitus 20
Reset Portd.0
Waitus 20
Next N
Set Portd.0
Parz = Parz Mod 2
Portd.1 = Not Parz.0
Waitus 20
Reset Portd.0
Waitus 20
Set Portd.1 'i bit stopu
Set Portd.0
Waitus 20
Reset Portd.0
Waitus 20
Set Portd.0
Waitus 40 'dla bezpieczenstwa :D
End Sub
Call Wyslij(&H3a)
Waitms 450
Call Wyslij(&H23)
Waitms 450
Call Wyslij(&H1c)
Waitms 450
//Piny do pc
//Data
#define KBD_DATA_PORT PORTC //pull
#define KBD_DATA_P 5 //pull
#define KBD_inDATA_PIN PIND
#define KBD_inDATA_P 1
//Clk
#define KBD_CLK_PORT PORTC //pull
#define KBD_CLK_P 4 //pull
#define KBD_inCLK_PORT PIND
#define KBD_inCLK_P 3
//pull to pin podłączony do tranzystora ściągającego do 0
//podobnie jak tu
//http://www.computer-engineering.org/ps2protocol/ps2.JPG
SIGNAL (SIG_OVERFLOW0)
{
if(wait)
wait--;
}
void sendpc(char sbp){
while(!((KBD_inCLK_PORT>>KBD_inCLK_P)&1)){//czeka na clk 1
recpc(); //odbior
}
if(!((KBD_inDATA_PIN>>KBD_inDATA_P)&1))//sprawdza czy transmisja
recpc();
KBD_DATA_PORT&=~(1<<KBD_DATA_P); //data 0
TCNT0=128;
wait=1;
while(wait){ //czeka 5-25us, sprawdza czy transmisja
if(!((KBD_inCLK_PORT>>KBD_inCLK_P)&1))
recpc(); //odbior
}
/////////////////////////////////////////////////
KBD_CLK_PORT&=~(1<<KBD_CLK_P); //ckl 0
wait=2;
TCNT0=128;
while(wait); //czeka 30-50us
KBD_CLK_PORT|=(1<<KBD_CLK_P); //clk 1
odd=1;
for(i=0;i<8;i++){ //przesył \/ \/ \/
wait=1;
TCNT0=140;
while(wait); //czeka +-20us
KBD_DATA_PORT=(KBD_DATA_PORT&(~(1<<KBD_DATA_P)))|(((sbp>>i)&1)<<KBD_DATA_P);
//ustawia data i-ty bit LSBF
wait=1;
TCNT0=140;
while(wait){ //czeka +-20us, sprawdza czy transmisja
if(!((KBD_inCLK_PORT>>KBD_inCLK_P)&1))
recpc(); //odbior
}
KBD_CLK_PORT&=~(1<<KBD_CLK_P); //ckl 0
wait=2;
TCNT0=128;
while(wait); //czeka 30-50us
odd^=(sbp>>i)&1; //suma kontrolna
KBD_CLK_PORT|=(1<<KBD_CLK_P); //clk 1
} //koniec /\ /\ /\
wait=1;
TCNT0=140;
while(wait); //czeka +-20us
KBD_DATA_PORT=(KBD_DATA_PORT&(~(1<<5)))|((odd&1)<<5);
//bit parzystości
wait=1;
TCNT0=140;
while(wait){ //czeka +-20us, sprawdza czy transmisja
if(!((KBD_inCLK_PORT>>KBD_inCLK_P)&1))
recpc(); //odbior
}
KBD_CLK_PORT&=~(1<<KBD_CLK_P); //clk 0
wait=2;
TCNT0=128;
while(wait); //czeka 30-50us
KBD_CLK_PORT|=(1<<KBD_CLK_P); //clk 1
wait=1;
TCNT0=140;
while(wait); //czeka +-20us
KBD_DATA_PORT|=(1<<KBD_DATA_PORT); //data 1
wait=1;
TCNT0=140;
while(wait){ //czeka +-20us, sprawdza czy transmisja
if(!((KBD_inCLK_PORT>>KBD_inCLK_P)&1))
recpc(); //odbior
}
KBD_CLK_PORT&=~(1<<KBD_CLK_P); //clk 0
wait=3;
TCNT0=0;
while(wait); //czeka 100us
PORTC|=(1<<4);
KBD_CLK_PORT|=(1<<KBD_CLK_P); //clk 1
while(wait){ //czeka +-20us, sprawdza czy transmisja
if(!((KBD_inCLK_PORT>>KBD_inCLK_P)&1))
recpc(); //odbior
}
}
int main(void)
{
DDRA=255;
DDRB=255;
DDRC=255;
//PORTD=PIND=255;//////////////
PORTC|=(1<<6);
PORTC|=(1<<7);
PORTC|=(1<<5);
PORTC|=(1<<4);
DDRD|=~(1<<2|1<<4|1<<3|1<<1);
//PORTB=0;
MCUCR=2;
//PORTB=255;
TCCR0=1;
TCCR1A=0;
TCCR1B=0;
TIFR=0;
TIMSK=1<<TOIE0;
sei();
TCNT0=0;
wait=1;
TCNT0=80;
while(wait);
GICR|=1<<INT0;
//GICR|=1<<INT1;
//init();
while(1){
sendpc(0x42); //wysyła "k"
sendpc(0xF0);
sendpc(0x42);
}
}
Adam_dz napisał:
Pojdzie ten kod na ATmega8 na 8 MHz?
Jesli nie to co by wypadało zmienic?
wait=3;
TCNT0=0;
while(wait);