klavier 7kol x 3row uitlezen

Bascom vrienden,

ik ben in het bezit van 2 klavieren 7kol x 3row's die ik wil gebruiken in een labo toestel (pulsgever/teller/freq.meter)
Daarvoor wil ik een Atmega 88/168 gebruiken omdat daar alle i/o pennen ook als interrupt kunnen gebruikt worden.

mijn vraag:
kan ik (in bascom aub, meer ken ik niet) gebruik maken van de functie getkbd()?
voor een matrix 4x4 op één poort is dat geen probleem, heb ik al gedaan.
Ik wil dus wel op interrupt basis werken want de µC heeft nog andere dingen te doen.
Pin bezetting is als volgt;
col_1 = D6 (pcint22)
col_2 = D5 (pcint21)
col_3 = D4 (pcint20)
col_4 = D3 (pcint19)
col_5 = D2 (pcint18)
col_6 = D1 (pcint17)
col_7 = D0 (pcint16)
Vallen onder PCINT2

row_1 = C0 (pcint23)
row_2 = C1 (pcint24)
row_3 = C2 (pcint25)
Vallen onder PCINT1

C5 (scl) en C4 (sda) wil ik bewust vrijhouden om via I²C te praten met een Atmega 32 die het meetwerk voor zijn rekening zal nemen.

Heb dus alleen een routine nodig om mijn klavier uit te lezen op twee poorten, weet niet hoe het moet en of kan met de functie Getkbd().

de ingevoerde data moet op een display komen die op poort B zit en tevens via I²C verstuurd worden naar de Atmega32.

Zou het zeer op prijs stellen als iemand mij kan helpen. Ik ken alleen bascom dus geen C oplossingen aub, ben al te oud om dat ook nog te leren, lol.
groetjes

buckfast_beekeeper

Golden Member

Ik denk dat je beter met 1 interrupt werkt (volgens mij PCINT1) en dan kijken welke kolom er bij hoort. De 2 interrupts worden volgens mij niet precies gelijk afgevuurd.

ps: het zijn wel degelijk 8 poorten ipv 1 maar 1 interrupthandler die je gebruikte in een 4x4 matrix.

Van Lambiek wordt goede geuze gemaakt.
Arco

Special Member

Rows en columns beide een interrupt is zinloos. In een matrix is een van beide een output, en de andere een input.
Bij de output zijde is een interrupt zinloos. De waardes daar stel je zelf in, dus je weet al wat daar gebeurt.

Beste is om de row als output te zetten en de cols als input. Dan alleen wachten op een interrupt en dan pas de keys gaan scannen.
Wat het beste is hangt van de gewenste functionaliteit af. Wil je alleen weten of en wat er ingedrukt wordt, of ook hoe lang?
Bijv. om een repeteerfunctie te krijgen. Als toets ingedrukt blijft wordt na bijv. 1 sec. de toetswaarde herhaald. (zoals bij een PC keyboard)

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

Hallo Arco,
Bedankt voor de tip, maar kan je me een basisprogrammatje maken hoe ik er moet aan beginnen?
Met het programmatje dat ik gebruikte voor een 4X4 matrix op één poort kan ik niet verder vermoed ik.
Ik weet in de verste verte niet hoe ik er moet aan beginnen om op twee poorten te werken. kan dat ook met getkbd()?
Dit heb ik nu gemaakt en het werkt, kkrijg bij elke toetsaanslag het getal ven die betreffende toets. (er kunnen typefouten instaan want ik heb het zomaar ingetikt, moet nog eens uitzoeken hoe ik de listing van mijn compiler naar de site kan copieren (draaien op twee verschillende pc's.....

4x4x matrix
$regfile ="m88def.dat"
$crystal = 8000000
Config kbd = portd
Dim B as byte
Dim matrixkey as byte
Matrixkey = 255
PCmsk0=&B00001111

on Pcint0 matrixinput
enable Pcint0
Enable interrupts

do
'doelstelling
Loop

Matrixinput :
Disable interrupts
Waitms 2
B = GETKBD()
Waitms 2
If B<16 then print "keynr.";B;"ontvangen"

Select case B

Case 0 = goto 0_handler
Case 1 = goto 1_handler
"
"
"
"
Case 16 = goto Return_from_interrupt
End select

Return_from_interrupt:
Enable interrupts
Return

0_handler:

blablabla wat er moet gebeuren....
goto wait_for_matrix_16

Wait_for_matrix_16:
B= Getkbd()
If B = 16 then goto Return_from_interrupt

goto wait_for_ matrix_16

End

Er is geen repeteerfunctie nodig.

buckfast_beekeeper

Golden Member

Kopiëren kan je via een copy paste naar notepad(++) en dan op je andere pc het txt bestand copy paste naar het forum. Zet je code ook even tussen code tags. Dat leest een stuk handiger.

Ik ken geen bascom, dus weet ook niet wat die getkbd() verder doet.

Wat je moet doen? Je krijgt een interrupt, je kijkt dan welke kolom de interrupt veroorzaakte en je gaat na welke rij daar bij hoort.

Van Lambiek wordt goede geuze gemaakt.

Dank u, klinkt eenvoudig zoals je dat schrijft maar hoe moet ik dat concreet in een programmatje gieten? kan je eens een voorbeeldje (Bascom AVR) in elkaar boxen aub ? Please

Bedankt Arco en anderen voor jullie steun en hulp.

Ik ben maar eens begonnen met een correct keypad.
Ik was uitgegaan van een bestaande keypad-display configuratie.
Had met de multimeter en een beepertje alle toetsen uitgemeten en dat leek te kloppen. 3 rijen / 7 collonnen.
komen allemaal op een 40 polige header samen met de display aansluitingen.
Bij het aansluiten op een Atmega 32 waarvoor ik slechts vier collonnen en de drie rijen gebruikte.
Bleek dat er allerlei gekke toestanden waren. ik kreeg bv 19 met geen enkele toets ingedrukt. en voor elke kolon drie maal hetzelfde.
Bij nader inzien is dat ding opgebouwd uit vier printen op elkaar met honderden via's....
Heb nu elke rij en elke colon met een scalpel en lötfedler geissoleerd naar de 40 polige header gebracht. Geen sinecure !!!
Nu heb ik een correct keypad en display en kan ik eindelijk aan de slag met software.
Het is me nog steeds niet duidelijk hoe ik op twee poorten moet werken.

Veronderstel dat ik de gebruikte pennen (portC) van de rijen laag moet maken (DdrC = &B10001111) en dan met PinD (col 1 to 7) gaan kijken welke laag wordt als ik een debetreffende toets indruk.

Moeten er weerstanden (470 E) in alle lijnen naar de µC zitten ter bescherming van de poorten of is dat niet strikt noodzakelijk? sluiting kan eigenlijk maar alleen als er twee of meer toetsen tegelijk ingedrukt worden?
Ik heb er alle begrip voor dat jullie me geen kant en klaar programma willen geven. ik moet het zelf uitdokteren, alleen zo zal ik het leren.
Maar hier en daar een beetje raad aan een probi mag wel denk ik....

en heb vaak problemen met inloggen. moet haast elke keer een nieuw paswoord vragen, hoewel ik HEEL zeker ben dat ik het juiste heb ingevuld.

in bijlage enkele foto's van het ondertussen naakte ontmantelde keypad.

hallo ben hier al terug,
In een 3Rx4C configuratie heb ik altijd één toets die ik niet kan gebruiken.
Get kbd geeft altijd 16 als geen enkele toets is ingedrukt.
Maar ik heb blijkbaar een toets met de waarde 16

col1 col2 col3 col4
DB0 DB1 DB2 DB3

r1/DB4 06 16 26 36

r2/DB5 46 56 66 76

r3/DB6 86 96 10 11

Arco

Special Member

Ik heb er alle begrip voor dat jullie me geen kant en klaar programma willen geven. ik moet het zelf uitdokteren

Geen kwestie van niet willen; bascom is niet echt 'mainstream'... ;) (je moet net iemand treffen die daar mee werkt)
Weerstanden in de portlijnen is niet echt noodzakelijk als je er voor zorgt dat row/col nooit beiden tegelijk output worden...

Arco - "Simplicity is a prerequisite for reliability" - hard-, firm-, en software ontwikkeling: www.arcovox.com

hallo,
probleem "16" opgelost.
row 1 op BD.5 ipv BD.4 / row2 op BD.6 ipv BD5 / row3 op BD7 ipv BD6

krijg nu row1 ; 46 / 56 / 66 / 76
row2 ; 86 / 96 / 10 / 11
row3 ; 12 / 13 / 14 / 15

nu op naar waar ik heen wil. 3row / 7col
op hoop van zegen.....

thanks anyway until here.

groetjes
Geertie

dank u Arco, zal ze voor alle zekerheid toch maar plaatsen, als die 15 cent aan weerstanden een ATMEGA kunnen beschermen.... print moet toch nog ontwikkeld worden. alles zit voorlopig op ex. board.
thanks

benleentje

Golden Member

Veronderstel dat ik de gebruikte pennen (portC) van de rijen laag moet maken

Dat kan. HEt kan ook andersom door 1 van de rijen hoog te maken. En dan is een ingedrukte toets een hoog signaal.

Config kbd = portd

Zijn er nog andere configuratie mogelijkheden ?

In principe heb je denk ik ook geen eens interups nodig voor de toetsen, als je het keybord aansluit dat een ingedrukte toets hoog is. Je maakt dan 1 rij hoog en leest de hele poort in 1 keer uit als een byte. Als de byte 0 is dan is er ook geen toets ingedrukt. Dat werkt denk ik net zo snel als een interupt.

En als de byte niet 0 is dan heb je de waarde gelijk al en kan je direct vertalen naar een ingedrukte toets.

als die 15 cent aan weerstanden een ATMEGA kunnen beschermen...

Zet ze dan wel in de uitgangen dus in de rijen en dan zo dicht mogelijk bij de Atmega. Maar aan de andere kant als alle draden goed vastzitten en in de behuizing dan kan er weinig gebeuren.
Wel n leuk toetsen bord en inderdaad de moeite waard op daar even wat tijd in te stoppen.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.

Met de functie Getkbd() kun je geen andere matrix gebruiken (4x4 of 4x3), je moet er zelf een maken.
In uw gesloten dubbeltopic had ik al een link gezet hoe je dat kunt doen.
http://www.qsl.net/pa3ckr/bascom%20and%20avr/keyboards/index.html

LDmicro user.

Bete MGP,
bedankt voor de link, die ben ik het nu aan het doorgronden.Helaas is het het is alweer gebaseerd op een 4x4 matrix[/b] wat me dus geen spatje verder helpt.
Ik moet kunnen werken met 2 poorten (C voor de rijen en D voor de col).
PortB is gebruikt voor het 16x1 display en uiteraard ook de ISP aansluitingen.
moet dus gaan brainstormen in een programma dat eigenlijk helemaal niet gemaakt is voor wat ik wil bereiken.
Gezien mijn beperkte kennis ter zake kan dat nog wel enkele maanden aanslepen. Tegen dan is het weer zomer en is er voor electronica geen tijd meer want dan heeft de grote tuin en de moestuin prioriteit.
Heb zo een bruin vermoeden dat mijn droom om ooit een 3x7 klavier in te lezen een droom zal blijven.....Had ze beter maar gelijk op de container gegooid.(heb er twee zo, en dan nog enkele andere modellen)

Ach, ik ben toch al 63, over een paar jaar hoef ik geen 3x7 klavier meer. Dan bibber ik van de pot naar mijn bed en als het even meezit misschien nog tot aan de keuken voor een boterhammetje dat een of andere sociale medewerker probeert tussen mijn valse kiezen te krijgen.
Einde carriere dus...bay bay droom...

hey Benleentje dat lijkt me een heel simpele oplossing !
doe morgen direct een poging, nu is het alweer tijd voor dat donsje....
Hartelijk bedankt voor de tip.

groetjes
Geertie

Doe niet zo meelijwekkend, daar kan ik niet tegen ;) ik ben 6 maanden ouder dan u en woon zelfs in dezelfde stad.
Moest dat mijn probleem zijn zou ik niet meer slapen tot het werkt.
En ja, programma's maken kost tijd, zweet en soms bloed en tranen en je wilt toch niet dat iemand anders dat allemaal ondergaat voor u :)

Ik ken geen bascom/AVR maar dat programma is toch goed te ontleden, het vergt alleen maar wat tijd en wat moed om dat tot een goed einde te brengen.
Dat is nu voor een 4x4 keyboard maar door andere poorten te definiëren en de data aan te passen moet het toch lukken...

Volgens mij zul je toch geen liefhebber vinden om een programma voor u te maken want via een forum is dat eigenlijk onbegonnen werk omdat de communicatie niet zo vlot verloopt als er vragen of (praktische)problemen zijn, om nog niet te spreken over de misverstanden.

LDmicro user.

Hey MPG,

Ja je hebt ergens gelijk hoor, ik moet het zelf uitvissen, alleen dan zal ik er iets van leren want dat is tenslotte de bedoeling. En als ik eruit geraak, zoals je zegt met bloed zweet en tranen zal de voldoening des te groter zijn!
En ik zal eruit komen !!!
als ik zover ben laat ik het je zeker weten, al zou het kunnen dat ik af en toe nog eens te rade kom bij jou of iemand van het forum voor onverklaarbare (voor mij dan) fenomenen.

Heb veel aan de link die je me stuurde, bedankt alvast, en nu mijn hardware op punt staat is het ook prettiger werken, nu kan ik me louter op software gaan concentreren.

groetjes

Geertie

Sorry moest natuurlijk MGP zijn. mijn verontschuldigingen voor het tikfoutje
Geertie

Dat is een betere ingesteldheid en het zal niet van een leien dakje lopen maar als je het voor elkaar krijgt ben je vertrokken voor veel meer..

Vragen mag je altijd stellen daar is CO voor gemaakt.

Hint:

In normale toestand zijn poortenB 4 5 6 7 output 'laag' en poortenB 0 1 2 3 zijn als input gezet

Als je naar het schema kijkt zie dat poortD6 (Int0) gebruikt wordt als interrupt pin voor alle knoppen.
Deze poort D6 is normaal hoog door de 10K weerstand en als deze laag wordt (Config Int0 = Falling) springt het programma naar de routine "Button"

Als je nu gelijk welke knop drukt dan wordt D6 omlaag getrokken omdat D4...7 laag zijn gezet.

De routine Button zoekt nu uit welke rij en welke kolom de interrupt veroorzaakt heeft en dan weet je welke knop het is.

Enz...;)

LDmicro user.

hallo MPG,

was een vruchtbare zondag voormiddag !!!!

ben eruit met mijn beestig klavier en display. zoals hier al gezegd, het heeft bloed en tranen gekost maar ik heb 'iets' bereikt.
Heb nu voor elke toets die ik druk een antwoord op het display.
Elke toets springt voorlopig naar een subroutine die me vertelt welke toets het is.
Met die sub routine kan ik later doen wat ik wil.....
iets starten/stoppen, of iets meten, een of andere procedure starten.....
Ik kan me voorstellen dat een echte programmeur het veel korter zal kunnen maken maar ik ben voorlopig tevreden met mijn resultaat en ben er trots op !!!

Nu ben ik op zoek naar een routine om getallen in te voeren, duizendtallen, honderdtallen, tientallen, eenheden...
cursor moet opschuiven (zoals op een rekenmachine en met het gevormde getal,niet de cijfers dus, wil ik naar een andere routine gaan (vb instelling van de frequentie van een blokgolfgenerator (in dezelfde atmega))
Maar daar zal wel nog een zondagvoormiddag aan hangen vrees ik...
in bijlage een pdfje met mijn programma(tje) amper 6% van mijn atmega32.
en een paar foto's van de opstelling nu en een nieuwe layout voor het toetsenbord..
bedankt voor de hulp, ik zag het niet direct zitten met die interrupts omdat die poort al bezet was.
dan kreeg ik een tip van benleentje,
Maak éen van de drie rijen (poort c)hoog en lees alle (7) coloms (poort D) in één byte binnen, uit de binaire waarde van poort D weet je direct welke colom hoog is en dus de desbetreffende toets is onmiddelijk bekend. Dan nog een beetje if - then -and en poort C laten flippen tussen de drie rijen....
Helemaal zonder interrups en even snel...?
Bedankt Benleentje !!!!
nu op zoek naar getallen ingeven.... zal eens zoeken op calculators in bascom daar zal wel iets te vinden zijn om de verschuiving van mijn digits te bewerkstelligen ??
Bedankt en fijne nacht nog,
Groetjes Geert.

Hey benleentje,

ik heb je voorstel gevolgd en een mooi resultaat geboekt. heeft wel wat bloed zweet en tranen gekost...
in bijlage mijn oplossing, voorlopig kont elke toets in een subroutine terecht die me op het display vertelt welke toets ik indrukte. Later kan ik met die sub doen wat nodig is uiteraard.
Ben ervan overtuigd dat jij het korter kan schrijven maar ik ben al tevreden met het resultaat.

Ben nu aan het uitzoeken hoe ik 'getallen' kan invoeren, duizendtallen, honderdtallen, tientallen, eenheden, zoals op een rekenmachine.
Verschuiven van de vorige ingevoerde digit, vermenigvuldiging, X10, X100, X1000. en dan het 'getal' niet de opeenvolging van cijfers gebruiken om vb een blokgolf generator in te stellen (in dezelfde atmega) Poort A is nog helemaal vrij.
Zal nog wel een zondagvoormiddag kosten om daaruit te komen vrees ik.
Ga eens zoeken op bascom calculators, daar haal ik wel iets uit denk ik ????

in bijlage ook nog enkele foto's van de proefopstelling en de nieuwe layout van het keyboard.

Hartelijk dank, zonder jou tip was ik er nooit uitgekomen vrees ik....
THANKS !!!

Groetjes Geert

benleentje

Golden Member

Getallen inlezen kan je als volgd doen.

Stel je typt
1, 0, 1, 0, enter
Dit zou 1010 moeten zijn

Leest dan eerst de de 1. Daarna komt er een 0. Dan vermenigvuldig je de eerste 1 met 10en tel 0 bij op.dan heb je 10.
Dan komt er weer een 1. Dan vermenigvuldig je het oude getal 10 met 10 en tel er 1 bij op enz.

bascom code:

A = Read key
If A = Enter then return (of iet anders)
IF read count = 0 then tussenresultaat = A
Else Som = tussenresultaat*10 + A 
     tussenresultaat = som
end else
Readcount = readcount + 1
Goto begin

LEt op deze code is niet goed. Moet je even aanpassen aan je eigen programmeer taal.

Mensen zijn soms net als een gelijkrichter, ze willen graag hun gelijk hebben.