Podłączenie klawiatury do uc

To forum jest dla wszystkich pasjonatów mikrokontrolerów AVR Atmela. Wymiana doświadczeń i pomoc dla początkujących w pisaniu programów zarówno w C, Asemblerze jak i BASCOM. Zapraszam znawców tematu, aby pomogli wszystkim początkującym!
ODPOWIEDZ
zasepa
-
Posty: 10
Rejestracja: 27 sie 2010, 8:24
Lokalizacja: Częstochowa

Podłączenie klawiatury do uc

Post autor: zasepa » 27 sie 2010, 8:30

Witam
Jestem nowy na forum więc proszę o wyrozumiałość

Mam kłopot otóż kilka przycisków mi nie wystarcza wiec pomyślałem o podłączeniu klawiatury do uc znalazłem w necie jak podłączyć lecz nie mogę rozgryźć programu,
który plik gdzie wstawić i jak napisać program aby robił: gdy nacisnę na klawiaturze "space" to ma uc dać stan wysoki na port B0 a gdy puszcze to stan niski na B0
Program ma być w języku C dla Procesora Atmega32 z rodziny AVR
Bardzo proszę o pomoc będę bardzo wdzięczny
http://radzio.dxp.pl/pckeyboard/
Są do pobrania 3 pliki ale nie wiem gdzie który wstawić i niema programu szukałem ale nie znalazłem liczę na waszą pomoc :)

maxzwp
-
Posty: 36
Rejestracja: 31 sty 2006, 15:13

Post autor: maxzwp » 27 sie 2010, 16:43

Nie ma programu bo to jest gotowa funkcja , z której możesz korzystać.

utwórz własny plik z funkcją main. Powinien wyglądać mniej więcej tak:

Kod: Zaznacz cały

#inlcude "atkeyboard.h"
#include "scancodes.h"

...

int main()
{
  intATkbd()
  ...

  while(1) // petla glowna
  {
    unsigned char key;
    key=getATkbd(); // program będzie czakal az nacisniesz jakis klawisz
    if (key==kod_spacji) 
         cos tam zrob
    ...
  }
  return 0;
}

Do kompilacji dołącz plik atkeyboard.c

To tak mniej więcej.
Jak chcesz użyć tablicy do dekodowania klawiszy na ASCII to poczytaj o PROGMEM i sposobie odczytu danych z pamięci programu.

zasepa
-
Posty: 10
Rejestracja: 27 sie 2010, 8:24
Lokalizacja: Częstochowa

Post autor: zasepa » 28 sie 2010, 7:46

Aha a kod spacji to 0x29
Czyli cały program powinien wyglądać tak
A ten trzeci plik h co z nim on jest potrzebny ??

Kod: Zaznacz cały


#include <avr/io.h>                                    //Nagłówek
#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;
}




int main(void)
{
  intATkbd()

  while(1);                                        // petla glowna
  {
    unsigned char key;
    key=getATkbd();                             // program będzie czakal az nacisniesz jakis klawisz
if (key==0x20)
{
PORTA= 0b00000010;                              //Na port A1 daj stan wysoki na pozostałe stan niski    
}
else;
{
PORTA= 0b00000000;                              //Na porty A daj stan niski
}
 
 
  }
  return 0;
}

maxzwp
-
Posty: 36
Rejestracja: 31 sty 2006, 15:13

Post autor: maxzwp » 31 sie 2010, 15:27

Uwaga 1: zamiast key==0x20 daj key==0x29 dla spacji.

Uwaga 2: czy wiesz, że port A pracuje jako wejście twoim programie? Ustaw odpowiednio rejestr DDR (wpisz jedynkę tam, gdzie chcesz by pracował jako wyjście).

Uwaga 3: program działać będzie tak: naciśniesz spacje to ustawi jedynkę na porcie, naciśniesz inny klawisz to port wyzeruje.

Uwaga 4: nie musisz używać pliku scancodes.h jeżeli użyjesz bezpośrednio kodów klawiatury, a nie ASCII.

zasepa
-
Posty: 10
Rejestracja: 27 sie 2010, 8:24
Lokalizacja: Częstochowa

Post autor: zasepa » 01 wrz 2010, 9:59

Czyli tak ma wyglądać gotowy program czy trzeba jakieś pliki dorzucić??

Kod: Zaznacz cały

#include <avr/io.h>                                    //Nagłówek
#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;
}




int main(void)
{
DDRA= 0b11111111;                                //Porty A jako wyjścia


  while(1);                                        // petla glowna
  {
    unsigned char key;
    key=getATkbd();                             // program będzie czakal az nacisniesz jakis klawisz
if (key==0x29)
{
PORTA= 0b00000010;                              //Na port A1 daj stan wysoki na pozostałe stan niski   
}
else;
{
PORTA= 0b00000000;                              //Na porty A daj stan niski
}
 
 
  }
  return 0;
} 


[ Dodano: 2010-09-01, 11:01 ]
Tylko czy ta biblioteka będzie działać pod atmega32 ??

maxzwp
-
Posty: 36
Rejestracja: 31 sty 2006, 15:13

Post autor: maxzwp » 01 wrz 2010, 10:34

Powinna działać na atmega32, ale to pytanie jest do autora.

Skompiluj, wgraj (AVR można programować wiele razy), uruchom. Jak są problemy to znajdź przyczynę. To nie jest chyba satelita za milion dolarów, czy aparatura medyczna aby sprawdzić poprawność w praktyce.

zasepa
-
Posty: 10
Rejestracja: 27 sie 2010, 8:24
Lokalizacja: Częstochowa

Post autor: zasepa » 01 wrz 2010, 13:04

A innych plików nie trzeba dodawać ??
Wielkie dzięki :grin:

ODPOWIEDZ