Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
et:examples:digi:switch_debounce [2010/01/13 12:01] mikk.leiniet:examples:digi:switch_debounce [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
-====== Lüliti väreluse filtreerimine ======+====== Lüliti põrkumise filtreerimine ======
  
-//Vajalikud teadmised: [HW] [[et:hardware:digi|Digitaalne moodul]], [AVR] [[et:avr:io|Sisendid-väljundid]], [LIB] [[et:software:library:pin|Viikude teek]],  [LIB] [[et:software:library:delay|Viite teek]], [PRT] [[et:examples:digi:switch|Lülitite näide]]//+//Vajalikud teadmised: [HW] [[et:hardware:homelab:digi]], [AVR] [[et:avr:io]], [LIB] [[et:software:homelab:library:pin]],  [LIB] [[et:software:homelab:library:delay]], [PRT] [[et:examples:digi:switch]]//
  
 ===== Teooria ===== ===== Teooria =====
Line 7: Line 7:
 [{{  :examples:digi:switch:switch_bounce.png?200|Lüliti kontaktide põrkumine}}] [{{  :examples:digi:switch:switch_bounce.png?200|Lüliti kontaktide põrkumine}}]
  
-Nii nagu lüliteid tutvustavas peatükis öeldud, eksisteerib mehhaaniliste lülititega kontaktide põrkumise probleem mida siin materjalis on nimetatud väreluseks. Kuna kontaktid on tehtud metallist, millel on teatav elastsus, siis kontaktide ühendamise või lahti-ühendamise hetkel need põrkuvad ning tulemusena tekib hulga väär-lülitusi. Lülituste arv ja kestvus sõltub lülitist, kuid enamasti jääb see mõne millisekundi piiresse. Kui lülitit kasutatakse mõne elektriseadme tööle lülitamiseks, siis pole see suur probleem, kuid kui lüliti on kasutusel seadme juhtimiseks võib mitmekordne vajutamine kahjulik olla.+Nii nagu lüliteid tutvustavas peatükis öeldud, eksisteerib mehhaaniliste lülititega kontaktide põrkumise probleem. Kuna kontaktid on tehtud metallist, millel on teatav elastsus, siis kontaktide ühendamise või lahti-ühendamise hetkel need põrkuvad ning tulemusena tekib hulga väärlülitusi. Lülituste arv ja kestus sõltub lülitist, kuid enamasti jääb see mõne millisekundi piiresse. Kui lülitit kasutatakse mõne elektriseadme käivitamiseks, siis pole see suur probleem, kuid kui lüliti on kasutusel seadme juhtimiseksvõib mitmekordne lülitumine probleemiks olla.
  
 [{{  :examples:digi:switch:switch_input_rc_filter.png?200|Lüliti RC-filter}}] [{{  :examples:digi:switch:switch_input_rc_filter.png?200|Lüliti RC-filter}}]
  
-Põhiline sädelust välistav meetod on filtreerimine. Filtreerida saab nii elektriliselt kui tarkvaraliselt. Elektriliseks filtreerimiseks tuleb lüliti järgi lisada madalpääsfilter – näiteks RC filter - mis silub pingemuutusi ja sellest tulenevalt mikrokontrolleri viik ei omanda hetkelisi väärtusi. RC filtri on toodud kõrvalolev Tarkvaraline filtreerimine toimub põhimõttel, et viigu, kuhu lüliti on ühendatud, väärtust loetakse mitmel korral ja kui kõikidel kordadel on viigu väärtus sama, siis sellest järeldatakse, et lüliti omab kindlat asendit ning tegu pole sädelusega. Igasugusel filtreerimisel peab aga arvestama viitega, mis tekib oleku kindlaks määramisega.+Põhiline kontaktide põrkumisest tekkinud väärlülitusi välistav meetod on filtreerimine. Filtreerida saab nii elektriliselt kui ka tarkvaraliselt. Elektriliseks filtreerimiseks tuleb lüliti ühendada läbi madalpääsu filtri – näiteks RC filter - mis silub pingemuutusi ja sellest tulenevalt ei omanda mikrokontrolleri viik hetkelisi väärtusi. Tarkvaraline filtreerimine toimub põhimõttel, et viigu, kuhu lüliti on ühendatud, väärtust loetakse mitmel korral ja kui kõikidel kordadel on viigu väärtus sama, siis sellest järeldatakse, et lüliti omab kindlat asendit ning tegu pole põrkumisega. Igasugusel filtreerimisel peab aga arvestama viitega, mis tekib oleku määratlemisel.
    
 ===== Praktika ===== ===== Praktika =====
  
-Kodulabori lülititel ei kasutada elektrilist filtreerimist, sest siis ei saaks harjutada tarkvaralist väärlülituste elimineerimise ülesannet. Harjutus koosneb kahest osast. Esimese ülesande eesmärk on demonstreerida digitaalse sisend-väljund mooduli nuppude kontaktide põrkumist. Selleks on järgmine programm, mis iga nupuvajutuse peale paneb põlema järgmise LED-i. Väär-nupuvajutuste tõttu süttivad LED-id aga mitmeid kordi ja näib, et lausa suvaliselt.+Kodulabori lülititel ei kasutada elektrilist filtreerimist, sest siis ei saaks harjutada tarkvaralist väärlülituste elimineerimise ülesannet. Harjutus koosneb kahest osast. Esimese ülesande eesmärk on demonstreerida Digitaalse sisend-väljundmooduli nuppude kontaktide põrkumist. Selleks on järgmine programm, mis iga nupuvajutuse peale paneb põlema järgmise LED-i. Väär-nupuvajutuste tõttu süttivad LED-id aga mitmeid kordi ja näib, et lausa suvaliselt.
  
 <code c> <code c>
 // //
-// Kodulabori digitaalse sisend-väljund mooduli +// Kodulabori digitaalse sisend-väljundmooduli 
-// nuppude põrkumise demonstreerimise programm.+// nuppude kontaktide põrkumise demonstreerimise programm.
 // //
 #include <homelab/pin.h> #include <homelab/pin.h>
Line 29: Line 29:
 pin leds[3] = { PIN(C, 5), PIN(C, 4), PIN(C, 3) }; pin leds[3] = { PIN(C, 5), PIN(C, 4), PIN(C, 3) };
 pin button  = PIN(C, 0); pin button  = PIN(C, 0);
 +
 +
 +
  
 // //
Line 73: Line 76:
 </code> </code>
  
-Tarkvaraliseks filtreerimiseks on mitmeid meetodeid. Seda võib teha lihtsalt ja keeruliselt, mõlemal juhul omade eeliste ja puudustega. Kui programm on selline, et nupuvajutusi oodatakse harva, võib peale nupu allavajutamise registreerimist lisada pika pausi mis välistab reageerimise põrkumisest tekkinud-lülitustele. Samas tuleb sellise lahenduse puhul arvestada, et kui kasutaja hoiab nuppu pikalt all, reageerib programm ka nupu lahtilaskmisel tekkinud väär-lülitustele+Tarkvaraliseks filtreerimiseks on mitmeid meetodeid. Seda võib teha lihtsalt ja keeruliselt, mõlemal variandil on oma eelised ja puudused. Kui programm on selline, et nupuvajutusi oodatakse harva, võib pärast nupu allavajutamise registreerimist lisada pika pausimis välistab reageerimise põrkumisest tekkinud lisalülitustele. Samas tuleb sellise lahenduse puhul arvestada, et kui kasutaja hoiab nuppu pikalt all, reageerib programm ka nupu lahtilaskmisel tekkinud väärlülitustele. 
-Töökindlam on programm, mis kontrollib nupu olekut teatud aja jooksul mitu korda (mida rohkem ja mida pikema aja jooksul seda kindlam). Järgnevalt on toodud digitaalse sisend-väljund laiendusmooduli nupu filtreeritud väärtuse lugemise funktsioon:+ 
 +<pagebreak> 
 + 
 +Töökindlam on programm, mis kontrollib nupu olekut teatud aja jooksul mitu korda (mida rohkem ja mida pikema aja jooksulseda kindlam). Järgnevalt on toodud Digitaalse sisend-väljundmooduli nupu filtreeritud väärtuse lugemise funktsioon:
  
 <code c> <code c>
Line 85: Line 91:
  unsigned char timeout = 100;  unsigned char timeout = 100;
  
- // Ootame kuni nupu olek on selgunud või oleku selgitamine aegunud+ // Ootamekuni nupu olek on selgunud või oleku selgitamine aegunud
  while (timeout-- > 0)  while (timeout-- > 0)
  {  {
- // 8 kohalise (bitise) olekupuhvri pidamine+ // 8-kohalise (bitise) olekupuhvri pidamine
  // Kõik eelmised olekud (bitid) nihutatakse vasakule  // Kõik eelmised olekud (bitid) nihutatakse vasakule
  // ja paremale lisatakse uus olek (bitt).  // ja paremale lisatakse uus olek (bitt).
Line 94: Line 100:
  buffer |= (pin_get_value(button) ? 0x01 : 0x00);  buffer |= (pin_get_value(button) ? 0x01 : 0x00);
   
- // Kui kõik 8 bitti on kõrged siis+ // Kui kõik 8 bitti on kõrgedsiis
  // nupp on kindlasti alla vajutatud  // nupp on kindlasti alla vajutatud
  if (buffer == 0xFF)  if (buffer == 0xFF)
Line 101: Line 107:
  }  }
  
- // Kui kõik 8 bitti on madalad siis+ // Kui kõik 8 bitti on madaladsiis
  // nupp on kindlasti üleval  // nupp on kindlasti üleval
  if (buffer == 0x00)  if (buffer == 0x00)
Line 109: Line 115:
  
  // Paus 1 millisekund  // Paus 1 millisekund
- // See funktsioon sisaldub kodulabori teegis+ // See funktsioon sisaldub Kodulabori teegis
  sw_delay_ms(1);  sw_delay_ms(1);
  }  }
  
- // Kui olekut ei õnnestunud välja selgitada siis oletame,+ // Kui olekut ei õnnestunud välja selgitadasiis oletame,
  // et nuppu ei vajutatud  // et nuppu ei vajutatud
  return 0;  return 0;
Line 119: Line 125:
 </code> </code>
  
-See funktsioon kasutab viite tekitamise funktsiooni millest räägib lähemalt vastav harjutusülesanne. Siinkohal pole viite funktsiooni kohta vaja suurt midagi teada peale selle, et see tekitab 1 millisekundilise viite iga nupu oleku lugemise tsükli lõpus. Kui nupp on kaheksal lugemise korral samas asendis, tagastab see loetud asendi. Kogu protseduur võib nupu ebastabiilsuse korral kesta kuni 100ms. Funktsioon juba sisaldub viikude teegis, nii et näite läbimiseks ei pea seda oma programmi lisama. Selle proovimiseks tuleb ülesande esimest poolt natukese muuta – kaasata programmi viite tekitamise teek ja kohas kus nupu väärtust otse loeti, kasutada filtriga funktsiooni. Tulemus on järgmine:+See funktsioon kasutab viite tekitamise funktsioonimillest räägib lähemalt vastav harjutusülesanne. Siinkohal pole viite funktsiooni kohta vaja suurt midagi teada peale selle, et see tekitab 1-millisekundilise viite iga nupu oleku lugemise tsükli lõpus. Kui nupp on kaheksa lugemise korral samas asendis, tagastab see loetud asendi. Kogu protseduur võib nupu ebastabiilsuse korral kesta kuni 100 ms. Funktsioon sisaldub juba viikude teegis, nii et näite läbimiseks ei pea seda oma programmi lisama. Selle proovimiseks tuleb ülesande esimest poolt natukese muuta – kaasata programmi viite tekitamise teek ja kohaskus nupu väärtust otse loeti, kasutada filtriga funktsiooni. Tulemus on järgmine: 
 + 
 +<pagebreak>
  
 <code c> <code c>
 // //
-// Kodulabori digitaalse sisend-väljund mooduli +// Kodulabori digitaalse sisend-väljundmooduli 
-// nuppude põrkumise filtreerimise programm.+// nuppude kontaktide põrkumise filtreerimise programm.
 // //
 #include <homelab/delay.h> #include <homelab/delay.h>
Line 165: Line 173:
  counter = (counter + 1) % 3;  counter = (counter + 1) % 3;
  
- // Loenduri väärtusele vastava LED-i süütamine+ // Loenduri väärtusele vastava LED süütamine
  for (index = 0; index < 3; index++)  for (index = 0; index < 3; index++)
  {  {
Line 178: Line 186:
 </code> </code>
  
-Kui nüüd programmi proovida, siis LED-id süttivad täpselt sellises järjekorras nagu kasutaja nupp-lülitit vajutab.+Kui nüüd programmi proovida, siis LED-id süttivad täpselt sellises järjekorras nagu kasutaja nupplülitit vajutab.
et/examples/digi/switch_debounce.1263384102.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0