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.

[ATmega32 / C] Brak komunikacji Klawiatura PS/2

21 Paź 2010 07:16 1271 1
  • Poziom 22  
    Witam,

    Jestem w trakcie budowy komunikacji między ATmega32 a klawiatura PS/2. Wykorzystuje biblioteki zamieszczone na stronie Link



    Code:

    //klawiatura.c
    #include <avr/io.h>
    //#include <avr/interrupt.h>
    #include <string.h>
    #include <inttypes.h>
    #include <stdlib.h>
    //#include <stdio>
    #include "hd44780.h"
    #include "atkeyboard.h"
    //#include "scancodes.h"

    char intt[20];

    int main(void)
    {
       LCD_Initalize();
       void initATkbd(void);

       unsigned char c = 2;
       
       while(1)
       {
          c = getATkbd();
          LCD_GoTo(1,0);
          LCD_WriteText(intt);
          itoa(c,intt,10);
       }
    }


    Code:

    //atkeyboard////
    #include <avr/io.h>
    #include <avr/interrupt.h>
    //
    #define ATKbdPort PORTD
    #define ATKbdPin  PIND
    #define ATKbdDir  DDRD
    //
    #define ATKbdClk  PD2
    //
    #define ATKbdDta  PD0
    //
    #define ATKbdGetDta() (ATKbdPin & (1 << ATKbdDta))
    #define ATKbdGetClk() (ATKbdPin & (1 << ATKbdClk))
    //
    //#define ATKbdSetDta() ATKbdPort |= (1 << ATKbdDta)
    #define ATKbdClrDta() ATKbdPort &= ~(1 << ATKbdDta)
    //
    //#define ATKbdSetClk() ATKbdPort |= (1 << ATKbdClk)
    #define ATKbdClrClk() ATKbdPort &= ~(1 << ATKbdClk)

    #define ATKbdDtaOut() ATKbdDir |= (1 << ATKbdDta)
    #define ATKbdDtaIn()  ATKbdDir &= ~(1 << ATKbdDta)

    #define ATKbdClkOut() ATKbdDir |= (1 << ATKbdClk)
    #define ATKbdClkIn()  ATKbdDir &= ~(1 << ATKbdClk)

    unsigned char getATkbd(void);
    void initATkbd(void);


    Code:

    ////atkeyboard.c///
    #include "atkeyboard.h"

    unsigned char volatile dane = 0, nowy = 0, i = 0;

    // procedura obsługi przerwania zewnętrzneg
    #if ATKbdClk == PD2
      #define USE_INT0
      ISR(INT0_vect)
    #elif ATKbdClk == PD3
      #define USE_INT1
      ISR(INT1_vect)
    #endif
    {
    switch(i){
      case 0 :
      dane = 0;
      i++;
      break;
      case 1 :
      if(ATKbdGetDta()) dane |= 0x01;
      i++;
      break;
      case 2 :
      if(ATKbdGetDta()) dane |= 0x02;
      i++;
      break;
      case 3 :
      if(ATKbdGetDta()) dane |= 0x04;
      i++;
      break;
      case 4 :
      if(ATKbdGetDta()) dane |= 0x08;
      i++;
      break;
      case 5 :
      if(ATKbdGetDta()) dane |= 0x10;
      i++;
      break;
      case 6 :
      if(ATKbdGetDta()) dane |= 0x20;
      i++;
      break;
      case 7 :
      if(ATKbdGetDta()) dane |= 0x40;
      i++;
      break;
      case 8 :
      if(ATKbdGetDta()) dane |= 0x80;
      i++;
      break;
      case 9 :
      i++;
      break;
      case 10 :
      nowy = 1;
      i = 0;
      break;
      }
    }

    // funkcja inicjalizująca porty oraz przerwania
    // wykorzystywane przy obsłudze klawiatury.
    void initATkbd(void)
    {
    ATKbdDtaIn(); // linia DATA pracuje jako wejście
    //ATKbdSetDta();// właczenie rezystora podciągajacego linii DATA
    ATKbdClkIn(); // linia CLK pracuje jako wejście
    //ATKbdSetClk();// właczenie rezystora podciągającego lini CLK

    #ifdef USE_INT0
      GICR |= (1 << INT0);  // zezwolenie na przerwanie INT0
      MCUCR |= (1 << ISC01); // przerwanie INT0 wyzwalane zboczem opadającym
    #endif

    #ifdef USE_INT1
      GICR |= (1 << INT1);  // zezwolenie na przerwanie INT1
      MCUCR |= (1 << ISC11); // przerwanie INT1 wyzwalane zboczem opadającym
    #endif

    sei(); // globalne odblokowanie przerwań
    }

    // funkcja odczytujaca kod naciśniętego klawisza
    unsigned char getATkbd(void)
    {
    while(!nowy); // oczekiwanie na odebranie nowego znaku
    nowy = 0; // zerowanie flagi odebrania znaku
    return dane;
    }


    Tutaj zamieszczam cały projekt Link

    Wykorzystuję zestaw uruchomieniowy ZL3AVR. ATmega32 jest taktowana zewnętrznym kwarcem 16MHz.

    Po skompilowaniu programu i wgraniu pliku .hex na mikrokontroler na wyświetlaczu LCD nie pojawia się żaden znak.

    Może ktoś zna powód, dla którego nie można uzyskać kodu wciśniętego klawisza klawiatury PS/2. Może wykorzystywaliście już tą bibliotekę??
    Darmowe szkolenie: Ethernet w przemyśle dziś i jutro. Zarejestruj się za darmo.
  • Poziom 12  
    Code:
       while(1) 
    
       {
          c = getATkbd();
          LCD_GoTo(1,0);
          LCD_WriteText(intt);
          itoa(c,intt,10);
       }


    Najpierw wyświetlasz tekst, następnie zamieniasz liczbę na znak. Zamień linie ze sobą.