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