Scanning af 4x4 matrix med AVR

Hejsa

Jeg skal igang med et projekt, hvor jeg anvender en AVR controller. Denne skal bl.a. kunne scanne to 4x4 matrix keypads. Koden hertil laves i C. Jeg mangler dog en application note til scanning af disse keypads. Det er ikke noget problem at finde en med et kodeeksempel i assembler, men er der nogen, der kan henvise til en i C, eller selv har lavet noget tilsvarende, jeg må have lov til at se, vil det glæde mig meget.

--
Mvh.

Tomas
Reply to
Tomas .
Loading thread data ...

Tomas . skrev:

Scanning af keypad? Du kan enten lave polling eller interrupt drevet. Ved du hvordan et keypad virker?

--
Hilsen Mikkel Lund
"Sund fornuft, har aldrig stoppet en tosse"
 Click to see the full signature
Reply to
Mikkel Lund

Mikkel Lund skrev:

Tja, det virker vel ved, at nogle porte er sat til output og andre til input - så sendes der på skift til 1 output af gangen, og derefter checkes, alle input, for at se, hvilket der er ændret...

--
Mvh.

Tomas
Reply to
Tomas .

Tomas . skrev:

Nej sådan virker det ikke som standart. Normalt er er en linje per række og per kolonne. Så sampler man på alle linjer, finde de to linjer der noget andet end de andre. De passer så med række og kolonne til den knap der er trykket. Så hvis du har nok input ben kan du bruge 8 til at dekode et 4x4 keypad, og hvis du har processor kraft til overs kan du polle på linjerne, så behøves du ikke noget ekstra hardware.

--
Hilsen Mikkel Lund
"Sund fornuft, har aldrig stoppet en tosse"
 Click to see the full signature
Reply to
Mikkel Lund

Mikkel Lund skrev:

Man har vel aldrig pinne nok :-) Jeg har lavet det, så jeg bruger en 8-bit port til at scanne et

4x4 keypad. Dette skal jeg så have 2 gange.
--
Mvh.

Tomas
Reply to
Tomas .

Tomas . skrev:

Okay. Så ville jeg bruge en 16 kanals MUX, dvs man kommer til at bruge 4 pins til adresse og en til at læse med.

--
Hilsen Mikkel Lund
"Sund fornuft, har aldrig stoppet en tosse"
 Click to see the full signature
Reply to
Mikkel Lund

En 16 kanals MUX? Den har da kun 1 input/output i forhold til de

16... Det må du hellere beskrive nærmere. Jeg benytter ellers en ATmega8515 til jobbet, så jeg har 2 porte ledig til de to 4x4 keypads.
--
Mvh.

Tomas
Reply to
Tomas .

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

2 keypad med?
Reply to
HKJ

Tomas . skrev:

Undskyld det skulle være en demux.

Hvad er problemet så? En pad per port!

--
Hilsen Mikkel Lund
"Sund fornuft, har aldrig stoppet en tosse"
 Click to see the full signature
Reply to
Mikkel Lund

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

--
Mvh.

Tomas
Reply to
Tomas .

Mikkel Lund skrev:

de

Det giver mere mening.

porte

Desværre nej. Jeg skal stadig have to stk. 4x4 keypads som input - altså i alt 32 knapper.

--
Mvh.

Tomas
Reply to
Tomas .

Tomas . skrev:

Jamen Tomas du har jo lige skrevet: "Jeg har lavet det, så jeg bruger en 8-bit port til at scanne et

4x4 keypad. Dette skal jeg så have 2 gange."

Du kan altså koble to 4x4 keypads til 2 porte (2x8bit).

--
Hilsen Mikkel Lund
"Sund fornuft, har aldrig stoppet en tosse"
 Click to see the full signature
Reply to
Mikkel Lund

Mikkel Lund skrev:

Ja, det er også det, jeg gør, men det giver jo omregnet også to knapper pr. bit.

--
Mvh.

Tomas
Reply to
Tomas .

Tomas . skrev:

JA, hvad er det du vil???

--
Hilsen Mikkel Lund
"Sund fornuft, har aldrig stoppet en tosse"
 Click to see the full signature
Reply to
Mikkel Lund

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...

Reply to
Flemming Frandsen

Mikkel Lund skrev:

også to

Sorry - Jeg prøver lidt tydeligere så...

På PORTA sidder 16 knapper. De 16 knapper er reelt 16 positionsmicroswitche.

På PORTD sidder et 4x4 keypad. Når en tast på PORTD påvirkes, skal en DC motor aktiveres. Denne vil gennem en gearing få en slæde til at bevæge sig. Under denne bevægelse, påvirkes en positionsswitch een af gangen. Motoren fortsætter med at køre indtil den positionsswitch med det samme nummer, som den tast, der tidligere blev trykket på, påvirkes.

Håber denne beskrivelse, hjælper på forståelsen af mit problem.

--
Mvh.

Tomas
Reply to
Tomas .

Tomas . skrev:

Okay, hvad er problemet så?

--
Hilsen Mikkel Lund
"Sund fornuft, har aldrig stoppet en tosse"
 Click to see the full signature
Reply to
Mikkel Lund

Mikkel Lund skrev:

problem.

Tja, mangel på kode i C, der kan håndtere dette :-)

--
Mvh.

Tomas
Reply to
Tomas .

Tomas . skrev: >

Okay, I get it now :-)

Du skal vel bare starte fra en ende af: En routine der kan læse et keypad. En routine der kan styrer en motor. En routine der kan læse knapper.

Lide slamkode:

while(1){ if(keypad() != no_push){ run_motor(); while(switch() != key){} stop_motor(); } }

--
Hilsen Mikkel Lund
"Sund fornuft, har aldrig stoppet en tosse"
 Click to see the full signature
Reply to
Mikkel Lund

Tomas . skrev: >

Okay, I get it now :-)

Du skal vel bare starte fra en ende af: En routine der kan læse et keypad. En routine der kan styrer en motor. En routine der kan læse knapper.

Lide slamkode:

while(1){ if(keypad() != no_push){ motor(run); while(switch() != key){} stop_motor(stop); } }

--
Hilsen Mikkel Lund
"Sund fornuft, har aldrig stoppet en tosse"
 Click to see the full signature
Reply to
Mikkel Lund

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.