Scanning af 4x4 matrix med AVR

Mikkel Lund skrev:

Denne application note beskriver nogenlunde det, jeg ønsker, skønt jeg ikke kører det interruptstyret (der nok var det smarteste) - jeg har ikke porte fri til interruptbrug, alle porte er i brug.

formatting link

Denne applikationnote er endnu smartere, og sparer samtidigt en port:

formatting link
Men kodemængden er dog rimelig stor, samt i assempler, jeg lykkeligt har glemt alt om, hvordan virker, så en simpel C-kode til håndtering af den første applikationkode - bare uden interruptfunktionen beskriver nok meget det jeg gerne vil. Så er det jo nærmest blot at gentage denne kode for den anden port.>--

Det er ikke helt skævt :-)

--
Mvh.

Tomas
Reply to
Tomas .
Loading thread data ...

Tomas . skrev:

Så er det bare på med kode kasketten, og komme i gang.

--
Hilsen Mikkel Lund
"Sund fornuft, har aldrig stoppet en tosse"
Jokeren i "Mænds ruin"
Reply to
Mikkel Lund

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.

Reply to
HKJ

Mikkel Lund skrev:

en

kode

er

port.>--

Hvilket jo desværre fører os tilbage til mit oprindelige spørgsmål nemlig, om der er en, der ligger inde med et kodeeksempel i C, der kan afkode et tastetryk i en matrice... :-)

--
Mvh.

Tomas
Reply to
Tomas .

Det er nok rigtigt, og mest strømbesparende, hvis man vil have den del med også.

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

--
Mvh.

Tomas
Reply to
Tomas .

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

Reply to
HKJ

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

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

--
Mvh.

Tomas
Reply to
Tomas .

Tomas . skrev:

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"
Jokeren i "Mænds ruin"
Reply to
Mikkel Lund

Ja.

Reply to
HKJ

Mikkel Lund skrev:

matrice... :-)

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

--
Mvh.

Tomas
Reply to
Tomas .

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
Reply to
Tomas .

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.

Reply to
HKJ

formatting link

Reply to
Poul Bundgaard

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

OK, det var jeg ikke lige bekendt med, takker

God ide. det tror jeg, jeg vil prøve. Det burde heller ikke være svært at implementere.

Jeps. Glitch er en træls effekt, men det er jo problemet med elektromekaniske komponenter...

OK. Forståeligt :-)

--
Mvh.

Tomas
Reply to
Tomas .

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?

Reply to
skott

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

Reply to
Flemming Frandsen

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 :-)

Denne skrivemåde er jeg dog ikke helt med på (1

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

--
Mvh.

Tomas
Reply to
Tomas .

Som du siger, shift left?

Udtrykket (1

Reply to
Flemming Frandsen

ElectronDepot website is not affiliated with any of the manufacturers or service providers discussed here. All logos and trade names are the property of their respective owners.