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:led [2014/10/06 12:41] raivo.sellet:examples:digi:led [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
-~~PB~~+<pagebreak>
 ====== Valgusdiood ====== ====== Valgusdiood ======
  
 //Vajalikud teadmised:  //Vajalikud teadmised: 
-[HW][[et:hardware:homelab:controller]], [HW][[et:hardware:homelab:digi]], \\  +[HW][[et:hardware:homelab:digi]],  
-[ELC][[et:electronics:led_resistor]], [AVR][[et:avr:registers]], [AVR] [[et:avr:io]], \\ +[ELC][[et:electronics:led_resistor]], 
 +[AVR][[et:avr:registers]], [AVR] [[et:avr:io]], 
 [LIB][[et:software:homelab:library:bit]], [LIB][[et:software:homelab:library:pin]]// [LIB][[et:software:homelab:library:bit]], [LIB][[et:software:homelab:library:pin]]//
  
Line 15: Line 16:
 [{{  :examples:digi:led:led_designator.png?150|Valgusdioodi skemaatiline tähis ja polaarsus}}] [{{  :examples:digi:led:led_designator.png?150|Valgusdioodi skemaatiline tähis ja polaarsus}}]
  
-Päripingestamisel rakendatakse LED-i anoodile positiivne ja katoodile negatiivne pinge. LED-i päripinge sõltub selle värvusest – pikema lainepikkusega LED-ide (punased) puhul on see ~2 V, lühema lainepikkusega (sinised) on see ~3 V. Tavaliselt on LED-ide võimsus mõnikümmend millivatti, sellest tulenevalt peab ka vool samas suurusjärgus olema. Suurema pinge või voolu rakendamisel LED-ile on oht see lihtsalt läbi põletada.+Päripingestamisel rakendatakse LED-i anoodile positiivne ja katoodile negatiivne pinge. LED-i päripinge sõltub selle värvusest – pikema lainepikkusega LED-ide (punased) puhul on see ~2 V, lühema lainepikkusega (sinised) on see ~3 V. Tavaliselt on LED-ide võimsus mõnikümmend millivatti, sellest tulenevalt peab ka vool samas suurusjärgus olema. Suurema pinge või voolu rakendamisel LED-ile on oht see lihtsalt läbi põletada. Kui LED-e kasutatakse spetsiaalselt valgustamiseks, on mõistlik kasutada spetsiifilisi elektriskeeme nendele täpselt õige pinge ja voolu tekitamiseks. Tihti kasutatakse LED-e aga indikaatoritena ja neid toidetakse otse mikrokontrolleri viikudelt. Kuna mikrokontrollerite toitepinge on enamasti kõrgem LED-ide päripingest ja ka voolutugevus on suurem, siis tuleb LED-iga järjestikku lisada takisti, mis piirab voolu ja tekitab vajaliku pingelangu. Takisti arvutusvalemid leiab elektroonika peatükist.
  
-Kui LED-e kasutatakse spetsiaalselt valgustamiseks, on mõistlik kasutada spetsiifilisi elektriskeeme nendele täpselt õige pinge ja voolu tekitamiseks. Tihti kasutatakse LED-e aga indikaatoritena ja neid toidetakse otse mikrokontrolleri viikudelt. Kuna mikrokontrollerite toitepinge on enamasti kõrgem LED-ide päripingest ja ka voolutugevus on suurem, siis tuleb LED-iga järjestikku lisada takisti, mis piirab voolu ja tekitab vajaliku pingelangu. Takisti arvutusvalemid leiab elektroonika peatükist. +[{{  :examples:digi:led:led_pin_markings.png?150|Jalgadega ja pindliides valgusdioodi viikude tähistus}}]
- +
-[{{  :examples:digi:led:led_pin_markings.png?200|Jalgadega ja pindliides valgusdioodi viikude tähistus}}]+
  
 LED-e toodetakse mitmesugustes kestades. Kõige levinumatel „jalgadega“ LED-idel on 3 mm või 5 mm läbimõõduga ümmargune kest ja 2 pikka metallist viiku. Pikem viik tähistab anoodi, lühem katoodi. Pindliides kestas (SMD) LED-idel on polaarsuse tähistamiseks põhja all T-kujuline tähis, kus T katus tähistab anoodi ja teravik katoodi asukohta. LED-e toodetakse mitmesugustes kestades. Kõige levinumatel „jalgadega“ LED-idel on 3 mm või 5 mm läbimõõduga ümmargune kest ja 2 pikka metallist viiku. Pikem viik tähistab anoodi, lühem katoodi. Pindliides kestas (SMD) LED-idel on polaarsuse tähistamiseks põhja all T-kujuline tähis, kus T katus tähistab anoodi ja teravik katoodi asukohta.
Line 25: Line 24:
 ===== Praktika ===== ===== Praktika =====
  
-Kodulabori Kontrollermoodulil on üksik indikaator LED, mille anood on läbi takisti ühendatud toitega ja katood kontrolleri viiguga. Selleks et Kontrollermooduli LED-i põlema süüdata ja kustutada, tuleb juhtviik väljundiks defineerida ning seda vastavalt madalaks ja kõrgeks seada. Ehk siis viigu kõrges olekus LED ei põle ja madalas põleb. Põhimõtteliselt võib LED-e ka teistmoodi ühendada, nii et anood on mikrokontrolleri viiguga ja katood maaga ühendatud (kusagil vahel peab ka takisti olema) – sellisel juhul viigu kõrges olekus LED põleb ja madalas olekus ei põle. +Kodulabori Kontrollermoodulil on üksik indikaator LED, mille anood on läbi takisti ühendatud toitega ja katood kontrolleri viiguga. Selleks et Kontrollermooduli LED-i põlema süüdata ja kustutada, tuleb juhtviik väljundiks defineerida ning seda vastavalt madalaks ja kõrgeks seada. Ehk siis viigu kõrges olekus LED ei põle ja madalas põleb. Põhimõtteliselt võib LED-e ka teistmoodi ühendada, nii et anood on mikrokontrolleri viiguga ja katood maaga ühendatud (kusagil vahel peab ka takisti olema) – sellisel juhul viigu kõrges olekus LED põleb ja madalas olekus ei põle. Peaaegu kõik Kodulabori praktilised näited, kaasa arvatud LED-i süütamise näide, kasutavad Kodulabori viikude teeki. Viikude teegis on andmetüüp //pin//, mis sisaldab viiguga seotud registrite aadresse ja viigu bitimaski. Kui programmi tekitada //pin//-tüüpi muutuja ja see kohe programmi alguses makrofunktsiooniga //PIN// algväärtustada, saab selle muutuja abil viiku kogu programmi ulatuses vabalt kasutada, ilma et peaks oskama registreid kasutada. Järgnevalt on toodud 2 näiteprogrammi, mis teevad täpselt sama asja, kuid üks neist on kirjutatud Kodulabori viikude teegi baasil, teine mitte. Valgusdiood //led_debug// on Kodulabori teegis juba kirjeldatud, kui PB7 (Kodulabor I & II) ja PQ2 (Kodulabor III), mis füüsiliselt asub Kontrollermoodulil.
- +
-Peaaegu kõik Kodulabori praktilised näited, kaasa arvatud LED-i süütamise näide, kasutavad Kodulabori viikude teeki. Viikude teegis on andmetüüp //pin//, mis sisaldab viiguga seotud registrite aadresse ja viigu bitimaski. Kui programmi tekitada //pin//-tüüpi muutuja ja see kohe programmi alguses makrofunktsiooniga //PIN// algväärtustada, saab selle muutuja abil viiku kogu programmi ulatuses vabalt kasutada, ilma et peaks oskama registreid kasutada. Järgnevalt on toodud 2 näiteprogrammi, mis teevad täpselt sama asja, kuid üks neist on kirjutatud Kodulabori viikude teegi baasil, teine mitte.+
  
 <code c> <code c>
-// Kodulabori Kontrollermooduli LED-i testimise programm +// Kodulabori Kontrollermooduli LED-i testimise näidisprogramm,  
-// Põhineb Kodulabori teegil+// mis põhineb Kodulabori teegil
 #include <homelab/pin.h> #include <homelab/pin.h>
  
-// LED-i viiguga seotud parameetrite määramine muutujale +// LED-i viigu defineerimine 
-// Robootika Kodulabor II +pin led_debug = PIN(Q,2);
-// pin debug_led = PIN(B, 7); +
-// Robootika Kodulabor III +
-pin debug_led = PIN(Q, 2);+
  
 // Põhiprogramm // Põhiprogramm
Line 44: Line 38:
 { {
  // LED-i viigu väljundiks seadmine  // LED-i viigu väljundiks seadmine
- pin_setup_output(debug_led);+ pin_setup_output(led_debug);
   
  // LED-i süütamine  // LED-i süütamine
- pin_clear(debug_led); + pin_clear(led_debug);
 } }
 </code> </code>
  
 <code c> <code c>
-// Kodulabori II Kontrollermooduli LED-i testimise programm +// Kodulabori II Kontrollermooduli LED-i testimise näidisprogramm,  
-// Põhineb otsesel registrite muutmisel+// mis põhineb registritel
 #include <avr/io.h> #include <avr/io.h>
  
Line 71: Line 65:
 Mis siis on viikude teegi ja registrite kasutamise vahe? Vahe on kasutusmugavuses - teegiga on see lihtsam, sest ei pea registrite nimesid ja nende toimet teadma. Kõige olulisem teegi eelis on aga kohandatavus. Registreid kasutades tuleb viigu muutmiseks kogu programmis registrite nimed ja bitimaskid ümber muuta, teegi puhul tuleb seda teha vaid programmi alguses, kus viigu muutuja algväärtustatakse. Otsesel registrite kasutamisel on üks näiline eelis - viigu kasutamine on vahetu ja see ei toimu läbi programmimälu ja aeganõudvate funktsioonide. Tegelikult on aga uuemad AVR-GCC kompilaatori versioonid niivõrd taibukad, et teisendavad teegi funktsioonid täpselt sama vahetuks registrite manipuleerimise käskudeks, nagu oleks seda otse programmis tehtud. Täpsustuseks tuleb öelda, et kompilaatori teisendusoskus kehtib ainult konstantsete //pin//-tüüpi üksikmuutujate kohta, mitte töö ajal muutuvate muutujate ja massiivide kohta. Mis siis on viikude teegi ja registrite kasutamise vahe? Vahe on kasutusmugavuses - teegiga on see lihtsam, sest ei pea registrite nimesid ja nende toimet teadma. Kõige olulisem teegi eelis on aga kohandatavus. Registreid kasutades tuleb viigu muutmiseks kogu programmis registrite nimed ja bitimaskid ümber muuta, teegi puhul tuleb seda teha vaid programmi alguses, kus viigu muutuja algväärtustatakse. Otsesel registrite kasutamisel on üks näiline eelis - viigu kasutamine on vahetu ja see ei toimu läbi programmimälu ja aeganõudvate funktsioonide. Tegelikult on aga uuemad AVR-GCC kompilaatori versioonid niivõrd taibukad, et teisendavad teegi funktsioonid täpselt sama vahetuks registrite manipuleerimise käskudeks, nagu oleks seda otse programmis tehtud. Täpsustuseks tuleb öelda, et kompilaatori teisendusoskus kehtib ainult konstantsete //pin//-tüüpi üksikmuutujate kohta, mitte töö ajal muutuvate muutujate ja massiivide kohta.
  
-Järgnevalt on osaliselt toodud viikude teegi lähtekood, mille eesmärk on selgitada teegis toimuvat. Paraku ei pruugi see algajale päris arusaadav olla kuna kasutusel on C-keele viidad (inglise keeles //pointer//), millest selle raamatu C-keele õpetuses kirjutatud pole. Viitade kohta kohta leiab huviline palju infomaterjali internetist ja programmeerimise õpikutest. +Järgnevalt on osaliselt toodud viikude teegi lähtekood, mille eesmärk on selgitada teegis toimuvat. Paraku ei pruugi see algajale päris arusaadav olla kuna kasutusel on C-keele viidad (inglise keeles //pointer//), millest selle raamatu C-keele õpetuses kirjutatud pole. Viitade kohta leiab huviline palju infomaterjali internetist ja programmeerimise õpikutest. 
  
 <code c> <code c>
 +// Viikude defineerimine pin struktuuris
 +// pin nimi = PIN(PORDI TÄHT, VIIGU NUMBER PORDIS);
 +pin led_green = PIN(H,5);
 +
 // Viigu seadmine väljundiks // Viigu seadmine väljundiks
-inline void pin_setup_output(pin pin) +inline void pin_setup_output(pin pin) {
-{+
  bitmask_set(*pin.ddr, pin.mask);  bitmask_set(*pin.ddr, pin.mask);
 } }
    
 // Viigu seadmine kõrgeks // Viigu seadmine kõrgeks
-inline void pin_set(pin pin) +inline void pin_set(pin pin) {
-{+
  bitmask_set(*pin.port, pin.mask);  bitmask_set(*pin.port, pin.mask);
 } }
  
 // Viigu seadmine madalaks // Viigu seadmine madalaks
-inline void pin_clear(pin pin) +inline void pin_clear(pin pin) {
-{+
  bitmask_clear(*pin.port, pin.mask);  bitmask_clear(*pin.port, pin.mask);
 } }
Line 94: Line 89:
  
 Peale Kontrollermooduli asuvad LED-id ka Kasutajaliidese moodulil. Need on elektriliselt ühendatud samamoodi nagu Kontrollermooduli LED ehk katood on ühenduses AVR viiguga. Täpsemalt vaata vastava mooduli riistvarakirjeldusest. Lisaks //pin_set// ja //pin_clear// käskudele võib LED-ide tüürimiseks kasutada ka käske //led_on// ja //led_off// Peale Kontrollermooduli asuvad LED-id ka Kasutajaliidese moodulil. Need on elektriliselt ühendatud samamoodi nagu Kontrollermooduli LED ehk katood on ühenduses AVR viiguga. Täpsemalt vaata vastava mooduli riistvarakirjeldusest. Lisaks //pin_set// ja //pin_clear// käskudele võib LED-ide tüürimiseks kasutada ka käske //led_on// ja //led_off//
-Järgnevas tabelis on näha teegis kirjeldatud LED-ide konstandid ja vastavad Kontrollermooduli viigud.+Järgnevas tabelis on näha teegis kirjeldatud LED-ide konstandid ja vastavad Kontrollermooduli viigud. Roheline, kollane ja punane LED asuvad Kasutajaliidese moodulil.
 ^Konstandi nimi^Alternatiivne nimi ^ Kodulabor I & II viik^Kodulabor III viik^Kirjeldus^ ^Konstandi nimi^Alternatiivne nimi ^ Kodulabor I & II viik^Kodulabor III viik^Kirjeldus^
 |led_debug|LED0|PB7|PQ2 |Kontrollermoodulil olev test LED| |led_debug|LED0|PB7|PQ2 |Kontrollermoodulil olev test LED|
-|led_green|LED1|PC3|PH5|Kasutajaliidese moodulil olev roheline LED| +|led_green|LED1|PC3|PH5| roheline LED| 
-|led_yellow|LED2|PC4|PH4|Kasutajaliidese moodulil olev kollane LED| +|led_yellow|LED2|PC4|PH4| kollane LED| 
-|led_red|LED3|PC5|PH3|Kasutajaliidese moodulil olev punane LED|+|led_red|LED3|PC5|PH3| punane LED|
  
 Kodulabori teegipõhine näidisprogramm, mis kasutab LED-ide konstante näeb välja järgmine: Kodulabori teegipõhine näidisprogramm, mis kasutab LED-ide konstante näeb välja järgmine:
  
 <code c> <code c>
-// Kodulabori Kasutajaliidese mooduli +// Kodulabori Kasutajaliidese mooduli LED-ide testimise näidisprogramm
-// LED-ide testimise programm+
 #include <homelab/pin.h> #include <homelab/pin.h>
  
Line 119: Line 113:
  led_on(led_red);  led_on(led_red);
  led_on(led_green);  led_on(led_green);
-  
  // Kollase LED-i kustutamine  // Kollase LED-i kustutamine
  led_off(led_yellow);  led_off(led_yellow);
 } }
 </code> </code>
et/examples/digi/led.1412599261.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