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 [2014/10/08 07:32] heikopikneret:examples:digi:switch [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 +<pagebreak>
 ====== Lüliti ====== ====== Lüliti ======
  
-//Vajalikud teadmised: [HW] [[et:hardware:homelab:digi]], [AVR] [[et:avr:registers]], [AVR] [[et:avr:io]], [LIB] [[et:software:homelab:library:pin]], [PRT] [[et:examples:digi:led]]//+//Vajalikud teadmised:  
 +[HW] [[et:hardware:homelab:digi]],  
 +[AVR] [[et:avr:io]],\\ 
 +[LIB] [[et:software:homelab:library:pin]],  
 +[PRT] [[et:examples:digi:led]] //
  
 ===== Teooria ===== ===== Teooria =====
Line 18: Line 23:
 |{{:examples:digi:switch:switch_pushbutton.jpg?80|}} | {{:examples:digi:switch:switch_tumbler.jpg?80|}} | {{:examples:digi:switch:switch_rocker.jpg?80|}} |  {{:examples:digi:switch:switch_micro.jpg?80|}} | {{:examples:digi:switch:switch_dil.jpg?80|}} | |{{:examples:digi:switch:switch_pushbutton.jpg?80|}} | {{:examples:digi:switch:switch_tumbler.jpg?80|}} | {{:examples:digi:switch:switch_rocker.jpg?80|}} |  {{:examples:digi:switch:switch_micro.jpg?80|}} | {{:examples:digi:switch:switch_dil.jpg?80|}} |
 | {{:examples:digi:switch:switch_sch_dpst.png?80|}} | {{:examples:digi:switch:switch_sch_spdt.png?80|}} | {{:examples:digi:switch:switch_sch_spdt.png?80|}} | {{:examples:digi:switch:switch_sch_spdt.png?80|}} | {{:examples:digi:switch:switch_sch_2_spst.png?80|}} | | {{:examples:digi:switch:switch_sch_dpst.png?80|}} | {{:examples:digi:switch:switch_sch_spdt.png?80|}} | {{:examples:digi:switch:switch_sch_spdt.png?80|}} | {{:examples:digi:switch:switch_sch_spdt.png?80|}} | {{:examples:digi:switch:switch_sch_2_spst.png?80|}} |
 +
 +Lüliti kasutamiseks andurina mikrokontrolleri juures ühendatakse lüliti üks kontakt mikrokontrolleri viiguga, mis määratakse programmis sisendiks. Kui toimub kontakti ühendamine maa- või toitepotentsiaaliga, muutub ka mikrokontrolleri viigule vastava siini biti väärtus. Loogiline variant on kasutada pöiallülitit, mis võimaldab üht kontakti ühendada valitud kontaktiga (antud juhul siis maa või toitega), kuid see pole päris nii lihtne. Põhjus on selles, et ümberlülitamise hetkel ei ole kontaktid omavahel ühenduses. See hetk on väga lühike (millisekundites), kuid sellesama hetke jooksul pole mikrokontrolleri sisendviik kuhugi ühendatud ja sel on määramata väärtus. Elektromagnetiliste häirete tõttu (mida leidub kõikjal) võib mitte kuhugi ühendatud sisendviik täiesti suvalistel ajahetkedel omada 0 või 1 väärtust.
  
 [{{  :examples:digi:switch:switch_input_pull-up.png?200|Lüliti ühendusskeem //pull-up// takistiga}}] [{{  :examples:digi:switch:switch_input_pull-up.png?200|Lüliti ühendusskeem //pull-up// takistiga}}]
- 
 [{{  :examples:digi:switch:switch_bounce.png?200|Lüliti kontaktide põrkumine}}] [{{  :examples:digi:switch:switch_bounce.png?200|Lüliti kontaktide põrkumine}}]
- 
-Lüliti kasutamiseks andurina mikrokontrolleri juures ühendatakse lüliti üks kontakt mikrokontrolleri viiguga, mis määratakse programmis sisendiks. Kui toimub kontakti ühendamine maa- või toitepotentsiaaliga, muutub ka mikrokontrolleri viigule vastava siini biti väärtus. Loogiline variant on kasutada pöiallülitit, mis võimaldab üht kontakti ühendada valitud kontaktiga (antud juhul siis maa või toitega), kuid see pole päris nii lihtne. Põhjus on selles, et ümberlülitamise hetkel ei ole kontaktid omavahel ühenduses. See hetk on väga lühike (millisekundites), kuid sellesama hetke jooksul pole mikrokontrolleri sisendviik kuhugi ühendatud ja sel on määramata väärtus. Elektromagnetiliste häirete tõttu (mida leidub kõikjal) võib mitte kuhugi ühendatud sisendviik täiesti suvalistel ajahetkedel omada 0 või 1 väärtust. 
  
 Häired teevadki lülitite kasutamise keerukamaks. Üks peamine meetod määramata olekute vältimiseks on mikrokontrolleri sisend ühendada läbi takisti kas maa- või toitepotentsiaaliga. Sellises funktsioonis olevat takistit nimetatakse inglise keeles kas //pull-down// või //pull-up// takistiks. Tavaliselt ulatub //pull-up// või //pull-down// takistite takistus mõnest kilo-oomist ühe mega-oomini. Kui lüliti on avatud, jääb sisendile, millele on ühendatud takisti, pinge, kui lüliti sulgeda, rakendub sisendile lüliti pinge, sest lüliti takistus on palju väiksem (nullilähedane) kui takisti oma. Sisuliselt on tegu pingejaguriga. Häired teevadki lülitite kasutamise keerukamaks. Üks peamine meetod määramata olekute vältimiseks on mikrokontrolleri sisend ühendada läbi takisti kas maa- või toitepotentsiaaliga. Sellises funktsioonis olevat takistit nimetatakse inglise keeles kas //pull-down// või //pull-up// takistiks. Tavaliselt ulatub //pull-up// või //pull-down// takistite takistus mõnest kilo-oomist ühe mega-oomini. Kui lüliti on avatud, jääb sisendile, millele on ühendatud takisti, pinge, kui lüliti sulgeda, rakendub sisendile lüliti pinge, sest lüliti takistus on palju väiksem (nullilähedane) kui takisti oma. Sisuliselt on tegu pingejaguriga.
Line 43: Line 47:
  
  // Lõputu tsükkel  // Lõputu tsükkel
- while (true)+ while (1)
  {  {
- // nupule S1 vastab roheline LED,+ // Nupule S1 vastab roheline LED,
  // mis süttib nupu alla vajutades  // mis süttib nupu alla vajutades
  if(pin_get_value(S1) == 1)  if(pin_get_value(S1) == 1)
Line 72: Line 76:
 ===== Praktika ===== ===== Praktika =====
  
-Kodulabori Kasutajaliidese mooduli plaadil on kolm surunupp-lülitit. Lülitid ühendavad mikrkontrolleri viike maaga, kuid mitte otse, vaid läbi takisti – seda põhjusel, et juhuslikul mikrokontrolleri viikude väljundiks määramisel neid nupuvajutusel ei lühistataks. Lülititel on ka //pull-up// takistid, kuid need on palju suurema takistusega kui kaitsetakistid, nii et nupu allavajutamisel jääb vastavale mikrokontrolleri viigule ikkagi 0 V lähedane pinge.+Kodulabori Kasutajaliidese mooduli plaadil on kolm surunupp-lülitit. Lülitid ühendavad mikrokontrolleri viike maaga, kuid mitte otse, vaid läbi takisti – seda põhjusel, et juhuslikul mikrokontrolleri viikude väljundiks määramisel neid nupuvajutusel ei lühistataks. Lülititel on ka //pull-up// takistid, kuid need on palju suurema takistusega kui kaitsetakistid, nii et nupu allavajutamisel jääb vastavale mikrokontrolleri viigule ikkagi 0 V lähedane pinge.
    
 Lülitite asukohad on toodud riistvarakirjelduses. Lülitite oleku lugemiseks tuleb mikrokontrolleri vastavad viigud määrata sisendiks. AVR siseseid //pull-up// takisteid ei pea tööle rakendama, sest, nagu öeldud, viikudel juba on välised takistid. Kui nupp alla vajutada, on viigule vastaval siinil biti väärtus 0, kui nupp lahti lasta, siis väärtus 1. Selleks et näha, kas mikrokontroller sai nupuvajutusest aru, võib kasutada plaadil olevaid LED indikaatoreid. Lülitite asukohad on toodud riistvarakirjelduses. Lülitite oleku lugemiseks tuleb mikrokontrolleri vastavad viigud määrata sisendiks. AVR siseseid //pull-up// takisteid ei pea tööle rakendama, sest, nagu öeldud, viikudel juba on välised takistid. Kui nupp alla vajutada, on viigule vastaval siinil biti väärtus 0, kui nupp lahti lasta, siis väärtus 1. Selleks et näha, kas mikrokontroller sai nupuvajutusest aru, võib kasutada plaadil olevaid LED indikaatoreid.
Line 119: Line 123:
 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 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.  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 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. 
  
-Järgnev näide illustreerib nuppude kasutamist ja mitmekordse loenduse ellimineerimist kasutades tühja tsüklit, mille korral oodatakse nuppu vabastamist.+Järgnev näide illustreerib nuppude kasutamist ja mitmekordse loenduse elimineerimist kasutades tühja tsüklit, mille korral oodatakse nuppu vabastamist.
 <code c> <code c>
-// Kodulabori Kasutajaliidese mooduli +// Kodulabori nuppude kontaktide põrkumise filtreerimise näidisprogramm
-// nuppude kontaktide põrkumise filtreerimise näidisprogramm+
 #include <homelab/pin.h> #include <homelab/pin.h>
  
Line 134: Line 137:
  pin_setup_output(led_yellow);  pin_setup_output(led_yellow);
  pin_setup_output(led_green);  pin_setup_output(led_green);
 +
  // Nupu viigu sisendiks seadmine  // Nupu viigu sisendiks seadmine
  pin_setup_input(S1);  pin_setup_input(S1);
  
- // Lõputu stükkel + // Lõputu tsükkel 
- while(1)+ while (1)
  {  {
- // Kontrollime, kas nupp on alla vajutatud+ // Nupu alla vajutamise kontroll
  if(button_read(S1))  if(button_read(S1))
  {  {
- // Loenduri väärtusele vastava LEDi süütamine+ // Loenduri väärtusele vastava LED-i süütamine
  if(counter == 0) led_on(led_green);  if(counter == 0) led_on(led_green);
  else led_off(led_green);  else led_off(led_green);
Line 154: Line 158:
  counter = (counter + 1) % 3;  counter = (counter + 1) % 3;
   
- // Ootame nupu lahtilaskmist tühjas tsüklis+ // Nupu vabastamise ootamine tühjas tsüklis
  while(button_read(S1) != 0);  while(button_read(S1) != 0);
  }  }
Line 161: Line 165:
 </code> </code>
  
-Kui nüüd programmi proovida, siis LED-id süttivad täpselt sellises järjekorras nagu kasutaja nupplülitit vajutab. +Kui nüüd programmi proovida, siis LED-id süttivad täpselt sellises järjekorras nagu kasutaja nupplülitit vajutab. Nuppude kasutamise näidiskood põhineb Kodulabori viikude teegil, mida on tutvustatud valgusdioodi näites.
- +
-Nuppude kasutamise näidiskood põhineb Kodulabori viikude teegil, mida on tutvustatud valgusdioodi näites.+
  
 Tabelis on näha teegis kirjeldatud nuppude konstandid ja vastavad Kontrollermooduli viigud. Tabelis on näha teegis kirjeldatud nuppude konstandid ja vastavad Kontrollermooduli viigud.
Line 169: Line 171:
 |S0|PC2|PQ2|Kontrollermoodulil olev testnupp| |S0|PC2|PQ2|Kontrollermoodulil olev testnupp|
 |S1|PC0|PH2|Kasutajaliidese moodulil olev alumine nupp| |S1|PC0|PH2|Kasutajaliidese moodulil olev alumine nupp|
-|S2|PC1|PH1|Kasutajaliidese moodulil olev keskmine nupp|+|S2|PC1|PH1|Kasutajaliidesemoodulilolevkeskminenupp|
 |S3|PC2|PH0|Kasutajaliidese moodulil olev ülemine nupp| |S3|PC2|PH0|Kasutajaliidese moodulil olev ülemine nupp|
  
  
 <code c> <code c>
-// Kodulabori Kasutajaliidese mooduli +// Kodulabori nuppude testimise näidisprogramm
-// nuppude testimise programm.+
 #include <homelab/pin.h> #include <homelab/pin.h>
  
Line 185: Line 186:
  pin_setup_output(led_yellow);  pin_setup_output(led_yellow);
  pin_setup_output(led_green);  pin_setup_output(led_green);
 +
  // Nuppude viikude sisendiks seadmine  // Nuppude viikude sisendiks seadmine
  pin_setup_input(S1);  pin_setup_input(S1);
Line 191: Line 193:
   
  // Lõputu tsükkel  // Lõputu tsükkel
- while (true)+ while (1)
  {  {
  // Igale nupule vastab üks LED,  // Igale nupule vastab üks LED,
- // mis süttib nuppu alla vajutades+ // mis süttib nupu alla vajutades
  if(button_read(S1)) led_on(led_green);  if(button_read(S1)) led_on(led_green);
  else led_off(led_green);  else led_off(led_green);
et/examples/digi/switch.1412753575.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