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

[ATmega32 / C] Brak komunikacji Klawiatura PS/2

mgiro 21 Paź 2010 07:16 1379 1
REKLAMA
  • #1 8645014
    mgiro
    Poziom 22  
    Witam,

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



    
    //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);
    	}
    }
    


    
    //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);
    


    
    ////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ę??
  • REKLAMA
  • #2 8658988
    ja.czekanski
    Poziom 13  
       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ą.
REKLAMA