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:
Padec napetosti na prvem fotouporu bomo povezali z analognim vhodom AN0 (pin 17 => RA0/AN0). Napetost ki se spreminja na prvem fotouporu je tudi napetost na analognem vhodu AN0.
Padec napetosti na drugem fotouporu bomo povezali z analognim vhodom AN1 (pin 18 => RA1/AN1). Napetost ki se spreminja na drugem fotouporu je tudi napetost na analognem vhodu AN1.
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:
VRR = 1 (manjši razpon):
VRR = 0 (večji razpon):
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.