Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek dla www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

klawiatura ps/2 na attiny2313 własny sterownik

10 Paź 2010 14:23 1575 6
  • 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:
    Code:

    #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ść...
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Poziom 24  
    Code:
    if(getkey==0x30) PORTB^=_BV(1);


    Czegoś tu brakuje.
  • 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
    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 ?
  • 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?
  • 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.
  • Poziom 11  
    OK, dzięki za wszystko