2011_P21

Controlul iluminarii intr-o incapere

Project Description

Proiectul presupune controlarea intensitatii unui bec prin termediul placutei EV/Z3.

Astfel, dupa incarcarea programului in microcontrollerul PIC16F628A, vom putea controla intensitatea becului prin intermediul tastaturii incorporate pe placuta EV/Z3

Project Requirements

Veti folosi placa cu PIC16F628A. Veti avea un bec de maxim 12V cu intensitate variabila.

Pe placa EV/Z3 veti folosi 2 butoane pentru +/- pentru a mari/micsora intensitatea becului. Pe LCD-ul placutei veti afisa "Intensitate: 20%"

User Flow

Pregatire placuta

Dupa incarcarea programului pe microcontroller ce presupune conectarea placutei noastre prin cablu serial la computer, stabilirea comunicatiei intre PC si placuta si incarcarea programului efectiv pe microcontroller prin intermediul programului: iCprog.

Pregatire placuta EV/Z3

Se compileaza proiectul intr-un compilator de C embedded(OpenWatcom,etc.)

Se incarca fisierul SMP.asm in programul ModZ3 si se seteaza comunicatia seriala, apoi fiind trimis prin seriala catre placuta EV/Z3.

Se conecteaza prin seriala placuta EV/Z3 la placuta cu microcontrollerul nostru, si apoi se va putea controla intensitatea becului prin intermediul tastaturii incorporate pe placuta EV/Z3.  Sunt utilizabile 2 taste( "<-"   ,   "->"  ), pentru cresterea  si descresterea intensitatii.

Initial becul va fi oprit(Intensitate= 0%)

Intensitatea este afisata in procente, astfel la prima apasare a tastei de cresterii intensitatii, LCD-ul placutei EV/Z3 va afisa: Intensitate= 10%, urmand ca prin apasarea tastelor de crestere/descrestere, procentajul sa varieze din 10 in 10 procentaje. La apasarea tastelor de control a intensitatii, placa EV/Z3 va trimite prin seriala comanda catre placuta cu microcontroller, iar aceasta va actiona asupra intensitatii becului.

Required components

  • 3 rezistente RW25CF 4.7K (250 mW)
  • 1 rezistenta RW25CF 100R (250 mW)
  • 2 rezistente RW25CF 100K (250 mW)
  • 1 rezistenta RW25CF 10K
  • 2 condensatori CML 22pF 50V C0G
  • 5 condensatori CE 1.0uF 63V 105C Fujicon
  • 2 condensatori CML 47nF 50V Y5V P2.5
  • 1 buton TS-06E (TS-3) (tact switch)
  • 1 quartz Q20.000 MHz HC-49S
  • 1 microcontroller PIC16F628A-I/P
  • 1 circuit integrat MAX232N
  • 1 tranzistor LM7805
  • 2 socluri de 18 pini
  • 2 mufe TATA seriale de 18 pini DE9PF
  • 1 bec de 12V
  • 1 tranzistor BD239C
  • 1 stabilizator 12V MC7812CT
  • 1 mufa alimentare

Software Design

Descrierea codului aplicaţiei din punct de vedere software. Va include listing despre partea importanta a codului, algoritmi folositi. In caz ca folositi si un uC la placa secundara

codul pentru aceia. Se va adauga si modalitatea de compilare, ce IDE(Proteus, AVR Studio, Open Watcom) ati folosit in compilare

 

Cod program principal placa EV/Z3 care va citi ce tasta se apasa si daca se apasa tasta de incrementare sau decrementare ("->" / "<-") acesta va afisa pe ecran un mesaj cu intensitatea noua modificata si va trimite prin seriala catre microcontroller comanda de modificare a intensitati.

#include "platform_io.h"

const char *welcome = "Control iluminare";
const char *gol = "                ";
const char *serialStart = "Please send data";

char convert (int key)
{
static char cod[19] = {'0','2','4','6','8','A','C','E','c','l','1','3','5','7','9','B','D','F','r'};
return cod[key];
}    

static SerialConfig serialConf;

unsigned char buffer[32];

int main()
{
int key = 0;
char * intensitate = "Intensitate=  0%";
unsigned char comanda[1];
/* display our welcome message */
kIo.DisplayString(welcome);

/* Serial Initialization */
serialConf.baudRate   = b9600;
serialConf.parity     = none;
serialConf.stopBits   = one;
serialConf.wordLength = eight;
/* In order to check what EV/Z3 board is echoing on the serial port
* open Hyperterminal, create a new connection using the above parameters,
* Flow control: Hardware and Settings/Emulation: ANSI, connect and type some chars in it */

kIo.SerialInit(&serialConf);

/* wait for a key to be pressed */

comanda[0]='0';
while (1)
{
key = kIo.ReadKey();

if ( convert(key) == 'r')  // increment
{
comanda[0]='I';
kIo.SerialWrite(COM1, comanda, 1);        // trimite comanda pe seriala catre pic
if (intensitate[12]!='1')
{
if (intensitate[13]==' ')
{
intensitate[13]='1';
}
else
{
if (intensitate[13]=='9')
{
intensitate[13]='0';
intensitate[12]='1';
}
else
{
intensitate[13]=intensitate[13]+1;
}
}
}
}
if ( convert(key) == 'l')  // decrement
{
comanda[0]='D';
kIo.SerialWrite(COM1, comanda, 1);        // trimite comanda pe seriala catre pic
if (intensitate[13]!=' ')
{
if (intensitate[12]=='1')
{
intensitate[12]=' ';
intensitate[13]='9';
}
else
{
if (intensitate[13]=='1')
{
intensitate[13]=' ';
}
else
{
intensitate[13]=intensitate[13]-1;
}
}
}
}
kIo.DisplayString(gol);   // sterge ecranul
kIo.DisplayString(intensitate);  // afiseaza intensitatea curenta
}
return 0;
}

 

Cod microcontroler:

Functie care citeste seriala determina ce sa trimis si modifica intensitatea corespunzator daca a fost trimisa comanda corecta:


; Handlerul de intrerupere pentru seriala
handle_serial

bcf PIR1,RCIF ; sterg flagul de intrerupere
BANKSEL RCREG
movf RCREG,W
movwf serial_read

; verifcara seriala == "I" adica comanda de incrementare intensitate bec

movf 'I'               ; pune "I" in W pentru a verifica cu ce sa trimis pe seriala
xorwf serial_read,W    ; xor intre W ="I" si seriala , rezultat in W si va fi 0 daca sunt egale

; verificarea daca rezultatul W XOR serial_read este 0 si sare peste instrunctiunea goto next_char_D daca este

addlw 1               
clrf temp                ; temp = 0
addwf temp,1            ; temp = W
decfsz temp                ; decrementare temp , sare urmatoarea instructiune daca rezultatul este 0,
goto next_char_D        ; daca seriala != "I" atunci se verifica cu "D"

; seriala == "I" se trece la configurarea pic-ului pentru a reflecta comanda de crestere a intensitati becului

movf CCPR1L,W           
xorlw 240,w                ; verificarea daca W(are valoarea din CCPR1L) == 240 , 240 fiind valoarea maxima a intensitati
addlw 1
clrf temp                ; temp = 0
addwf temp,1            ; temp = W
decfsz temp                ; decrementare temp , sare urmatoarea instructiune daca rezultatul este 0,
goto inc_intens            ; CCPR1L != 240 se incrementeaza intensitatea
goto finish                ; CCPR1l == 240 se sare la sfarsitul intreruperi
inc_intens
movlw 24
addwf CCPR1L,1          ; incrementare CCPR1L cu 24 adica creste intensitatea cu 10%
goto finish                ; sari la sfarsit intrerupere

; verifcara seriala == "D" adica comanda de decrementare intensitate bec

next_char_D     

movf 'D'               ; pune "D" in W pentru a verifica cu ce sa trimis pe seriala
xorwf serial_read,W    ; xor intre W ="D" si seriala , rezultat in W si va fi 0 daca sunt egale

; verificarea daca rezultatul W XOR serial_read este 0 si sare peste instrunctiunea goto finish daca este

addlw 1
clrf temp                ; temp = 0
addwf temp,1            ; temp = W
decfsz temp                ; decrementare temp , sare urmatoarea instructiune daca rezultatul este 0,
goto finish        ; daca seriala !=  si de "D" , atunci ce sa trimis pe seriala nu este comanda pentru bec, salt la sfarsit intrererupere

; seriala == "D" se trece la configurarea pic-ului pentru a reflecta comanda de descrestere a intensitati becului

movf CCPR1L,W            ; verificare daca CCPR1L este 0 , 0 fiind minimul intensitati
addlw 1
clrf temp                ; temp = 0
addwf temp,1            ; temp = W
decfsz temp                ; decrementare W , sare urmatoarea instructiune daca rezultatul este 0,
goto dec_intens            ; CCPR1L != 0 se decrementeaza intensitatea
goto finish                ; CCPR1l == 0 se sare la sfarsitul intreruperi
dec_intens
movlw 24
subwf CCPR1L,1          ; decrementare CCPR1L cu 24 adica descresterea intensitatii cu 10%

;movf RCREG, 0
;sublw 32      ; convert la uppercase
;movwf TXREG
finish
;clrf RCREG
;movf CCPR1L,W
;movwf TXREG

 

Initializarea modul PWM:

; initializare modul PWM at 5kHz

BANKSEL TRISB                ; setare pin PWM ca output
bsf TRISB,3                 
movlw 0x07                    ; opreste comparatori
movwf CMCON
movlw 249             ; 5kHz la clock de 20MHz
BANKSEL PR2
movwf PR2             ; setare perioada semnal PWM
BANKSEL TMR2
clrf TMR2              ; goleste TMR2 (timer  2)
movlw 0               ; 0 - 255
BANKSEL CCPR1L
movwf CCPR1L       ; setare duty cycle la 0
movlw 0x3C       
BANKSEL CCP1CON         ; PWM cu LSB PWM = 1
movwf CCP1CON   
movlw 0x05          ; TMR2 activ cu prescale 4
BANKSEL T2CON
movwf T2CON         ;set prescaler/postscaler and enable timer2

 

Controlul intensitati este facut cu ajutorul modului PWM al microcontrollerului. Intensitatea vizuala a becului este controlata cu ajutorul unui semnal de impulsuri . Cu cat factorul de umplere este mai mare cu atat intensitatea vizuala este mai mare si invers.



Results

Download

https://rapidshare.com/files/2984919254/control_iluminare.rar

 

Arhiva cu schema hardware + cod microcontroller + tot proiectul OpenWatcom.

Arhiva va contine 2 directoare (1 singur pentru proiecte doar software)

Hardware design - schema uC + codul folosit pentru a genera fisierul .HEX

Software design - template-ul Open Watcom folosit

Status

13 Aprilie - cumparat componente

15 Aprilie - am inceput sa lipim componentele  dupa schema data

20 Aprilie - finalizare placuta in faza initiala

26 Aprilie - prezentare placuta la laborator

12 Mai - terminarea schemei cu modificarile specificate la laborator

18 Mai - program EV/Z3

 

Contributi personale

Ghinea Marius:

- achizitionare echipament hardware (componente, letcon, multimetru etc.)

- lipire componente pe placa de test

- dezvoltare schema hardware

 

Linte Ioan-Cristian:

- ajutat la lipire componente pe placa de test

- dezvoltare software pentru microcontroller si placa EZ/V3