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
Didn't find your answer? Ask the community — no account required.
M
Mikkel Lund
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"
H
HKJ
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.
T
Tomas .
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
T
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
H
HKJ
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
T
Tomas .
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
M
Mikkel Lund
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"
H
HKJ
Ja.
T
Tomas .
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
T
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
H
HKJ
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.
P
Poul Bundgaard
formatting link
T
Tomas .
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
S
skott
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?
F
Flemming Frandsen
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
T
Tomas .
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
F
Flemming Frandsen
Som du siger, shift left?
Udtrykket (1
Join the Discussion
Have something to add? Share your thoughts — no account required.
Didn't find your answer?
Ask the community — no account required
Report Content
You are reporting this content to the moderators. They will look at it
ASAP.