logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

klawiatura ps/2 na attiny2313 własny sterownik

defrag07 10 Paź 2010 14:23 1701 6
REKLAMA
  • #1 8603339
    defrag07
    Poziom 11  
    Tym razem próbuję się uporać z klawiaturą PC i oczywiście nie mogę sobie z tym poradzić, więc proszę Was o pomoc, oto kod:
    
    #define F_CPU 1000000L
    #define KCBIT PIND&_BV(6)
    #include <avr/io.h>
    #include <util/delay.h>
    #include <avr/interrupt.h>
    volatile unsigned char kdata=0, krecive=0, kbit=0, init=0;
    SIGNAL(INT1_vect)
    {
    	PORTB^=_BV(2);
    	if(init)
    	{//ciąg dalszy f4
    		if((0xf4&_BV(kbit))&&(kbit<8)) PORTD|=_BV(6); else PORTB&=~_BV(6);
    		if(kbit==8) PORTD|=_BV(6);
    		if(kbit==9)
    		{
    			DDRD&=~_BV(6);
    			PORTD|=_BV(6);
    			kbit=0;
    			init=0;
    		}else kbit+=1;
    	}
    	else
    	{//to ma odbierać dane
    		switch(kbit)
    		{
    			case 0:
    				kdata=0;
    			case 1:
    				if(KCBIT) kdata|=_BV(0);
    			case 2:
    				if(KCBIT) kdata|=_BV(1);
    			case 3:
    				if(KCBIT) kdata|=_BV(2);
    			case 4:
    				if(KCBIT) kdata|=_BV(3);
    			case 5:
    				if(KCBIT) kdata|=_BV(4);
    			case 6:
    				if(KCBIT) kdata|=_BV(5);
    			case 7:
    				if(KCBIT) kdata|=_BV(6);
    			case 8:
    				if(KCBIT) kdata|=_BV(7);
    			case 9:
    				break;
    			case 10:
    				krecive=1;
    				break;			
    		}
    		if(!krecive) kbit+=1;
    	}
    }
    void keyboard_init()
    {
    	//rozpoczynanie wysyłanie f4
    	DDRD|=_BV(3);//clock
    	DDRD|=_BV(6);//data
    	PORTD|=_BV(3);
    	PORTD|=_BV(6);
    	PORTD&=~_BV(3);
    	_delay_us(62);
    	PORTD&=~_BV(6);
    	PORTD|=_BV(3);//tu powinien startować sygnał klawiatury
    	GIMSK |= (1 << INT1);  // zezwolenie na przerwanie INT1
    	MCUCR |= (1 << ISC11); // przerwanie INT1 wyzwalane zboczem opadającym
    	DDRD&=~_BV(3);
    	PORTD|=_BV(3);
    	sei();
    	init=1;
    }
    unsigned char getkey()
    {
    	while(!krecive);
    	krecive=0;
    	kbit=0;
    	return kdata;
    }
    int main(void)
    {
    	int a;
    	DDRB=0xff;
    	for(a=0; a<1000; a+=1) _delay_ms(1);
    	keyboard_init();
    	for(;;)
    	{
    		if(getkey==0x30) PORTB^=_BV(1);
    	}
    }
    

    Pod portb podłączone są 2 diody. Klawiatura jest jakby martwa. Nie wiem co robię źle, pewnie większość...
  • REKLAMA
  • REKLAMA
  • #3 8604119
    defrag07
    Poziom 11  
    A tak nawiasów, przeoczyłem, ale to nic nie dało. Ja mam wrażenie że klawiatura w ogóle się mi nie uaktywnia, bo jak by była aktywowana to chyba powinna mi się dioda od np Caps Lock zapalać.
  • Pomocny post
    #4 8604226
    sulfur
    Poziom 24  
    Bo to dopiero początek. Proszę powiedzieć, czy koledze jest potrzebne nadawanie do klawiatury, czy próba nadawania "F4" jest tylko niewiedzą, że tego robić nie trzeba ? Ilość błędów jest znaczna, więc żeby je poprawić trzeba znać zakładany efekt końcowy. No i czy obie linie są podciągane do plusa przez rezystory 4k7 ?
  • REKLAMA
  • #5 8604496
    defrag07
    Poziom 11  
    Rezystorki były i są podpięte, poszedłem za Twoją radą i olałem to F4 pozmieniałem troszkę i działa już teraz. Zmyliły mnie te diody na klawiaturze, w związku z tym jak jest realizowana ich obsługa; urządzenie, które obsługuje klawiaturę zarządza diodami?
  • #6 8604653
    sulfur
    Poziom 24  
    Tak, aby diody się zapaliły należy wysłać do klawiatury "ED", a w następnym bajcie są ustawienia lampek.

    Dariusz Marchewka napisał:
    Ustawianie stanu diod LED –NumLock, CapsLock, Scroll Lock.
    Po przeslaniu EDh klawiatura odpowiada ACK (FAh) i czeka na nastepny
    bajt ustawiajacy LEDy. Bit 0 steruje ScrollLock, Bit 1 – NumLock, Bit 2 –
    CapsLock. pozostale bity sa ignorowane.
  • REKLAMA
  • #7 8605391
    defrag07
    Poziom 11  
    OK, dzięki za wszystko
REKLAMA