Knappar till MCU
Knappar till MCU
Hej,
Jag har tänkt att koppla några externa knappar till min AVR-P28-ATmega88.
Vad jag har förstått vore sannlikt det bästa för min del att köra DDRx som input (0) och PORTx som resistor pull-up (1).
Anoden från knappen bör kopplas GND. När "connection" sker (knapptryck) får jag signal på PINx porten som är satt enligt ovan. Låter detta vettigt? Något annat att tillägga?
Har tänkt investera i en tennsug. På Electrokit finns två modeller (länk). Den ena har ESD, alltså motstånd mot att elektrostatisk urladdning, den andra har inte är och billigare. Har lite dåligt med pengar så jag är sugen på den billigare, eller är det värt att investera i den med ESD? Vet inte hur stor risken är att man bränner kretskortet.
Mvh
Simon
Jag har tänkt att koppla några externa knappar till min AVR-P28-ATmega88.
Vad jag har förstått vore sannlikt det bästa för min del att köra DDRx som input (0) och PORTx som resistor pull-up (1).
Anoden från knappen bör kopplas GND. När "connection" sker (knapptryck) får jag signal på PINx porten som är satt enligt ovan. Låter detta vettigt? Något annat att tillägga?
Har tänkt investera i en tennsug. På Electrokit finns två modeller (länk). Den ena har ESD, alltså motstånd mot att elektrostatisk urladdning, den andra har inte är och billigare. Har lite dåligt med pengar så jag är sugen på den billigare, eller är det värt att investera i den med ESD? Vet inte hur stor risken är att man bränner kretskortet.
Mvh
Simon
Re: Knappar till MCU
En knapp har ingen "anod".
Annars är det väl helt normalt. Menar du intern pullup ?
Sedan kan du t.ex ha lite "polling" via en timer för att läsa av knapparna...
> När "connection" sker (knapptryck) får jag signal på PINx
"Får signal" är kanske inte helt korrekt. Pinnen kommer att gå "hög".
Glöm inte kontaktstudsarna...
Annars är det väl helt normalt. Menar du intern pullup ?
Sedan kan du t.ex ha lite "polling" via en timer för att läsa av knapparna...
> När "connection" sker (knapptryck) får jag signal på PINx
"Får signal" är kanske inte helt korrekt. Pinnen kommer att gå "hög".
Glöm inte kontaktstudsarna...
Re: Knappar till MCU
>Sedan kan du t.ex ha lite "polling" via en timer för att läsa av knapparna...
- Är inte detta smidigare att lösa med interrupt, eller vad har du i åtanke?
Har inte alls läst något om timers ännu, får väl snart hoppa på det. Rent generellt, när kan timers vara att föredra?
>Glöm inte kontaktstudsarna...
- Du får gärna utveckla detta.
- Är inte detta smidigare att lösa med interrupt, eller vad har du i åtanke?
Har inte alls läst något om timers ännu, får väl snart hoppa på det. Rent generellt, när kan timers vara att föredra?
>Glöm inte kontaktstudsarna...
- Du får gärna utveckla detta.

Re: Knappar till MCU
> Rent generellt, när kan timers vara att föredra?
Tja, när man vill att något ska "hända" efter en viss tid eller med ett visst tidsintervall.
Timers används nästan i allt, så det finns igentligen ingen anledning att vänta med det.
Timers är nog den en av de första "enheterna" som man använder...
> - Du får gärna utveckla detta.
Nej, det tänker jag inte. "Kontaktstuds" gav 76 träffar i forumet, så det
finns ingen som helst anledning att skriva ennu mer om det...
Tja, när man vill att något ska "hända" efter en viss tid eller med ett visst tidsintervall.
Timers används nästan i allt, så det finns igentligen ingen anledning att vänta med det.
Timers är nog den en av de första "enheterna" som man använder...
> - Du får gärna utveckla detta.
Nej, det tänker jag inte. "Kontaktstuds" gav 76 träffar i forumet, så det
finns ingen som helst anledning att skriva ennu mer om det...
Re: Knappar till MCU
Strunta i ESD. Har själv en för 29 spänn från biltema och det fungerar bra. Sen är det ju faktist plast i spetsen så den är icke ledande sålänge den inte är proppfull med tenn.
Vill du göra en egen ESD är det bara att popnita fast en kabel i höljet eller nåt.
Vill du göra en egen ESD är det bara att popnita fast en kabel i höljet eller nåt.
Re: Knappar till MCU
ESD-tennsugarna är väl iofs gjorda av nån form av ledande plast, av samma typ som ESD-lådor osv ?
Jag har en ESD-tennsug, men det berodde mer på att det var den som fanns för vettigt pris just då när farsan knyckte tillbaka sin som jag trodde jag hade permanentlånat.. det är nog ganska skit samma för en amatör generellt sett.
Jag har en ESD-tennsug, men det berodde mer på att det var den som fanns för vettigt pris just då när farsan knyckte tillbaka sin som jag trodde jag hade permanentlånat.. det är nog ganska skit samma för en amatör generellt sett.
Re: Knappar till MCU
Har lite frågor angående kontaktstuds som jag hoppas någon kan ge mig svar på:
1. Om jag planerar att göra ett program i vilket man bara ska trycka på en knapp en gång (det vill säga även om man trycker x gånger så registreras ändå bara 1), finns det då någon anledning att bry sig om fenomenet?
2. Har letat efter bilder på hur en RC-krets kan/bör kopplas över en knapp men hittar ingen. Någon som har någon länk eller bild?
3. En SR-vippa löser såvitt jag förstår också problemet, men hittar ej dessa att köpa?
4. Det går att lösa problemet genom kodning (delay, timers etc), men det var inte så mycket skrivet om det när jag sökte på "kontaktstuds" - uppenbara nackdelar kanske?
Försöker finna rätt approach till problemet, så behöver mest generella svar..
1. Om jag planerar att göra ett program i vilket man bara ska trycka på en knapp en gång (det vill säga även om man trycker x gånger så registreras ändå bara 1), finns det då någon anledning att bry sig om fenomenet?
2. Har letat efter bilder på hur en RC-krets kan/bör kopplas över en knapp men hittar ingen. Någon som har någon länk eller bild?
3. En SR-vippa löser såvitt jag förstår också problemet, men hittar ej dessa att köpa?
4. Det går att lösa problemet genom kodning (delay, timers etc), men det var inte så mycket skrivet om det när jag sökte på "kontaktstuds" - uppenbara nackdelar kanske?
Försöker finna rätt approach till problemet, så behöver mest generella svar..

-
- Inlägg: 822
- Blev medlem: 23 mars 2009, 19:04:00
- Ort: Ystad
Re: Knappar till MCU
Det beror på om det som händer efter tryckningen tar lång tid innan programmet läser instruktionen igen. Trycker du på knappen och en borr skall borra ett hål så hinner du släppa knappen igen.
Men skall programmet bara plusa ihop 2 värde så hinner den göra det massor av ggr innan du släppt knappen om
det ligger i en loop.
Vänta på att knappen skall släppas innan pic'en gör ngt . Studdsarna är bra om man kan ta bort hårdvarumässigt
så slipper man bry sig om det i programmet.
Men skall programmet bara plusa ihop 2 värde så hinner den göra det massor av ggr innan du släppt knappen om
det ligger i en loop.
Vänta på att knappen skall släppas innan pic'en gör ngt . Studdsarna är bra om man kan ta bort hårdvarumässigt
så slipper man bry sig om det i programmet.
Re: Knappar till MCU
http://lmgtfy.com/?q=rc+switch+debounce ger massor av referenser och exempel. Byter du över till Google:s bildsök med samma sökning så finns det rätt många varianter där med. Microchip:s application notes har flera exempel på hur man kan lösa detta i mjukvara också, det går säkert att applicera på AVR också.
Re: Knappar till MCU
> 1. Om jag planerar att göra ett program i vilket man bara ska trycka på en knapp en gång (det vill säga
> även om man trycker x gånger så registreras ändå bara 1), finns det då någon anledning att bry sig om fenomenet?
Nja, det kan ju kanske finnas anledning att verifiera att det inte var ett "falsklarm". Alltså
brukar man ta flera läsningar med en liten tid mellan (kanske 10-20 ms) och bara registrera
ett "tryck" då knappen har varit tryckt ett visst antal gånger i följd )då har den även
slutat studsa). Säg 10 avläsningar i följd, då får du en fördröjning på 100-200 ms
från "tryck" till "handling" vilket sannolikt är OK.
Vad som ska hända sedan (när knappen är släppt) är en annan sak och det får
logiken i koden (också) ta hand om.
En enkel och vanlig lösning är att man har en timer-rutin som ligger och kör hela tiden
med kanske 10-20 ms intervall. Där kan man göra allt möjligt som behöver göras regelbundet,
t.ex som att kolla av knappar och andra "in-organ".
> 2, 3 och 4.
Enklast är nog att koda runt det, du slipper extra hårdvara och det är nog enklare
att få det att fungera precis som du vill.
> även om man trycker x gånger så registreras ändå bara 1), finns det då någon anledning att bry sig om fenomenet?
Nja, det kan ju kanske finnas anledning att verifiera att det inte var ett "falsklarm". Alltså
brukar man ta flera läsningar med en liten tid mellan (kanske 10-20 ms) och bara registrera
ett "tryck" då knappen har varit tryckt ett visst antal gånger i följd )då har den även
slutat studsa). Säg 10 avläsningar i följd, då får du en fördröjning på 100-200 ms
från "tryck" till "handling" vilket sannolikt är OK.
Vad som ska hända sedan (när knappen är släppt) är en annan sak och det får
logiken i koden (också) ta hand om.
En enkel och vanlig lösning är att man har en timer-rutin som ligger och kör hela tiden
med kanske 10-20 ms intervall. Där kan man göra allt möjligt som behöver göras regelbundet,
t.ex som att kolla av knappar och andra "in-organ".
> 2, 3 och 4.
Enklast är nog att koda runt det, du slipper extra hårdvara och det är nog enklare
att få det att fungera precis som du vill.
Re: Knappar till MCU
Jag brukar göra så att jag har en timer-interrupt runt 10-100Hz som gör det som behöver göras, bland annat läsa knappar, konsekvent läser jag då knapp-porten bara en enda gång per interrupt, om man behöver läsa fler gg sparar jag i en variabel. Sedan implementerar jag en "n-key-rollover" (google känner till den) och får då bara en knapptryckning per tryck, ingen extern debounce eller väntande i mjukvaran eller liknande skit.
N-key-rollover är patenterat men implementeras ganska enkelt. Här utgår jag ifrån att det rör sig om 8 knappar på en port (PORTA).
"Key"-variabeln innehåller nu vilken knapp som är nyss intryckt och i vissa applikationer kan det vara lämpligt att utöka jobbet vid att göra en buffer som kan innehålla fler knapptryckningar, man får då ha lite rutiner som lägger till knapptryckningar, kollar OM det finns någon knapptryckning samt en som svarar med första knapptryckningen i buffern.
Jag har implementerat ovanstående på en 8*8 knappmatris med en 16-bytes buffer, fungerade kanonbra, missade aldrig en enda knapptryckning och hade ingen bounce-problem.
N-key-rollover är patenterat men implementeras ganska enkelt. Här utgår jag ifrån att det rör sig om 8 knappar på en port (PORTA).
Kod: Markera allt
typedef unsigned char BYTE;
static BYTE Previous_Key, Key;
Timer_ISR:
BYTE Current_Key;
Current_Key = PORTA; // Read key-port
Key = Current_Key & ~Previous_Key; // Mask out all new keys into "Key"-variabel
Previous_Key = Current_Key; // Save this keypress to next time
Jag har implementerat ovanstående på en 8*8 knappmatris med en 16-bytes buffer, fungerade kanonbra, missade aldrig en enda knapptryckning och hade ingen bounce-problem.
Re: Knappar till MCU
icecap:Ursäkta min usla C kunskap men vad betyder "& ~Previous_Key" är det OR eller vad?
- MicaelKarlsson
- Inlägg: 4669
- Blev medlem: 18 juni 2004, 09:16:07
- Ort: Aneby
- Kontakt:
Re: Knappar till MCU
v-g: Det är väl ettkomplement, se här: http://irc.essex.ac.uk/www.iota-six.co. ... lement.asp
Re: Knappar till MCU
Tack för all hjälp, då kan jag gå vidare! =)
Innan jag börjar ge mig på att pilla på detta tänkte jag passa på att fråga också ifall det fungerar bra att låta LED:en och knappen dela wire till GND? Även om det är flera LEDs och knappar? Så länge man inte trycker på två knappar exakt samtidigt borde väl detta fungera?
Innan jag börjar ge mig på att pilla på detta tänkte jag passa på att fråga också ifall det fungerar bra att låta LED:en och knappen dela wire till GND? Även om det är flera LEDs och knappar? Så länge man inte trycker på två knappar exakt samtidigt borde väl detta fungera?