M-tast

Fra Kommunikation-IT Holstebro HTX
Skift til: navigering, søgning

Modulet M-tast er lavet til at fungere i en software, hvor der konstant loopes i en menu, hvor man venter på en tasteværdi.

Hardwaren er baseret på et antal kontakter der er placeret i en 2-dimensionel matrix. Man af læser tastaturet ved at sende signaler ind på den ene led og aflæse på den anden led i matrixen.

Tastaturet er her realiseret med 9, 12 og 16 taster i matrix på hhv. 3x3, 3x4 og 4x4.

Princip-diagram for Matrix-tastaturet

Som det kan se her, så er tastaturet baseret på 3 gange 3 taster der er placeret i 3 rækker og 3 kolonner.

Man aflæser tastaturet ved at sætte en række høj ad gangen, mens de andre rækker er lave. Her kan man så læse de 3 taster der er i rækken. Derefter kan man sætte den række lav og den næste række høj, og tilsvarende med den sidste række, så man af 3 omgange kan få aflæst alle 9 kontakter.

Hvis der ikke er trykket på nogen tast, så vil R1 - R3 sørge for at der kommer 0V ind til PIC-benene, så man på kolonnerne kan aflæse at der ikke er trykket på noget.

Hvis der trykkes på en tast, så kommer der en spænding ind svarende til den tast i den række hvor kontakten er placeret

Til modulet er der udviklet en generel JAL-fil, der ligger sammen med et par eksempler inde i ZIP-fil med software. Der er også udviklet print som Eagle-filer: Board og Schematich ligger i en ZIP-fil med print.

Størrelserne af modstandene er ikke så kritiske. R1 til R3 skal være en relativ stor modstand, da den fungerer som pulldown - hvis man skal bruge tastaturet på A-porten, hvor der sidder 4,7 k i serie med signalet, så er det en fordel at modtandene er over 33k - her er valgt 100k, hvilket også fungerer fint. Der skal nok ikke vælges meget større modstande, af hensyn til støj og skiftetider mellem rækkerne. R4 er dimensioneret til at give 5 mA i LED1, så den giver et fornuftigt lys.

Principskitse af Matrix-tastaturet

Diagrammet med 9 taster, der giver fra 0 til 8

Print med 9, 12 og 16 taster

Som vist i diagrammet ovenover, så kan man placere 9 kontakter i en matrix på 3 x 3. Dette kræver 3 indgange og 3 udgange, altså i alt 6 ben på en port.

På tilsvarende vis kan man placere 12 kontakter i en 3 x 4 eller en 4 x 3 matrix. Dette vil kæve 7 ben på en port, enten som 3 udgange og 4 indgange (er lavet som print) eller 4 udgange og 3 indgange (er ikke lavet som print).

Den sidste version der er lavet som print er 16 taster placeret i en 4 x 4 matrix, som så kræver 8 ben i en port, altså alle ben i porten.

Tasterne i diagrammet er placeret på samme måde som på printet, så de sidder som et numerisk tastatur f.x. på en telefon med 1 2 3 øverst og 0 nederst i midten, hvor 10 og 11 er placeret uden om, som så kan anvendes som en slags funktionstaster.

3 x 3 Tastatur Layout

Layoutet på det viste 3 x 3 tastatur i diagrammet ovenfor.

4 x 3 Tastatur Layout

Layoutet på det viste 4 x 3 tastatur i miniaturen til højre.

4 x 4 Tastatur Layout

Aflæsnings-princip for matrix-tastatur med 16 taster

Dette aflæsningsprincip følger IKKE det princip der anvendes til M_tast modulet skrevet i JAL.

På figur 2.1 ses en tabel af hvordan et matrix-tastatur med 16 taster ser ud. Her er der ingen af linjerne der har forbindelse til hinanden, men alle de steder hvor linjerne krydser hinanden, skal der være en tast. Dette kan ses på figur 2.2, hvor tasterne er tegnet ind med to streger. Hver tast er koblet til en lodret linje og en vandret linje, her skabes der en forbindelse mellem linjerne, når en tast trykkes ned.

Når en tast trykkes ned bliver den læst ved hjælpe af tovejslæsning. Det man skal sørger for er, at hver kolonne samt ben har forbindelse til hver sit ben på en port, derfor benyttes der en 8-bens port, da der er 4 kolonner og 4 rækker. På porten sættes der 4 ben til at være output og 4 ben til at være input, så det er lige fordelt. På figur 2.2 er ”y-benene” output, mens ”x-benene” er input. Alle forbindelserne har i dette aflæsningsprincip pull-up modstande til keyboardet.

Figur21.jpg

Figur 2.1 Layout af matrix uden taster

Alternativt aflæsningsprincip

Når der ingen taster er trykket ned, vil alle 4 output vise 0, altså vil der hele tiden sendes 0000 ud. Samtidig vil mønsteret på input porten vise 1111, da pull-up modstandene gør det, at der altid vil være 1 på x-benene (de lodrette). Når der så trykkes på en tast vil den pågældende kolonne vise 0, da rækken den forbindes med ved et tryk på en knap er 0, dog vil de andre forblive 1. Vis vi eksempelvis trykker på knap 10, så vil X2 begynde at vise 0 i stedet for 1, da den kommer i forbindelse med Y2, der er 0. Vi har nu defineret hvilken kolonne tasten befinder sig i, og mangler derfor hvilken tast det er. Når input porten er blevet læst og der er blevet registreret et tryk på en tast, ved at input porten bliver 0, så vendes portene således, at det der før var output bliver input, og det der var input bliver til output. X-benene bliver nu de nye output-ben som alle vil sende 1 ud på nær et, hvilket er det ben/kolonne, der bliver trykket ned, og derfor sender 0 ud. Alle y-benene vil nu modtage 1 pga. pull-up modstanden på nær det ben, hvor tasten er trykket ned, da den modtager 0 fra den kolonne den er i forbindelse med. Programmet dette RC-/matrixtastatur kører med kender nu både den kolonne og række tasten er trykket ned på. Programmets software kan nu via koordinaterne til denne tast bestemme hvilken tast der trykkes på, ved at omskrive koordinaterne til kode. På denne måde vil softwaren kunne registrere en hver tast, der denne trykkes ned. Vis to taster trykkes ned samtidig, vil den først tage den der først registreres og derefter den næste tast, når den først er sluppet.

Figur22.jpg

Figur 2.2 Layout af matrix med taster

Board og Schematich ligger i en ZIP-fil.

Software modulet M_tast.jal

Softwaren er baseret på princippet, hvor man sætter output på rows, med høj på en row af gangen. For hver row læses alle columns, hvor der placeres en pull-down på hver column (som der er i printudlægget). Ud fra dette bestemmes hvilken tast der er trykket ned.

Tastaturmodulet arbejder desuden med at der skal foretages et antal ens aflæsninger, før der sendes tasteværdien EN gang.

Når man vil anvende M_tast modulet, så skal man include M_tast.jal som følger:

include M_tast

Hvis M_tast.jal ligger i \lib inde i c:\jalpack så kan compileren finde modulet.

M_tast anvender kun delay som man normalt includer.

JAL-filen ligger sammen med pin-filen M_tast_def.jal et eksempel inde i Zip-fil

M_tast er testet på følgende kombinationer:

PIC pin
PIC16F684 portA
PIC16F690 portA og PortC
PIC16F690 portA og PortB med ALCD på port C

Interface fil til M_tast

Ud over de andre filer skal der lægges en M_tast-def.jal i den mappe hvor man har sine egne filer liggende. Denne fil definerer hvordan ens tastatur ser ud, så M_tast er et generelt modul, der kan anvendes til mange forskellige tastaturer.

I M_tast-def.jal angives hvor mange taster der er på tastaturet ved at angive hvor mange der er i hver række og hvor mange der er i hver kolonne:

Const num_Rows = 3  -- Antallet af Rows (rækker) (Max 4 i denne software)
Const num_Cols = 3  -- Antallet af Cols (kolonner) (Max 4 i denne software)

I M_tast-def.jal angives hvilke ben der anvendes til aflæsningen, henholdsvis som rækker og kolonner:

var	bit	Row_A   is  pin_a0	-- første multiplexer output
var	bit	Row_B	is  pin_a1	-- andet multiplexer output
var	bit	Col_1	is  pin_a3	-- Sense-ledning på første række
var	bit	Col_2	is  pin_a4	-- Sense-ledning på anden række

Der er angivet flere ben i filen, hvor der så er betingelse på hvor stor en matrix man bruger, som f.x.:

if num_rows > 2 then
var	bit	Row_C	is  pin_a2	-- tredie multiplexer output
end if

Det er ikke nok at rette i ben-definitionen, man skal også huske at tilrette ben-direction-definitionen:

var	bit	Row_A_dir  is	pin_a0_direction
var	bit	Row_B_dir  is	pin_a1_direction


Endelig kan man indstille hvilken værdi der skal anvendes når der ikke returneres en tasteværdi, hvor lang en pause der skal være fra row-benet er sat til der læses på col-benet, og endelig hvor mange ens aflæsninger i træk der skal til, for at M_tast sender den valgte tast. Det gør man ved:

Const     No_tast = 255
var byte  M_mux_pause = 10   -- Pause i mikrosekunder fra MUX-ledningen sættes til der læses
var byte  M_antal_for_OK = 5 -- Antal ens læsninger på tastaturet før tasten godkendes

Anvendelsen af M_tast modulet

Man skal kalde M_tast mange gange for at få en godkendt aflæsning fra tastaturet, så det gør man i sit forever loop, hvor man sørger for at der ikke er andet der tager væsentlig tid.

Når den ikke finder en godkendt tast, så returneres der værdien af no_tast, så man kan se at det ikke er en godkendt tast. Hvis en tast er holdt nede, så M_tast kan læse den det valgte antal gange, så returneres tasten EN gang med et tal der ligger fra 0 til antal taster - 1.

Et simpelt demo-eksempel kunne se ud som følger:

portC_direction = all_output
include M_tast
var tast

forever loop
  tast = M_tast
  IF tast != no_tast THEN
    portC = tast
  END IF
  --
  -- Her kan placeres anden kode i loopet, der skal lave andre ting
  --
end loop

Programmet vil med det viste tastatur fungere sådan at det binære tal der læses ud på port C vil være den tast der er trykket på, og den vil først skifte når der trykkes på en ny tast. Tallet der læses ud vil være 0 - 11 (binært fra 0000 til 1011).

Moduler på Holstebro HTX
Tastaturer Displays AD-konvertering I/O-ekspander Serielt Interface Færdige Andre
RC-tast - AD-tast - M_tast ALCD - LCD ADC_holst - ADC
mcp3201 - mcp3208
input - output Seriel_holst - Serial hardware
Serial hw int cts - Serial software
Stepmotor - RFID
RGB - RF-link - Afstand
Humidity - Analog temp - Dig temp
Accelerometer
Rotary Encoder

Oversigt over Hardware Moduler på Holstebro HTX