M-tast
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. |
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. Layoutet på det viste 3 x 3 tastatur i diagrammet ovenfor. Layoutet på det viste 4 x 3 tastatur i miniaturen til højre. |
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. |
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. |
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





