RTV forum PL | NewsGroups PL

Nieodczytywanie kolumny 3 w skanowaniu klawiatury z użyciem AVR-GCC

[avr-gcc] Skanowanie klawiatury - jednak nie dziala

NOWY TEMAT

elektroda NewsGroups Forum Index - Elektronika Polska - Nieodczytywanie kolumny 3 w skanowaniu klawiatury z użyciem AVR-GCC

Saper/nolin11
Guest

Thu Jan 25, 2007 9:24 pm   



Witam,

Otóż mam klawiaturę i nie mogę odczytać (mimo że powinienem) kolumny nr 3
(na sch, w prog. kolumna nr 1)...
Schemat: http://nolin11.w.interia.pl/k1.gif ,a tutaj funkcja skanowania i
inicjacji:
<code>
void Init(void) {
// Interfejs I2C
DDR(I2C_SDAPORT) |= 1 << I2C_SDA;
DDR(I2C_SCLPORT) |= 1 << I2C_SCL;
PORT(I2C_SDAPORT) |= 1 << I2C_SDA;
PORT(I2C_SCLPORT) |= 1 << I2C_SCL;
// zaraz po inicjacji wyślij zera na wyjścia PCF'a
i2c_send8574(PCF8574_ADDR,0x00);

// Klawiatura
PORT(SW_PORT) = 0xff; // "1" na wszystkie przyciski
// Zera będą się pojawiać na wierszach ,a czytane będą kolumny Smile
DDR(SW_PORT) |= 1 << SW_ROW1 | 1 << SW_ROW2 | 1 << SW_ROW3 | 1 << SW_ROW4
| 1 << SW_ROW5;
DDR(SW_PORT) &= ~(0xe0); // pb5,pb6,pb7 jako wejscie

// Diody
PORT(LED_PORT) |= 1 << LED1 | 1 << LED2 | 1<<LED3;
PORT(LED_PORT) &= ~(1 << LED_R | 1 << LED_G);

DDR(LED_PORT) |= 1 << LED1 | 1 << LED2 | 1 << LED3 | 1 << LED_R | 1 <<
LED_G;

LED_G_ON;
}

uint8_t key_scan(void) {
PORT(SW_PORT) |= 0xff;
uint8_t temp=16;
// początek skanowania - odczyt kolumnowy
// wiersz 1
PORT(SW_PORT) &= ~(1 << SW_ROW1); // ustaw "0" na wierszu
if (!(PIN(SW_PORT) & 0x80)) { // kolumna 1
temp = 10;
} else if (!(PIN(SW_PORT) & 0x40)) { // kolumna 2
temp = 0;
} else if (!(PIN(SW_PORT) & 0x20)) {
temp = 11;
}
PORT(SW_PORT) |= 1 << SW_ROW1; // ustaw "1" na wierszu
// wiersz 2
PORT(SW_PORT) &= ~(1 << SW_ROW2); // ustaw "0" na wierszu
if (!(PIN(SW_PORT) & 0x80)) { // kolumna 1
temp = 9;
} else if (!(PIN(SW_PORT) & 0x40)) { // kolumna 2
temp = 8;
} else if (!(PIN(SW_PORT) & 0x20)) {
temp = 7;
}
PORT(SW_PORT) |= 1 << SW_ROW2; // ustaw "1" na wierszu
// wiersz 3
PORT(SW_PORT) &= ~(1 << SW_ROW3); // ustaw "0" na wierszu
if (!(PIN(SW_PORT) & 0x80)) { // kolumna 1
temp = 6;
} else if (!(PIN(SW_PORT) & 0x40)) { // kolumna 2
temp = 5;
} else if (!(PIN(SW_PORT) & 0x20)) {
temp = 4;
}
PORT(SW_PORT) |= 1 << SW_ROW3; // ustaw "1" na wierszu
// wiersz 4
PORT(SW_PORT) &= ~(1 << SW_ROW4); // ustaw "0" na wierszu
if (!(PIN(SW_PORT) & 0x80)) { // kolumna 1
temp = 3;
} else if (!(PIN(SW_PORT) & 0x40)) { // kolumna 2
temp = 2;
} else if (!(PIN(SW_PORT) & 0x20)) {
temp = 1;
}
PORT(SW_PORT) |= 1 << SW_ROW4; // ustaw "1" na wierszu
// wiersz 5
PORT(SW_PORT) &= ~(1 << SW_ROW5); // ustaw "0" na wierszu
if (!(PIN(SW_PORT) & 0x80)) { // kolumna 1
temp = 14;
} else if (!(PIN(SW_PORT) & 0x40)) { // kolumna 2
temp = 13;
} else if (!(PIN(SW_PORT) & 0x20)) {
temp = 12;
}
PORT(SW_PORT) |= 1 << SW_ROW5; // ustaw "1" na wierszu
return temp;
}
</code>
Jeśli zrobiłem jakiś głupi błąd to proszę o info i nie śmiać się :> gdyż
dopiero zaczynam pisać w c Smile)


--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700

Adam Dybkowski
Guest

Fri Jan 26, 2007 1:48 am   



Saper/nolin11 napisał(a):

Quote:
DDR(I2C_SCLPORT) |= 1 << I2C_SCL;
PORT(I2C_SDAPORT) |= 1 << I2C_SDA;

A cóż to za dziwadła czy nowa moda? Nie dało się normalnie zapisać
dostępu do tego rejestru DDR i portu?

Jeżeli chodzi o skanowanie klawiatury - dodaj odstęp pomiędzy
wysterowaniem wiersza a odczytem kolumny. Przy okazji możesz nieco
uprościć i rozjaśnić kod używając pętli zamiast wielokrotnie konstrukcji
podobnych do siebie. Dziwne też, że masz zdefiniowane maski wierszy (np.
SW_ROW1) a nie masz masek kolumn (sprawdzasz wartości 0x80, 0x40 itp).
Jeżeli chcesz zamienić numery wiersza i kolumny na kod klawisza (w innej
kolejności niż skanowane wiersze i kolumny) to najszybsze jest użycie
tablicy.

Odnośnie schematu: brakuje diod przy klawiaturze. Naciśnięcie
jednoczesne 2 klawiszy w tej samej kolumnie spowoduje zwarcie 2 rzędów
(w pewnej chwili na jednym wystawisz jedynkę a na drugim zero) i
popłynie niezły prąd. Możesz w takiej sytuacji włączać pull-up na pinie
zamiast wystawiać mocną jedynkę.

BTW: Dziwny masz pinout ISP. Jeżeli 6 pinów w rzędzie (zamiast
atmelowego 2x5) to ten jest bardziej standardowy:
http://www.amwaw.edu.pl/~adybkows/elka/ispprog.html

--
Adam Dybkowski

Uwaga: przed wysłaniem do mnie maila usuń cyfry z adresu.

Saper/nolin11
Guest

Fri Jan 26, 2007 9:11 pm   



Adam Dybkowski wrote:
Quote:
Saper/nolin11 napisał(a):

DDR(I2C_SCLPORT) |= 1 << I2C_SCL;
PORT(I2C_SDAPORT) |= 1 << I2C_SDA;

A cóż to za dziwadła czy nowa moda? Nie dało się normalnie zapisać
dostępu do tego rejestru DDR i portu?

Jakoś mi tak wygodnie Smile mogę napisać: DDRD |= 1 << I2C_SCL;

Quote:

Jeżeli chodzi o skanowanie klawiatury - dodaj odstęp pomiędzy

Odstęp czyli jakieś opóźnienie rozumiem

Quote:
wysterowaniem wiersza a odczytem kolumny. Przy okazji możesz nieco
uprościć i rozjaśnić kod używając pętli zamiast wielokrotnie konstrukcji
podobnych do siebie. Dziwne też, że masz zdefiniowane maski wierszy (np.
SW_ROW1) a nie masz masek kolumn (sprawdzasz wartości 0x80, 0x40 itp).

A ja jestem dziwny człowiek Very Happy ,a sprawdzam tak to mi widocznie wygodnie
Smile) się pisało
Quote:
Jeżeli chcesz zamienić numery wiersza i kolumny na kod klawisza (w innej
kolejności niż skanowane wiersze i kolumny) to najszybsze jest użycie
tablicy.
Nie chce mi się myśleć Very HappyD tak się szybciej napisało Smile


Quote:

Odnośnie schematu: brakuje diod przy klawiaturze. Naciśnięcie
jednoczesne 2 klawiszy w tej samej kolumnie spowoduje zwarcie 2 rzędów
Ja to głównie będę obsługiwał więc mi to nie przeszkadza Smile


Quote:
(w pewnej chwili na jednym wystawisz jedynkę a na drugim zero) i
popłynie niezły prąd. Możesz w takiej sytuacji włączać pull-up na pinie
zamiast wystawiać mocną jedynkę.
I tak robię, kolumny mają DDR=0 i PORT=1 ,a wiersze DDR=1 i PORT=0


Quote:

BTW: Dziwny masz pinout ISP. Jeżeli 6 pinów w rzędzie (zamiast
Ten za duży...


Quote:
atmelowego 2x5) to ten jest bardziej standardowy:
Tak mi pasuje żeby ścieżek nie plątać Smile




Przerobiłem procedurkę tak żeby mi skanowała wierszami i jest teraz ok Smile)
ale problem mam teraz z i2c :/ ,ale na to już inny wątek otworzę.....


--
Saper/nolin11
majl:nolin11_USUN_TO_@interia.pl
gg:4476700

elektroda NewsGroups Forum Index - Elektronika Polska - Nieodczytywanie kolumny 3 w skanowaniu klawiatury z użyciem AVR-GCC

NOWY TEMAT

Regulamin - Zasady uzytkowania Polityka prywatnosci Kontakt RTV map News map