Fórum témák

» Több friss téma
Cikkek » WILL-I THE END (robotika és AVR kezdőknek)
WILL-I THE END (robotika és AVR kezdőknek)
Szerző: Fizikus, idő: Máj 17, 2010, Olvasva: 30591, Oldal olvasási idő: kb. 2 perc
Lapozás: OK   5 / 8

Pergés (Prell)

Az ideális kapcsoló megnyomáskor az áramkört azonnal zárja, felengedéskor pedig azonnal nyitja. A valóságban a mechanikus kapcsolók rugalmas fém alkatrészeket tartalmaznak, ezért a kapcsoláskor rezgés keletkezik az érintkezőknél. Emiatt be és kikapcsolásakor a kapcsolás után rövid ideig (néhány ms-ig) a nyitott, és a zárt állapot között oszcillál (lásd az alábbi ábra a) pontját). A mindennapi életben ezt mi nem vesszük észre, de a mikrovezérlő ez alatt a néhány ms alatt akár több ezer műveletet is el tud végezni, és ha egy lefutó élre adtunk meg megszakítást, akkor egy gombnyomás után többször fog a megszakításrutin lefutni. Ezért ezt kiküszöbölendő, valamilyen pergésmentesítő módszert kell alkalmaznunk.

Alapvetően kétféle módszerrel lehet a pergést megszüntetni:

  • hardveres megoldás
  • szoftveres megoldás


Az alábbi ábrán látható néhány hardveres megoldás. Ha a nyomógombbal párhuzamosan kötünk egy kondenzátort ( b) pont), akkor az mintegy elnyeli a pergés során keletkező impulzusokat, de egyben egy rezgőkört is alkot, és egy negatív feszültség tüske is jelenkezik amit nem szeret a mikrovezérlő. Erre megoldás lehet ha egy másik ellenállást sorba kötünk a kondenzátorral ( c) pont). Az igazán jó megoldás egy Schmitt-trigger használata ( d) pont).
 

A fent vázolt hardveres pergésmentesítés addig jó, amíg csak kevés számú nyomógombot akarunk használni. Egy 4x4-es nyomógomb mátrixnál már elég nehézkes a megvalósítása. Ekkor a szoftveres pergésmentesítés célravezetőbb lehet. Nézzünk erre is egy példát.

Szoftveresen a legegyszerűbb megoldásnak az tűnhetne, ha a megszakításrutinba egy várakozást építenénk be, és a rutinban a további megszakításokat letiltanánk, hogy a program csak a gomb első megnyomására reagáljon.

De korábban már említettem, hogy az ISR-nek a lehető leggyorsabbnak kell lennie, hogy az időzítésre érzékeny programrészek ne szálljanak el. Ezért az ISR-be nem tanácsos késleltetéseket rakni, hanem csak egy változó értékét érdemes inkább megváltoztatni, amit majd a megszakításrutinon kívül, a főprogramban figyelünk, és változása esetén a késleltetéseket a főprogramon belül hajtjuk végere.

Az alábbi kódban pont ezt történik. Az ISR-en belül átkapcsoljuk a LED-et és letiltjuk a további megszakításokat, hogy ne fusson le többször az ISR, majd az ISR-en kívül a főprogramban végezzük el a késleltetést a pergés megszüntetése érdekében.

  1. /* Interrupt teszt 2
  2.     Nyomogomb: a PD2 labon (INT0)
  3.     LED: a C0 labon
  4. */
  5. #define F_CPU 1000000UL  // 1 MHz CPU clock
  6.  
  7. #include <util/delay.h>        // Idozito, keslelteto rutinokat tartalmazo fajl
  8. #include <avr/io.h>            // AVR konstansokat, baallitasokat tart. fajl
  9. #include <avr/interrupt.h>    // Megszakitasokat kezelo rutinokat tart. fajl
  10.  
  11. ISR (INT0_vect)    // INT0 megszakitas kiszolgalo rutin utasitasai
  12. {
  13.     PORTC ^= (1<<PC0);     //  PC0 lab allapotat megcsereli (LED be/ki)
  14.     GICR &= ~(1<<INT0);    //  INT0 letiltasa (nyomogomb perges megakadalyozasa erdekeben)
  15. }
  16.  
  17. int main (void)        // Program eleje
  18. {
  19.     // portok beallitasa
  20.     DDRC |= (1<<PC0);        //  PC0 kimenet
  21.     PORTC |= (1<<PC0);        //  PC0 labra +5V (LED1 kikapcsolva)
  22.     PORTD &= ~(1<<PD2);    //  PD2 bemenet
  23.     PORTD |= (1<<PD2);    //  PD2-hoz tartozo felhuzoellenallas be
  24.  
  25.     // az INT0 kulso interrupt beallitasa
  26.     GICR |= (1<<INT0);        // INT0 engedelyezese (PD2-es lab)
  27.     MCUCR |= (1<<ISC01);     // a lab lefuto elre adjon megszakitast
  28.     sei();         // megszakitasok bekapcsolasa
  29.  
  30.         while (1)
  31.         {    
  32.     // Ha INT0 megszakitas ki van kapcsolva, akkor egy kis varakozas utan bekapcsoljuk
  33.             if((GICR & (1<<INT0)) == 0)
  34.             {
  35.   // varakozas nehany szaz ms-ig, amig a nyomogomb befejezi a pergest
  36.             _delay_ms(250);
  37.   // minden tovabbi varakozo megszakítás torlese, majd a megszakitasok engedelyezese
  38.             GIFR |= (1<<INTF0);        // INT0-hoz tartozo jelzobit torlese
  39.             GICR |= (1<<INT0);        // INT0 megszakitas engedelyezese
  40.             }
  41.         };
  42. }


A szoftveres pergésmentesítés után most már helyesen működik a nyomógomb.
 


A cikk még nem ért véget, lapozz!
Következő: »»   5 / 8
Értékeléshez bejelentkezés szükséges!
Bejelentkezés

Belépés

Hirdetés
XDT.hu
Az oldalon sütiket használunk a helyes működéshez. Bővebb információt az adatvédelmi szabályzatban olvashatsz. Megértettem