Vklop LED diode v odvisnosti od svetlobe

Vklop / izklop dveh LED diod v odvisnosti od svetlobe, ki jo zaznavata dva fotoupora LDR.

Fotouporu se spreminja upornost v odvisnosti od svetlobe. Bolj je osvetljen, manjša je njegova upornost. Če zaporedno s fotouporom povežemo upor ustrezne vrednosti in vezje priključimo na napetost, deluje vezje kot napetostni delilnik. Bolj kot je fotoupor osvetljen, manjši je padec napetost na njem, saj se pri večji svetlobi njegova upornost zmanjšuje.

Slika 1: Spreminjanje napetosti na fotouporu v odvisnosti od svetlobe

Pri naši vaji bomo uporabili dva takšna vezja:

Izbrali bomo referenčno vrednost napetosti Vref. Če bo napetost na prvem fotouporu večja od referenčne napetosti, mora vklopiti LED dioda, priključena na pin RB0, če bo napetost na drugem fotouporu tudi večja od referenčne napetosti, mora vklopiti tudi LED dioda, priključena na pin RB1.

Pini mikrokontrolerja PIC16f628a so na PORTA povezani s funkcijo komparatorja (primerjalnika) in napetostne reference. Zato delovanje pinov na PORTA določimo z ustrezno izbiro bitov v registru CMCON (Comparator control register) in registrom VRCON (Voltage reference control register). Na razpolago imamo različne načine priključitve komparatorjevih vhodov.

Kadar za PORTA izberemo funkcijo komparatorja, register TRISA ravno tako nadzoruje smer pinov na PORTA, zato moramo paziti, da pravilno določimo vhodno/izhodne pine.

Način delovanja in priključitve komparatorjevih vhodov, ki jih bomo uporabili pri naši vaji prikazuje slika 1.

Slika 1: Priključitev komparatorjev, PIC16f628a

Delovanje kompararorjev in njihovih vhodov določimo z nastavitvijo bitov CM0, CM1, CM2 in CIS v registru CMCON.

Tabela 1: Register CMCON

Bit CM0 postavimo na vrednost 0, bit CM1 na vrednost 1, bit CM2 pa na vrednost 0. Četrti bit (bit 3) registra CMCON, bit CIS postavimo na vrednost 0 ker bomo inventirujoča vhoda komparatorjev povezali s pinoma RA0/AN0 in RA1/AN1. V programu bomo neprestano preverjali vrednost bitov C1OUT in C2OUT, ki predstavljata izhod komparatorjev. Bita C1INV in C2INV določata ali bo izhod komparatorjev invertirujoč ali neinvertirujoč. Ker imamo ta dva bita postavljena na vrednost 0, bosta izhodna bita komparatorjev C1OUT in C2OUT na vrednosti 1, če bo referenčna napetost večja od napetosti na pinih RA0/AN0 in RA1/AN1.

Če bo napetost na obeh fotouporih večja od referenčne napetosti, se bosta torej bita C1OUT in C2OUT postavila na vrednost 0. Takrat se morata vklopiti obe LED diodi.

Referenčno napetost nastavimo s prvimi štirimi biti registra VRCON.

Tabela 2: Register VRCON

Bit 7, VREN je Vref enable bit in ga postavimo na vrednost 1, saj želimo uporabiti referenčno napetost.

Bit 6, VRON postavimo na 0, saj ne želimo imeti referenčne napetosti na pinu RA2.

Bit 5, VRR postavimo na 0, ker želimo uporabiti lestvico večjih vrednosti referenčne napetosti.

Z biti 0 - 3 (VR0 - VR3) nastavljamo vrednost referenčne napetosti Vref.

Poglejmo katere vrednosti referenčne napetosti Vref lahko uporabimo in kako se izračuna:

Tabela 3: Lestvica referenčne napetosti Vref

Referenčno napetost izračunamo po naslednjih formulah:

Za naš primer bomo uporabili nastavitev bitov VR <3:0> 1000, bit VRR pa 0 (večji razpon. Če izračunamo po zgornji enačbi dobimo:

Referenčna napetost Vref, s katero se bosta primerjali vrednosti napetosti na fotouporih bo 2,5 V.

Slika 2: Priklop elementov na mikrokontroler

Program za krmiljenje razsvetljave (LED diod) v odvisnosti od svetlobe (assembler):

 ;Uporaba analognega komparatorja, Krmiljenje LED diod v odvisnosti od svetlobe.

 ;Okolje MPLAB IDE v8.92, prevajalnik MPASM Assembler V5.51, oscilator 4 MHz.

 ;Avtor: Milan Ivič, okt 2017

 ;-------------------------------------------------------------------------------------------------------------------

    list p=16f628a                      ;Tip mikrokontrolerja

    #include <p16f628a.inc> ;Vključi v program datoteko p16f628a.inc,

    __CONFIG 0x2129

    #define LED1 PORTB,0 ;LED1 je priključena na pin RB0

    #define LED2 PORTB,1 ;LED2 je priključena na pin RB1

        org 0x000

        goto Glavni_program              ;Nadaljuj na naslovu Glavni_program

        org 0x004

Glavni_program

    bsf STATUS,5                  ;Banka 1

    movlw b'00000011'

    movwf TRISA                   ;Pina RA0 in RA1 sta vhodna pina

    movlw b'11111100'

    movwf TRISB                   ;Pina RB0 in RB1 sta izhodna pina

    movlw b'10001000'

    movwf VRCON         ;Omogočena uporaba in določitev referenčne napetosti

    bcf STATUS,5                  ;Banka 0

    movlw .2                      ;Decimalno 2 je binarno 010

    movwf CMCON                   ;Prvi trije biti registra CMCON imajo vrednost 010

    clrf PORTB                    ;Inicializacija PORTB

 ;************* Vklop / Izklop LED diod v odvisnosti od svetlobe *******************

Preveri

    btfsc CMCON,C1OUT  ;Ali je fotoupor zaznal temo?

    bcf LED1                      ;Ni zaznal teme, izklopi LED diodo

    btfss CMCON,C1OUT

    bsf LED1  ;Je zaznal temo, vklopi LED diodo

    btfsc CMCON,C2OUT             ;Preverjanje na drugem fotouporu

    bcf LED2

    btfss CMCON,C2OUT

    bsf LED2

    goto  Preveri ;Neskončna zanka

    end

V programu smo uporabili direktivo #define. Direktiva #define (LED1  PORTB,0) ima dva parametra, prvi je LED1, drugi pa PORTB,0. Direktiva tekst v prvem parametru zamenja s tekstom v drugem parametru. Kadarkoli se npr. v programu pojavi beseda LED1, jo prevajalnik zamenja s tekstom PORTB,0 kamor tudi povežemo LED diodo LED1.

Program za krmiljenje razsvetljave (LED diod) v odvisnosti od svetlobe (programski jezik c):

 /*

  Uporaba analognega komparatorja mikrokontrolerja PIC16f628a.

  Okolje MPLAB IDE v8.92, HI_TECH compiler for PIC10/12/16 MCUs V9.82, oscilator 4 MHz.

  Avtor: Milan Ivič, okt 2017

 */

    #include <htc.h>                    //Predprocesorska direktiva za Hi-Tech compiler

    #include <pic.h>                    //Predprocesorska direktiva ki vključuje potrebne datoteke za PIC16f628a

    #define _XTAL_FREQ 4000000          //Razglasitev konstante z direktivo #define => Kristalni oscilator 4 MHz

    __CONFIG (0x2129);                  //Konfiguracijski biti

  //Določitev pinov:

    #define LED1 RB0                //LED1 je priključena na pin RB0

    #define LED2 RB1                //LED2 je priključena na pin RB1

    void main()

    {

      TRISB0 = 0;                        //RB0 je izhodni pin

      TRISB1 = 0;                        //RB1 je izhodni pin

      LED1 = 0;                          //Inicializacija

      LED2 = 0;

      TRISA0 = 1;                        //RA0 je vhodni pin

      TRISA1 = 1;                        //RA1 je vhodni pin

      VRCON = 0x88;                  //Omogočena uporaba in določitev referenčne napetosti (88(16) = 10001000(2))

      CMCON = 0x02;                  //Prvi trije biti registra CMCON imajo vrednost 010

      while(1)

      {

        if(C1OUT == 1)                //Preverjanje stanja bita C1OUT

          LED1 = 0;                   //Izklopi LED diodo

        else

          LED1 = 1;                   //Vklopi LED diodo

        if(C2OUT == 1)                //Preverjanje stanja bita C2OUT

          LED2 = 0;                   //Izklopi LED diodo

        else

          LED2 = 1;                   //Vklopi LED diodo

      }

    }

Ob vsaki spremembi komparatorjevega izhoda se lahko sproži prekinitev (interrupt), če smo omogočili odzivanje mikrokontrolerja na prekinitve. Prekinitve v mikrokontrolerju bomo spoznali v nadaljevanju.