avstudsning
Re: avstudsning
Vänta på att kontaktstudset men en viss sannolikhet (säg 95%) slutat och då troligtvis mäta den signal man önskat sig.
Re: avstudsning
Ändring av signalen kan aktivera en avbrottrutin, sedan får man vänta för att slutligen läsa av värdet.
Re: avstudsning
Vänta i ISR'en ?
Det betyder att inga andra avbrott kan hanteras under (vänte-) tiden.
Det är normalt en situation som man försöker undvika.
Aja, min poäng med det hela var att för att kunna vänta
över huvudtaget så måste man "läsa en signal flera gånger".
Annars får man ingen utgångspunkt att börja vänta från.
Om det sker via ett avbrott eller på annat sätt spelar mindre roll.
Men igen, i just *detta* fall så är det helt ointressant, ett antal
ingångar ska bara "speglas" till en 7-seg display. Om den flimrar
till under några ms spelar sannolikt ingen som helst roll.
Det betyder att inga andra avbrott kan hanteras under (vänte-) tiden.
Det är normalt en situation som man försöker undvika.
Aja, min poäng med det hela var att för att kunna vänta
över huvudtaget så måste man "läsa en signal flera gånger".
Annars får man ingen utgångspunkt att börja vänta från.
Om det sker via ett avbrott eller på annat sätt spelar mindre roll.
Men igen, i just *detta* fall så är det helt ointressant, ett antal
ingångar ska bara "speglas" till en 7-seg display. Om den flimrar
till under några ms spelar sannolikt ingen som helst roll.

Re: avstudsning
Inte nödvändigtvis, man kan starta en timer och återgå för att sedan läsa av värdet när timern skapar sitt avbrott.Vänta i ISR'en ?
Men som sagt det finns flera lösningar och ibland är det värt att prova något mindre bra för att komma vidare snabbt.
EDIT:
Sedan vet nog de flesta här på forumet att det är knappast jag som är expert på programmering utan just bara nyfiken.
Re: avstudsning
Om huvudprogrammet reagerar först när man har "klickat" på knappen, (tryckt in och släppt) behöver man aldrig vänta i huvudprogrammet. "Klickavläsning" i interruptet fixar man genom några enkla logikoperationer (XOR och AND, typ) mellan portens nuvarande värde, och värdet i förra avläsningen. 10ms mellan avläsningarna funkar bra, det är iaf vad jag brukar använda. Antar att det är vad koden Anders länkade till gör, men jag läste inte så noga.
Re: avstudsning
Klart det går att ha lågpassfilter av olika former externt men enligt mitt tycke är det enklare att ändra en konstant i programvaran än att byta kondensatorer på ett kretskort för att ändra tider om det behövs.
Re: avstudsning
Komponenter är källa till fel! Mjukvara likaså men i µC-lösningar får man dras med det i vilket fall som helst.
Man kan se en läsning som sker regelbundet (timer-interrupt) som en 1-bit sampler. När medelvärdet över X samples är nära nog '1' till att accepteras kan man betrakta avstutsningen och filtreringen som avklarat. Och i min erfarenhet är två samples med 50ms mellan alldeles rikligt att dels reagerar snabbt nog till att det känns "live" och dels störsäkert nog. Riktigt bra är det med 3 samples med 33ms mellan, då känns knappen lika "live" och störningar ska vara svåra för att komma igenom.
Och då man, i min erfarenhet, ändå oftast har en "systemtimer" tickande kan den fint vara basen i detta.
Men precis som sodjan skriver: i TS' projekt har detta ingen betydelse alls! Det ska bara reagerar på "någonting" och om knappen trycks in/stutsar 100 gg har ingen betydelse alls, det ska reageras likadan ändå.
Man kan se en läsning som sker regelbundet (timer-interrupt) som en 1-bit sampler. När medelvärdet över X samples är nära nog '1' till att accepteras kan man betrakta avstutsningen och filtreringen som avklarat. Och i min erfarenhet är två samples med 50ms mellan alldeles rikligt att dels reagerar snabbt nog till att det känns "live" och dels störsäkert nog. Riktigt bra är det med 3 samples med 33ms mellan, då känns knappen lika "live" och störningar ska vara svåra för att komma igenom.
Och då man, i min erfarenhet, ändå oftast har en "systemtimer" tickande kan den fint vara basen i detta.
Men precis som sodjan skriver: i TS' projekt har detta ingen betydelse alls! Det ska bara reagerar på "någonting" och om knappen trycks in/stutsar 100 gg har ingen betydelse alls, det ska reageras likadan ändå.
Re: avstudsning
Det är PIC 16F690, kodar för första gången i C på uC, Hitech C och MPLAB.
Har alltid använt assembler tidigare. Känns bekvämare att göra program i C.
För detta projekt räcker det nog med fördröjningar för att undvika kontaktstudsar.
Annars, en möjlighet skulle kunna vara en rutin så här:
Vänta tills timer löpt ut.
Läs av pinne kopplad till knapp.
Starta timer (utan att interrupt aktiveras) med värde som motsvarar tid så länge studsar pågår (ex.vis. 5ms).
Returnera resultat från knapp.
Om då huvudprogrammet utför sina uppgifter snabbt får det vänta nästan hela tiden som timern startats med, men om huvudprogrammet har jobbat länge (>5ms) behöver det inte vänta alls.
Har alltid använt assembler tidigare. Känns bekvämare att göra program i C.
För detta projekt räcker det nog med fördröjningar för att undvika kontaktstudsar.
Annars, en möjlighet skulle kunna vara en rutin så här:
Vänta tills timer löpt ut.
Läs av pinne kopplad till knapp.
Starta timer (utan att interrupt aktiveras) med värde som motsvarar tid så länge studsar pågår (ex.vis. 5ms).
Returnera resultat från knapp.
Om då huvudprogrammet utför sina uppgifter snabbt får det vänta nästan hela tiden som timern startats med, men om huvudprogrammet har jobbat länge (>5ms) behöver det inte vänta alls.
Re: avstudsning
> ...för att undvika kontaktstudsar.
Men spelar det någon roll ???
Vad får eventuella kontaktstudsar för effekt på applikationen?
Eller är det mer av en programmeringsövning?
I så fall är det väl bättre att göra som man brukar göra
med hantering av tryckknappar och inte uppfinna hjulet
på nytt (om det inte är just det som är syftet, så klart).
> Vänta tills timer löpt ut.
Det vanliga är att timern helt enkelt "rullar runt".
D.v.s att om det har gått > 5 ms så är det inte helt
trivialt att se att timern har "löpt ut".
Men spelar det någon roll ???
Vad får eventuella kontaktstudsar för effekt på applikationen?
Eller är det mer av en programmeringsövning?
I så fall är det väl bättre att göra som man brukar göra
med hantering av tryckknappar och inte uppfinna hjulet
på nytt (om det inte är just det som är syftet, så klart).
> Vänta tills timer löpt ut.
Det vanliga är att timern helt enkelt "rullar runt".
D.v.s att om det har gått > 5 ms så är det inte helt
trivialt att se att timern har "löpt ut".
Re: avstudsning
>Men spelar det någon roll ???
>Vad får eventuella kontaktstudsar för effekt på applikationen?
I den första delen av programmet behövs ingen avstudsning eftersom programmet löper utan att knappen är intryckt. Men andra del körs bara när knappen är intryckt, och då får knappen inte studsa.
>Eller är det mer av en programmeringsövning?
Ingen programmeringsövning. Bara ett litet projekt för eget hemmabruk, för övervakning av brandvarnare.
Idén med timern.. Tänkte på inte det med att den rullar runt. Då får man ändå ha ett interrupt som stoppar timern när den löpt ut.
>Vad får eventuella kontaktstudsar för effekt på applikationen?
I den första delen av programmet behövs ingen avstudsning eftersom programmet löper utan att knappen är intryckt. Men andra del körs bara när knappen är intryckt, och då får knappen inte studsa.
>Eller är det mer av en programmeringsövning?
Ingen programmeringsövning. Bara ett litet projekt för eget hemmabruk, för övervakning av brandvarnare.
Idén med timern.. Tänkte på inte det med att den rullar runt. Då får man ändå ha ett interrupt som stoppar timern när den löpt ut.
Re: avstudsning
> och då får knappen inte studsa.
För att då händer, vadå? Räknar du antalet larm?
Jag fattade det om att det bara var en statusindikation
på en 7-seg display som skulle styras. Om den flimrar till
helt snabbt så kommer man i alla fall inte att hinna se det.
> Då får man ändå ha ett interrupt som stoppar timern när den löpt ut.
Eller bara kolla avbrottsflaggan för timern, den kommer att
vara "satt" om tiden har löpt ut. Sedan kan timern fortsätta
att snurra, det spelar ingen roll, timern behöver ine "stoppas".
Nästa gång du behöver "ta tid" så sätter du bara timern
till startvärdet igen och nollar flaggan.
För att då händer, vadå? Räknar du antalet larm?
Jag fattade det om att det bara var en statusindikation
på en 7-seg display som skulle styras. Om den flimrar till
helt snabbt så kommer man i alla fall inte att hinna se det.
> Då får man ändå ha ett interrupt som stoppar timern när den löpt ut.
Eller bara kolla avbrottsflaggan för timern, den kommer att
vara "satt" om tiden har löpt ut. Sedan kan timern fortsätta
att snurra, det spelar ingen roll, timern behöver ine "stoppas".
Nästa gång du behöver "ta tid" så sätter du bara timern
till startvärdet igen och nollar flaggan.
Re: avstudsning
Som någon skrev ovan: hårdvara kan bli fel på och även mjukvara kan vara felskriven.
En mikrokontrollerstyrd applikation innehåller både hårdvara och mjukvara - 2 källor till att
det ska gå galet. Sedan den mänskliga faktorn - konstruktören.
Bästa är väl att fixa avstuds med ren hårdvara även om det blir några kronor extra.
Så gör allt så enkelt som möjligt men inte enklare.
En mikrokontrollerstyrd applikation innehåller både hårdvara och mjukvara - 2 källor till att
det ska gå galet. Sedan den mänskliga faktorn - konstruktören.
Bästa är väl att fixa avstuds med ren hårdvara även om det blir några kronor extra.
Så gör allt så enkelt som möjligt men inte enklare.
Re: avstudsning
Jag tror inte att man kan bli av med studsarna med passiva/aktiva filter. Möjligtvis med väldigt lång tidskonstant, men då kommer det blir tidsfördröjning och problem om man trycker ofta på knappen.
Man behöver en växlande brytare samt en digital vippa för att få bort studsarna i hårdvara, tror jag.
Ifall knappavläsningen är endast ett pull-up-motstånd kopplat till processorns schmitt-trigger-ingång, tycker jag att man kan anse det vara ett rent mjukvaruproblem.
Man behöver en växlande brytare samt en digital vippa för att få bort studsarna i hårdvara, tror jag.
Ifall knappavläsningen är endast ett pull-up-motstånd kopplat till processorns schmitt-trigger-ingång, tycker jag att man kan anse det vara ett rent mjukvaruproblem.