avr-gcc ,hazudik az if:-)
Moczik Gabor
pm at progzmaster.hu
Mon Sep 11 11:40:08 CEST 2006
Pal Lukacs wrote:
> Nem vagyok meggyozodve arrol hogy prell okozza nalam a hibat. Mivel vegtelen for(;;) blokkban van a gombnyomas ellenorzes igy ha nehany msec -ig prell van,utanna ugyis be kellene alljon a vart allapot,vagyis jol kellene mukodnie a feltetelnek.
> Azt hiszem kiprobalom a kondenzatoros anti prell-t,aztan ha ugysem jo,akkor megiscsak (mint egy kulon thread:)) a timer1 overflowba rakom az if-et
Nem kovettem a temat eddig, a prellmentesiteshez hozza tudok szolni.
Egy lehetoseg:
void keywait() {
unsigned char debounce;
while(!BUTTON_0);
debounce=0;
while(debounce<200) {
if (BUTTON_0) debounce=0; else debounce++;
}
}
Az elso while arra van, hogy var ameg elengedik a gombot, ha esetleg
elozoleg folyamatosan nyomtak volna.
A lenyeg a masodik while ciklus, akkor enged kilepni, ha 200 ciklus alatt
folyamatosan 0 (=AKTIV) allapotot olvas be.
De altalaban mas modszert szoktam hasznalni.
Ha interrupt kezeli a gombokat, akkor a gombnyomas azonnal kivaltja a
megszakitast, a megszakitasi rutinban letiltom par ms idore a tovabbi
billentyu megszakitasokat, ezzel a prellezes nem tud hibas bevitelt okozni.
Egy 3-ik modszer ami nekem hibatlanul megy egy keszulekben evek ota:
50Hz-es idozito megszakitasban beolvasom a gombok allapotat, ha tortent
valtozas, akkor beteszi a 4 byte-os billentyuzet pufferbe, amit majd a
foprogram olvas ki. Az 50Hz periodusideje 20ms, ettol a prell rovidebb,
tehat nem jut szerephez, egy menu kezelesehez pedig eleg gyors lesz a
reakcioja, nem nagyon lehet gyorsabban nyomkodni.
Egyik keszulekben ugyanez 35Hz-el megy, az is eleg gyors.
> Amugy sok alkalmazasban latom,hogy a main() vegen van egy ures vegtelen ciklus.Ezt nem ertem,hogy miert kell?,a masik meg az hogy ,hogy nem eszi meg a procit teljes egesszeben?hogy tud dolgozni a proci mas muveleteken emellett?Ez PC-nel teljes program fagyas lenne.
Ha soha nem jut oda, felesleged odatenni. Altalaban nalam az User
Interface-t tartalmazo mikrovezerlos alkalmazasoknal a main() egy vegtelen
ciklus, kijelez, es figyeli, hogy a felhasznalo akar-e valamit.
A time-critical dolgok mind megszakitasbol mennek.
Ha az User Interface mellett egy nem real-time feladatot is kell vegezni,
akkor allapotgepet teszek a main()-be, a feladatbol mindig egy lepest vegez
el, kozben figyeli az User dolgait.
Sose akasztok meg egy felhasznaloi feluletes procit akar 1 masodpercre sem,
mert akkor azt hiszik lefagyott. Ha ilyen folyamat van, elotte minimun egy
"kerem varjon" uzenetet irok a kijelzore.
PC-n is csak esemenyvezerelt rendszerekben (pl. windows alatt) fagyna le,
mert a felhasznaloi input feldolgozasahoz meg kell hivni egy fuggvenyt.
Ugyanez van mikrovezerlon is, ha nem teljes egeszeben megszakitasban kezeled
a felhasznaloi bevitelt.
--
((( Móczik Gábor )))--((( pm -> @ -> progzmaster -> . -> hu )))
((( Skype: moczik )))--((( Website: http://www.progzmaster.hu )))
More information about the Elektro
mailing list