Sunteți pe pagina 1din 14

Facultatea de Electrotehnica si Electroenergetica

CapV. Programarea microcontrolerului

V.1 Programul in C al microcontrolerului PIC16f876

In programul care predefineste variabilele putem introduce toate variabilele folosite


apoi in codul sursa. Este simplu de utilizat, deoarece nu trebuie sa cautam in tot
programul sursa variabila care trebuie modificata, putand sa ii schimbam valoarea. In
acest program de predefinire a variabilelor sunt definite si librariile folosite de codul
sursa, fiind enumerate si starile senzorului de lumina. Acesta este de fapt definirea
librariei de variabile apoi folosite in codul sursa.

Codul sursa este programul principal scris in limbajul de programare C++ si care
este baza proiectului nostru in CodeVisionAVR.

Algoritmul cu care a fost conceput acest program este prezentat in figura


urmatoare. Acest algoritm este prezentat mai concentrat decat cel descris anterior.

Descrierea codului sursa

In codul sursa, pinii de intrare semnalelor senzorilor sunt situati pe Portul C si


Portul D dupa cum urmeaza:

- PC0 – semnal daca panoul trebuie sa se miste spre E


- PC1 – semnal daca panoul trebuie sa se miste spre V
- PC2 – semnal daca panoul trebuie sa se miste spre N
- PC3 – semnal daca panoul trebuie sa se miste spre S
- PD0 – semnal daca afara este noapte/crepuscul
- PD1 – semnal daca afara este zi cu nori
- PD2 – semnal daca diferenta de temepratura intre panou si lichidul din boiler
este mai mare de 100C
- PD3 – semnal daca diferenta de temepratura intre panou si lichidul din boiler
este mai mare de 200C

77
Facultatea de Electrotehnica si Electroenergetica

- PD4 – semnal de protectie

Pinii de iesire sunt situati pe Portul B dupa cum urmeaza:

- PB0 – semnal de miscare pe directia E-V


- PB1 – semnal de directionare E-V
- PB2 – semnal de miscare pe directia N-S
- PB3 – semnal de directionare N-S
- PB4 – semnal de pornire a primei pompe
- PB5 – semnal de pornire a celei de-a doua pompe

In prima parte a programului se verifica daca exista semnal de protectie, pentru a


misca panoul la punctul de Nord maxim.

Urmatoarea etapa este verificarea diferentei de temperatura intre panou si lichidul


din boiler, pentru a porni prima pompa sau a ambelor pompe.

A treia etapa este verificarea starii de afara, unde apar trei stari:

1) starea in care afara este zi insorita – aici se verifica starea soarelui pe bolta
cereasca si se misca panoul dupa Soare

2) starea in care afara este zi cu nori – aici panoul se pozitioneaza dupa o traiectorie
definita care misca panoul doar spre Vest, cu o perioada de 22min, cate un grad.

3) starea in care afara este noapte/crepuscul – aici panoul este pozitionat in punctul
de Est maxim, de unde va porni a doua zi de dimineata

Cazul final este conceput pentru protectia placii si a microprocesorului in cazul in


care apar avarii pe intreg sistemul panoului solar.

Pentru programarea microcontrolerului am generat un proiect (programul in C)


care cuprinde doua parti:

78
Facultatea de Electrotehnica si Electroenergetica

Figura – Algoritmul programului

79
Facultatea de Electrotehnica si Electroenergetica

programul in care predefinim variabilele folosite in proiect:

#define prj_h
#ifdef prj_h

#define INPUT_SET 1
#define INPUT_RESET 0
#define OUTPUT_SET 1
#define OUTPUT_RESET 0
#define const_15_min 215
#define const_30_min 430
#define const_22_min 313
#define const_10_sec 613

// stare senzor lumina


enum
{
e_Zi = 0,
e_Noapte,
e_Nori
};

#endif

- codul sursa (programul sursa) al proiectului:

#include <pic16f.h>
#include <cristian.h>

// Declare your global variables here


unsigned int Tim0_cnt=0;
unsigned int Tim1_cnt=0;

unsigned char E_Max_flag=0;


unsigned char N_Max_flag=0;
unsigned char E1_flag=0;
unsigned char E2_flag=0;

interrupt [TIM0_OVF] void timer0_ovf_isr(void)


{
// Place your code here
Tim0_cnt++;
}

interrupt [TIM1_OVF] void timer1_ovf_isr(void)


{
// Place your code here
Tim1_cnt++;
}

void main(void)

80
Facultatea de Electrotehnica si Electroenergetica

{
// Declare your local variables here

unsigned char Senz_lum = 0;

// Input/Output Ports initialization


// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=Out Func2=Out Func1=Out Func0=Out
// State7=T State6=T State5=T State4=T State3=0 State2=0 State1=0 State0=0
PORTB=0x00;
DDRB=0x3F;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: 15.625 kHz
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped

81
Facultatea de Electrotehnica si Electroenergetica

// Mode: Normal top=FFh


// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization


// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization


TIMSK=0x05;

// Analog Comparator initialization


// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Global enable interrupts


#asm("sei")

while (1)
{
// Place your code here
Senz_lum = PORTD.1<<1 + PORTD.0;

//Verificare semnal protectie


if (PORTD.4 == INPUT_SET)
{
////////////////////////// Verificare semnal protectie //////////////////////////
//Miscare N Maxim
if(N_Max_flag == 0)
{
PORTB.2 = OUTPUT_SET;
PORTB.3 = OUTPUT_SET;
TCCR1B=0x05;
N_Max_flag = 1;
}
else
{
if(Tim1_cnt >= const_15_min)
{
PORTB.2 = OUTPUT_RESET;
PORTB.3 = OUTPUT_RESET;
TCCR1B=0x00;
}
};
////////////////////////////////////////////////////////////////////////////////
}
else
{
if(N_Max_flag == 1)
{

82
Facultatea de Electrotehnica si Electroenergetica

PORTB.2 = OUTPUT_RESET;
PORTB.3 = OUTPUT_RESET;
TCCR1B=0x00;
N_Max_flag = 0;
}

/////////////////////// Verificare diferenta temperatura ///////////////////////


//Verificare semnal diferenta temperatura 10 grade
if (PORTD.2 == INPUT_SET)
{
//Porneste pompa 1
PORTB.4 = OUTPUT_SET;
}
else
{
//Opreste pompa 1
PORTB.4 = OUTPUT_RESET;
};

//Verificare semnal diferenta temperatura 20 grade


if (PORTD.3 == INPUT_SET)
{
//Porneste pompa 1
PORTB.5 = OUTPUT_SET;
}
else
{
//Opreste pompa 1
PORTB.5 = OUTPUT_RESET;
};
////////////////////////////////////////////////////////////////////////////////

///////////////////////// Implementare masina de stare /////////////////////////


switch (Senz_lum)
{
//Comportament pe timp de zi
case e_Zi:

if(E1_flag == 1)
{
TCCR1B=0x00;
TCCR0=0x00;
E1_flag = 0;
E2_flag = 0;
}

if(E_Max_flag == 1)
{
E_Max_flag = 0;
TCCR1B=0x00;
}

// Monitorizare port intrare C


switch (PORTC&0x03)
{
case 0x02:

83
Facultatea de Electrotehnica si Electroenergetica

//Miscare E
PORTB.0 = OUTPUT_SET;
PORTB.1 = OUTPUT_SET;
break;
case 0x01:
//Miscare W
PORTB.0 = OUTPUT_SET;
PORTB.1 = OUTPUT_RESET;
break;
default:
//Stationare
PORTB.0 = OUTPUT_RESET;
PORTB.1 = OUTPUT_RESET;
break;
};

switch (PORTC&0x0C)
{
case 0x02:
//Miscare N
PORTB.2 = OUTPUT_SET;
PORTB.3 = OUTPUT_SET;
break;
case 0x01:
//Miscare S
PORTB.2 = OUTPUT_SET;
PORTB.3 = OUTPUT_RESET;
break;
default:
//Stationare
PORTB.2 = OUTPUT_RESET;
PORTB.3 = OUTPUT_RESET;
break;
};

break;

//Comportament pe timp de noapte


case e_Noapte:

if(E1_flag == 1)
{
TCCR1B=0x00;
TCCR0=0x00;
E1_flag = 0;
E2_flag = 0;
}

// Miscare E maxim
if(E_Max_flag == 0)
{
PORTB.0 = OUTPUT_SET;
PORTB.1 = OUTPUT_SET;
TCCR1B=0x05;
E_Max_flag = 1;
}

84
Facultatea de Electrotehnica si Electroenergetica

else
{
if(Tim1_cnt >= const_30_min)
{
PORTB.0 = OUTPUT_RESET;
PORTB.1 = OUTPUT_RESET;
TCCR1B=0x00;
}
};

break;

//Comportament pe timp de nori


case e_Nori:

if(E_Max_flag == 1)
{
E_Max_flag = 0;
TCCR1B=0x00;
}

// Miscare dupa calcul traiectorie


if(E1_flag == 0)
{
TCCR1B=0x05;
E1_flag = 1;
}
else
{
if(Tim1_cnt >= const_22_min)
{
if(E2_flag == 0)
{
PORTB.0 = OUTPUT_SET;
PORTB.1 = OUTPUT_RESET;
TCCR0=0x05;
E2_flag = 1;

TCCR1B=0x00;
}
else
{
if(Tim0_cnt >= const_10_sec)
{
PORTB.0 = OUTPUT_RESET;
PORTB.1 = OUTPUT_RESET;
TCCR0=0x00;
E2_flag = 0;
E1_flag = 0;
}

}
}
};

break;

85
Facultatea de Electrotehnica si Electroenergetica

//Caz exclus
default:

PORTB.0 = OUTPUT_RESET;
PORTB.1 = OUTPUT_RESET;
PORTB.2 = OUTPUT_RESET;
PORTB.3 = OUTPUT_RESET;

break;
};
////////////////////////////////////////////////////////////////////////////////
};

};
}
Programul a fost utilizat strict pentru etapele de pozitionare E-V , N-S.Dorindu-se
simplificarea schemei de actionare s-a ales solutia motor-reductor,fapt ce determina o
viteza de pozitioarede 270 °/h (pentru pozitionarea de maxima deplasare E-V).Astfel s-a
eliminate modulul de electronicade putere (choper) si partea sa de control
Masina de current continuu ce actioneaza pozitionarea E-V se alimenteaza cu
tensiune construita.In acelasi timp,din probele practice s-a observat ca desi actuatorul
liniar rezolva problema de pozitionare N-S el este sensibil la socurile si vibratiile produse
de vant.Aria parabolei capteaza variatiile de viteza si directie ale vantului si o parte din
fortele generate de acestea ajung sa solicite axul actuatorului liniar .De asemenea ,mai
ales pentru directia E-V ,viteza de pozitionare (urmarire ),care este viteza relativ mica
este totusi prea mica pentru situatiile de aducere pe pozitie initiala a panoului .Tot
relative mica este aceasta viteza daca considera perioade mai mari de timp (ore),cand
cerul a fost innorat si cand trebuie o deplasare mai rapida pentru a avea o pozitie optima.

V.2.Placa de dezvoltare tip AVR

Placa de dezvoltare tip AVR are urmatoarele componente:

1- mufa de conectare la sursa de energie electrica ( 7-18 V, curent


continuu sau curent alternativ) – prin aceasta se face alimentarea cu
tensiune a tuturor componentelor placii;

86
Facultatea de Electrotehnica si Electroenergetica

2- conector tip DB9M RS232 (port serial tip „tata”) – are rol de
comunicare cu alta placa (receptare si transmitere de date)
3- conector tip DB9F RS232 (port serial tip „mama”) – prin care se
transfera programul destinat microprocesorului din calculator cu
ajutorul unui cablu tip serial 1:1
4- punte de diode tip W10M – are rol de redresare a curentului
5- stabilizator de tensiune tip 7805 (5V;1A) – cu rol de stabilizare a
tensiunii la valoarea de 5V
6- LED – are rol de a indica prezenta-absenta tensiunii de alimentare
pe placa
7- buton de resetare – are rol de resetare a intregului circuit al placii
(reinitializeaza programul de pe microprocesor)
8- interconector – are rolul de a conecta la butonul de resetare un
filtru de 100nF
9- interconector – are rolul de a conecta LED-ul de nulul de lucru al
placii
10- 4 LED-uri – au rol de a indica prezenta-absenta de tensiune pe
urmatorii pini de iesire: PB0, PB1, PB2 se respectiv PB3
11- conector de tip CAN (optional)
12- soclul pentru miniplaca de tip Mega8 SBC (suportul
microprocesorului ATMega8)
13- oscilator cu quartz tip HC49-S de 4000Mhz – are rol de
producere de semnale treapta la frecventa foarte mare (semnal de
„clock”)
14- interconector – are rol de a conecta oscilatorul cu quartz tip HC49-
S de 4000MHz la circuit
15- controler tip MAX232 – are rol de a ajuta comunicarea prin portul
serial tip DB9M a placii cu o alta placa (receptarea si transmiterea
de date)
16- soclu tip DIP de 8 pini – pentru memorie tip I2C (protocol de
comunicare)

87
Facultatea de Electrotehnica si Electroenergetica

17- interconectori – au rol de a face legatura intre SCK (A) - canalul


de temporizare (clock channel) - si soclurile microprocesoarelor si
intre MISO (B) – canal de primire a datelor (master in slave out) –
si aceleasi socluri
18- conector tip ISP – In-System Programming - programare direct in
sistem
19- receptor infrarosu tip RPM7138 de 37,9kHz– are rol de a recepta
date prin infrarosu si de a le transmite la microprocesor, la o
distanta de 15m
20- buton de impuls pentru pinul PD1 – are rol de a simula prezenta
de tensiune pe pinul PD1, in momentul activarii
21- buton de impuls pentru pinul PD2 – are rol de a simula prezenta
de tensiune pe pinul PD2, in momentul activarii
22- buton de impuls pentru pinul PD3 – are rol de a simula prezenta
de tensiune pe pinul PD3, in momentul activarii
23- rezistenta reglabila de 5KΩ - este conectata la convertorul analog-
digital si are rol de a regla tensiunea pe acesta
24- interconectori – au rol de a face legatura intre MOSI (A) - canal de
transmitere a datelor (master out slave in) - si soclurile
microprocesoarelor si intre ADC0 – converor analog digital (analog
digital converter) – si aceleasi socluri
25- pinuri de intare-iesire – au rol de a intercepta semnale si de a le
transmite la procesor si de a transmite de la procesor semnale in
exterior: PA7...PA0, PC7...PC0, PD0..PD7, PB0...PB7
26- interconectori – au rol de a conecta memoria de tip I2C la soclurile
microprocesoarelor
27- interconector – are rolul de a conecta la butonul de impuls pentru
PD1 un filtru de 100nF
28- interconector – are rolul de a conecta la butonul de impuls pentru
PD2 un filtru de 100nF

88
Facultatea de Electrotehnica si Electroenergetica

29- interconector – are rolul de a conecta la butonul de impuls pentru


PD3 un filtru de 100nF
30- soclu tip DIP de 20 pini – pentru microprocesoare tip AT90S1200
si tip AT90S2313
31- soclu tip DIP de 28 pini – pentru microprocesoare tip AT90S4433
si tip ATMega8
32- soclu tip DIP de 40 pini – pentru microprocesoare tip AT90S8535,
tip ATMega16 si tip ATMega32
33- oscilator cu quartz de 32768 kHz
34- soclu de conectare a afisajului digital

Figura III 4 – Amplasarea partilor componente pe placa de dezvoltare tip AVR

89
Facultatea de Electrotehnica si Electroenergetica

Figura III 5 – Placa de dezvoltare tip AVR

Aceasta placa are urmatoarele roluri:

- de a alimenta cu energie electrica microprocesorul


- de protectie a microprocesorului fata de sursa de alimentare cu energie electrica
- de implementare sau stergere a programului destinat microprocesorului
- de primire si transmitere catre procesor a semnalelor din exterior, precum si
transmiterea semnalelor de la acesta spre exterior

Toate placile din aceasta familie (megaAVR) sunt fabricate cu tehnologie la 0.35µ.
Ele avanseaza tehnologia revolutionara de memori care se programeaza singure si
capabilitatea de a citi pachetele de date in timpul scrierii lor, care sunt, in particular,
potrivite pentru aplicatii care necesita programarea prin infrarosu sau capabilitatea de a
reinnoi softul pe teren.

90

S-ar putea să vă placă și