Scanning af 4x4 matrix med AVR - Page 2

Do you have a question? Post it now! No Registration Necessary

Translate This Thread From Danish to

Threaded View
Re: Scanning af 4x4 matrix med AVR
Tomas . skrev:
Quoted text here. Click to load it

char key(void){
switch(portd){
    case 0x00:
        return no_key;
        break;
    case 0x11:
        return 1;
        break;
    case 0x12:
        return 2;
        break;

    osv......

    default:
        return unknown_key;
        break;

}}

Sammenligner porten med et mønster der svare til en tast.

--
Hilsen Mikkel Lund
"Sund fornuft, har aldrig stoppet en tosse"
We've slightly trimmed the long signature. Click to see the full one.
Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it
matrice... :-)
Quoted text here. Click to load it

Det ser jo spændende ud.
Jeg vil se, om det ikke kan føre til noget brugbart.
Tak for tålmodigheden :-)

--
Mvh.

Tomas


Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it


Porte? Tastatur scanning køres da bedst i et timer interrupt!

Og det er stadig lettets at bruge de samme 4 output bits til begge scan.





Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it

Det er nok rigtigt, og mest strømbesparende, hvis man vil have
den del med også.
Quoted text here. Click to load it

Hvordan vil du (tegne) løse den opgave?

--
Mvh.

Tomas


Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it

I en 4x4 matrix er de 4 ledninger output og de andre fire ledninger
input. De fire input ledninger har pullup til Vcc (Evt inbygget i
MPU'en) og de 4 output er også Vcc i hviletilstand.

Når du scanner tager du på skift og lægger en af de 4 output til 0 volt
og læser de 4 input, hvis et af input er 0, så er en tast nedtrykket i
din matrix, lige hvor input/output krydser.

Så din kode vil være:

for (i=0;i<4;i++) {
   Sæt output bit lav

   læs input fra keyboard og se om en bit er lav

   læs input fra følere og se om en bit er lav

}

Bemærk at sådan en matrix kan give problemer, hvis du trykker på flere
taster samtidig, den eneste måde at løse det 100% på er at have en diode
i serie med hver tast.









Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it

Jeg vil da prøve at se, hvad jeg kan finde ud af. Takker.

Quoted text here. Click to load it

Altså for at sikre, at strømmen kun løber mellem eet output og
eet input?
--
Mvh.

Tomas


Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it

Ja.





Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it
og

Den løsning havde jeg også overvejet. Og de 0.7V spændingsfald
skulle jo ikke gøre, at controlleren ikke kan detektere korrekte
niveauer, når man køre 5V

--
Mvh.

Tomas


Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it

Der er ingen grund til det, hvis du kun regner med at bruge en tast af
gangen.
For at undgå kortslutning af to output kan man programmere MPU'en til at
bruge oc output og pullup (2 taster samtidig er ok), eller sætte en
modstand i serie med hver udgang (2 taster samtidig kan give forkert
aflæsning).
Eneste problem er så at 3 samtidige taster kan se ud som 4 taster og det
kan kun løses med dioder.

De ovenstående problemer vil kun opstå ved bestemte tastkombinationer, i
mange tilfælde vil 2 og 3 taster sagtens kunne aflæses.


Det jeg så har sprunget over er debounching, som kan være nødvendigt.
Det klares ved at forlange at en tast skal være nede i over 20 ms
(værien er lidt afhængig af hvilken type tast du bruger), før den bliver
rapporteret som en tast. Det kan klares ved at gemme den gamle
portaflæsning i en array og hvis aflæsningen skifter, så vent 10 ms og
læs igen, hvis den stadig er skiftet, så accepteres tasttrykket.

Grunden til at det kan være nødvendigt er at kontakter ikke bare tænder
og slukker, de står faktisk og hopper mellem tændt/slukket en del gang,
lige når man skifter.

Hvis du scanner langsomt, vil du selvfølgelig ikke se det, men jeg har
tit gemt tastscannet i samme rutine som multiplexer et led display og så
er mit scan ret hurtigt.













Re: Scanning af 4x4 matrix med AVR
http://winavr.scienceprog.com/example-avr-projects/4x4-keypad-example-using-avr-gcc-c-language.html



Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it

Det er jo lige det, jeg har ledt efter :-)
Men funktionen bit_is_set(), hvor finder jeg den? Den er ikke at finde
i CodeVision, som jeg anvender. Findes den i AVR-GCC?



Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it

Måske skal du starte med at læse en bog om C, den investering kommer
godt igen:)

Hvis du vil teste x for en enkelt bit så skriver du bare:

if (x & (1 << bit)) {
   ...
}



Tastatur scanneren kan vel laves som denne lille funktion, den
returnerer 255 hvis der ikke er trykket på noget, eller 0-31 afhængigt
af hvilken knap der er trykket på:

char scanKey() {
  for (int i=0;i<4;i++) {
   output = 1 << i;
   //Delay et par us.
   data = input;

   for (int j=0;j<8;j++) {
    if (data & (1 << j)) {
     return i | (j<<2);    
    }
   }
  }
  return 255;
}


Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it

Jeg har nu ok styr på alm. C, men det er den embeddede del, jeg
ikke er helt så garvet i endnu, men prøver :-)
Quoted text here. Click to load it
Denne skrivemåde er jeg dog ikke helt med på (1 << bit)
normalt ville jeg tage det som left shift, men hvordan fungerer
det her?

Quoted text here. Click to load it

Ret simpelt egentligt. Din in- og output vil du så #define som
PORTx, har jeg ret?

--
Mvh.

Tomas


Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it

Som du siger, shift left?

Udtrykket (1 << y) laver værdien for netop bit nummer y, når man så
and'er med den resulterende værdi så kan man se om netop den bit er sat.

Din bit_is_set(x,y) funktion er altså bare: x & (1 << y)

1 << 0 == 1
1 << 1 == 2
1 << 2 == 4
1 << 3 == 8
...
1 << 7 == 128


Quoted text here. Click to load it

ja.

Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it

Det er kun planen, ja, men man kan jo aldrig 100% sikre sig mod
fejlbrug :-)

Quoted text here. Click to load it

OK, det var jeg ikke lige bekendt med, takker
Quoted text here. Click to load it

God ide. det tror jeg, jeg vil prøve. Det burde heller ikke være
svært at implementere.
Quoted text here. Click to load it

Jeps. Glitch er en træls effekt, men det er jo problemet med
elektromekaniske komponenter...
Quoted text here. Click to load it

OK. Forståeligt :-)

--
Mvh.

Tomas


Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it

Hvorfor 2 gange, kan du ikke genbruge output pinde til at scanner nummer
2 keypad med?

Re: Scanning af 4x4 matrix med AVR
Quoted text here. Click to load it

Hvordan ved man så, hvilket keypad, der er trykket på?

--
Mvh.

Tomas


Re: Scanning af 4x4 matrix med AVR

Quoted text here. Click to load it

Ved at du *IKKE* genbruger input benene.

Så 4 bit ud til Y1 + Y2  (fordi Y1 = Y2)

Og 8 bit ind fra X1 og X2...


Site Timeline