0% au considerat acest document util (0 voturi)
70 vizualizări31 pagini

Micro Proiect

Documentul descrie un proiect care include o retea de senzori controlata de microcontrolere. Proiectul contine senzori de temperatura, lumina si tensiune. De asemenea, documentul prezinta caracteristicile microcontrolerului ATmega16 si modul de functionare al senzorilor.
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd
0% au considerat acest document util (0 voturi)
70 vizualizări31 pagini

Micro Proiect

Documentul descrie un proiect care include o retea de senzori controlata de microcontrolere. Proiectul contine senzori de temperatura, lumina si tensiune. De asemenea, documentul prezinta caracteristicile microcontrolerului ATmega16 si modul de functionare al senzorilor.
Drepturi de autor
© All Rights Reserved
Respectăm cu strictețe drepturile privind conținutul. Dacă suspectați că acesta este conținutul dumneavoastră, reclamați-l aici.
Formate disponibile
Descărcați ca DOCX, PDF, TXT sau citiți online pe Scribd

UNIVERSITATEA POLITEHNICA BUCURESTI

MICROCONTROLERE

-proiectRetea distribuita de senzori controlati de microcontrolere

Indrumator : [Link] NICULESCU

Student: Nicolau Flavius-Alin

Grupa: 8312
Facultatea:Transporturi

Cuprins
[Link] Proiectului
[Link] Hardware
2.1.1 Prezentare generala a modulelor
2.1.2 Selectarea si calculul valorilor
componentelor
2.2 Schema electrica si lista de
componente
3. Proiectare Software
3.1 Schema logica si descrierea modului
de functionare
3.2 Protocolul de comunicatie
3.3 Listing Program

[Link] Proiectului
In acest proiect ne-am propus sa realizam o aplicatie in userspace care comunica prin
interfata seriala USART cu o alta platforma. Platforma auxiliara este vazuta ca un
blackbox, stiindu-se doar setarile necesare pentru interfata si formatul datelor de
intrare/iesire. Proiectul nostru contine o serie de senzori: de temperatura, lumina si de
tensiune .

[Link] Hardware

Microcontrolerul ATmega16
ATmega 16 este un microcontroler CMOS de 8 bii de mic putere bazat pe arhitectura
RISC AVR mbuntit. Dispune de un set de 131 de instruciuni i 32 de regitri de uz
general. Cele 32 de registre sunt direct adresabile de Unitatea Logic i Aritmetic
(ALU), permind accesarea a dou registre independente ntr-o singur instruciune. Se
obine, astfel, o eficien sporit n execuie (de pn la zece ori mai rapide dect
microcontrorelerele convenionale CISC).
ATmega16 este un microcontroler RISC pe 8 bii realizat de firma Atmel.

Caracteristicile principale ale acestuia sunt:


- 16KB de memorie Flash reinscriptibil pentru stocarea programelor ;
- 1KB de memorie RAM ;
- 512B de memorie EEPROM ;
- dou numrtoare/temporizatoare de 8 bii ;
- un numrtor/temporizator de 16 bii ;
- conine un convertor analog digital de 10 bii, cu intrri multiple ;
- conine un comparator analogic ;
- conine un modul USART pentru comunicaie serial (port serial) ;
- dispune de un cronometru cu oscilator intern ;
- ofer 32 de linii I/O organizate n patru porturi (PA, PB, PC, PD).
Structura intern general a controlerului este prezentat n Figura 1. Se poate observa
c exist o magistral general de date la care sunt conectate mai multe module:
- unitatea aritmetic i logic (ALU) ;
- registrele generale ;
- memoria RAM i memoria EEPROM ;
- liniile de intrare (porturile I/O Lines) i celelalte blocuri de intrare/iesire. Aceste
ultime module sunt controlate de un set special de registre, fiecare modul avnd asociat
un numr de registre specifice.
Memoria Flash de program mpreun cu ntreg blocul de extragere a instruciunilor,
decodare i execuie comunic printr-o magistral proprie, separat de magistrala de
date menionat mai sus. Acest tip de organizare este conform principiilor unei
arhitecturi Harvad i permite controlerului s execute instruciunile foarte rapid.
Modul Power-Down salveaz coninutul registrelor, dar blocheaz Oscilatorul,
dezactivnd toate celelalte funcii al chip-ului pn la urmatoarea ntrerupere extern
sau Reset Hardware. n modul Power-Save, timer-ul asincron continu s mearg,
permind user-ului s menin o baz de timp n timp ce restul dispozitivului este oprit.
n modul Stand-by, Oscilatorul funcioneaz n timp ce restul despozitivului este oprit.
Acest lucru permite un start foarte rapid combinat cu un consum redus de energie. n
modul Stand-by extins (Extended Stanby Mode), att Oscilatorul principal, ct i timer-ul
asincron continu s funcioneze.

Memoria Flash (On-chip) permite s fie reprogaramat printr-o interfa serial SPI,
de ctre un programator de memorie nonvolatil convenional, sau de ctre un program
de boot On-chip ce ruleaz pe baza AVR. Programul de boot poate folosi orice interfa
pentru a ncrca programul de aplicaie n memoria Flash .
Combinnd un CPU RISC de 8 bii cu un Flash In-system auto programabil pe un chip
monolitic, ATmega 16 este un microcontroler puternic ce ofer o soluie extrem de
flexibil i cu un cost redus n comparaie cu multe altele de pe pia.
ATmega 16 AVR este susinut de o serie complet de instrumente de program i de
dezvoltare a sistemului, care include: compilatoare C, macroasambloare, programe
debug/ simulare etc.

Descrierea pinilor

VCC Sursa de current


GND Masa
Port A (PA7 .. PA0)
Port-ul A servete drept port de intrri analogice pentru Convertorul A/D.
Port-ul A servete, de asemenea, i ca un port bidirecional I/O de 8 bii, n cazul n care
Convertorul A/D nu este folosit. Pinii de port pot fi conectai opional la VCC prin

rezistori interni, (selectai pentru fiecare bit). Buffer-ele de ieire ale Portului A au
caracteristici de amplificare .
Port B (PB7.. PB0)
Portul B este un port I/O de 8 bii bidirecional cu rezistori interni (opionali).
Buffer-ele de ieire ale Port-ului B au caracteristici de amplificare.
Port-ul B ndeplinete, de asemenea, funcii speciale ale microcontrolerului ATmega 16.

Port C (PC7PC0)
Portul C este un port I/O de 8 bii bidirecional cu rezistori interni (opionali).
Buffer-ele de ieire ale Port-ului C au caracteristici de amplificare.
Dac interfaa JTAG (de depanare) este activat, rezistorii pinilor PC5 (TDI), PC3 (TMS)
i PC2 (TCK) vor fi activai, chiar dac are loc o resetare.
Port-ul C ndeplinete, de asemenea, funcii ale interfeei JTAG i alte funcii speciale ale
ATmega 16.

Port D (PD7PD0)
Portul D este un port I/O de 8 bii bidirecional cu rezistori interni conectai opional la
VCC (selectai pentru fiecare bit). Buffer-ele de output ale Port-ului D au caracteristici de
amplificare. Port-ul D ndeplinete, de asemenea, funcii speciale ale ATmega 16.
Reset
Un nivel sczut la acest pin mai mare ca durat dect o valoare prestabilit, va genera o
iniializare.
XTAL 1: Intrare pentru amplificatorul inversor al Oscilatorului ;
XTAL 2: Ieire pentru amplificatorul inversor al Oscilatorului.
AVCC: AVCC este pin de alimentare pentru Port-ul A i Convertorului A/D. Trebuie
conectat extern la Vcc, chiar dac ADC nu este folosit. Dac ADC este folosit , ar trebui
conectat la Vcc printr-un filtru trece-jos.
AREF: AREF este pinul de referin analogic pentru Convertorul A/D.

Structura intern :

2.1.1 Prezentare generala a modulelor


Senzorul de temperatura LM335
Este folosit LM335 care este un sensor de temperatura ce poate fi calibrat cu usurinta.
Acest senzor functioneaza intre temperaturile -40C si 100C pastrandu-si liniaritatea si impedanta
scazuta. Functionand ca o dioda Zener cu doua terminale avand tensiunea de strapungere direct
proportionala cu temperatura absoluta, panta fiind de 10mV/K. Impedana sczut i caracteristica
de ieire liniar fac interconectarea cu circuitele de control foarte usor de realizat. Instrumentul este
disponibil ncapsulat ermetic in tranzistorul TO-46. Circuitul are o impedanta dinamica mai mica de
1 si functioneaza intre 0.45mA si 5mA fara degradari ale perfomantelor. Calibrat la 25C LM335 are
o eroare mai mica de 1C la o variatie a temperaturii de 100C (tipic 0.5C). Spre deosebire de alti
senzori de temperature LM335 are o iesire liniara in tensiune care variaza in functie de tempeatura
cu 10mV/K.
Rezistenta este folosita pentru calibrarea la 25C trebuind sa asigure la iesiere tensiunea de
2.982V pentru aceasta temperatura.
Tensiune de iesire la +100C: 3.732V
Tensiune de iesire la -40C: 2.332V
LM335 da o tensiune mai mare cu cat temperatura creste.
Prin calibrarea iesirii la o temperatura, iesirea va fi corecta pe tot domeniul de [Link]
asigurarea preciziei si sensibilitatii trebuie evitat incalzirea proprie cauzata de curentul prin senzor.
Pentru aceasta rezistenta se dimensioneaza astfel incat senzorul sa lucreze la un curent cat mai
[Link] mediul ambiant are o rezistenta termica constanta, eroarea data de incalzirea proprie se
poate compensa.

Senzorul de lumina
Cu ajutorul fotorezistorului masuram intensitatea luminoasa si afisam valoarea numerica (lx)
pe un display
Fotorezistena este un rezistor realizat dintr-un material semiconductor, a carei rezistena
depinde
de valoarea intensitatii fluxului luminos. Constructiv este realizata dintr-o placuta de material
semiconductor omogen, prevazuta cu capete cu contacte ohmice. o mArime importantA ce
defineste
fotorezistena este rezistena de ntuneric, ca fiind rezistena la echilibru termic:
Conductanta fotorezistentei este direct proportionala cu
intensitatea fluxului luminos incident. Alte marimi ce definesc funcionarea fotorezistentei

sunt:
-pragul fotoelectric, adica lungimea de unda maxima pna la care efectul fotoelectric mai este
prezent
-inertia fotorezistentei, exprimata prin timpul necesar stabilirii valorilor stationare ale
concentratiilor
purtatorilor mobili.

Senzorul de tensiune
Pentru realizarea voltmetrului vom folosi convertorul analogic-digital al
microprocesorului. Pentru ca acest convertor sa functioneze, trebuie folosita tensiunea
de referinta. Aceasta reprezinta o valoare maxima care poate fi masurata de
microcontroler. Am ales drept referinta valoarea de 2,56 volti, intrucat este mai stabila
decat tensiunea de 5 volti de la [Link] acestei tensiuni usureaza
reprezentarea valorilor ca numere binare in microcontroler, deoarece 2.56 reprezinta
puterea lui 2.
Convertorul analog-digital oferit de Atmega16 are urmatoarele caracteristici:
- rezolutie de 10 biti
- precizie de 2 LSB
- timp de conversie intre 13-260s
- 8 canale de intrare multiplexate
- posibilitatea de ajustare stanga a rezultatului din registrul ADC
- excursia de tensiune 0-VCC
- moduri "Free-Running" sau conversie unica
- intrerupere la terminarea unei conversii
n cazul convertorului A/D de 10 biti, rezolutia trebuie sa fie de Vref/2n =2,5 mV /bit.
Apoi fiecare semnal prezent la intrare va fi exprimat ca o fractie din tensiunea de
[Link] primeste pe intrarea ADC1 o tensiune Vin(0..2,56V) si este alimentat la
tensiunea de 5V data de pinul cu AVcc.
Conversia ADC-ului este [Link] rezolutia este setata la 10 biti ,atunci vom avea
1024 de [Link] un moment dat valoarea amplitudinii este preluata si transmisa la
intrarea ADC, unde valoare convertita este stocata in registrii ADCH si [Link]
urmatorul ciclu de ceas alta valoare este convertita.
Tensiunea de intrare este calculata cu formula:

Vin[V]=(ADCVref[V])/1024
Tensiunea este afisata pe display.

2.1.2 Selectarea si calculul valorilor


componentelor

NR.

Componente

Bucati

Pret

Subtotal/RON

1.

ATmega 16-16 PU

18

72

2.

LCD alfanumeric

35

35

3.

Senzor de temp LM335

4.

Fotorezistenta

5.

Rezist 10kohm

0.1

0.1

6.

Tranz BC 178

7.

Rezist 15Kohm

0.1

0.1

8.

Soclu 40 pini

9.

Rezist 10kohm

0.2

0.2

10.

Placa test

24

Headere (mama)

24

10

12.

Headere (tata)

40

18

13.

Cablu

1.5

11.

TOTAL

180.4

2.2 Schema electrica si lista de componente

[Link] comanda
Lista componente:
- 1 LCD Display Dem 16216 SGH/V216
- 1 ATMEGA16
- 2 HDR1x4

-proiectare ultibord 11.0-

2. Senzor Temperatura
Lista componente:
- 1 ATMEGA16
- 3 HDR1x4
- 1 LM335
- 1 R0207 R10 10 k

-proiectare ultibord 11.0-

[Link] lumina
Lista componente:
- 1 ATMEGA16
- 3 HDR1x4
- 1 TO 18
- 1 R0207 R10 10 k
- 1 R0207 R10 15 k

-proiectare ultibord 11.0-

4. Senzor tensiune
Lista componente:
- 1 ATMEGA16
- 3 HDR1x4
- 2 R0207 R10 10 k

-proiectare ultibord 11.0-

3. Proiectare Software

3.1 Schema logica si descrierea modului de


functionare

Senzorul de tensiune
.include "[Link]"
.equ rs=PD4
.equ e=PD6
.equ ctrl=PORTD
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp gata_conversia

jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
jmp reset
reset:
ldi r16,high(RAMEND)
out SPH,r16
ldi r16,low(RAMEND)
out SPL,r16
ldi r16,0b11110000
out DDRA,r16 ; pinii PA7...PA4 sunt iesiri
ldi r16,0b01010000
out DDRD,r16 ; pinii PD4 si PD6 sunt iesiri
cbi ctrl,e
cbi ctrl,rs
main:
cli
ldi r16,0b00000000 ;setare ADC: AREF este referinta, canal ADC0
out ADMUX,r16 ;rezultatul se aliniaza la dreapta
ldi r16,0b00101110 ;activare intrer., setare ceas ca fosc/64
out ADCSRA,r16 ;deocamdata nu s-a initiat conversia si nu s-a pornit modulul
in r16, SFIOR
andi r16,0b00011111 ;setarea modului de funct. pe semnal timer 16b prag B
ori r16,0b10100000 ; fara a modifica alti biti
out SFIOR, r16

ldi r16,0b00000000 ;setare timer 16 biti: nu se utiliz. OC1A si OC1B, oprit deocamdata
out TCCR1A,r16 ;modul va fi CTC
ldi r16,0b00001000
out TCCR1B,r16
in r16, TIMSK
andi r16,0b11000011 ;nu se utiliz. nici o intrer., fara a modifica alti biti din TIMSK
out TIMSK, r16
ldi r16, 0x3D ;se incarca valoarea de prag A: 0x3D0A=15626
out OCR1AH,r16 ;15626 * 1/(8MHz/1024) =~ 2s
ldi r16, 0x0A
out OCR1AL,r16
ldi r16, 0x3D ;se incarca valoarea de prag B: 0x3D09=15625
out OCR1BH,r16 ;15625 * 1/(8MHz/1024) =~ 2s
ldi r16, 0x09
out OCR1BL,r16 14

ldi r16,0b00001000 ;setare timer0: nu se utiliz. pin OC0, timerul este oprit deocamdata
out TCCR0,r16 ; modul va fi CTC cu prag dat de OCR0
in r16, TIMSK
andi r16,0b11111100 ;nu se utiliz. nici o intrer., fara a modifica alti biti din TIMSK
out TIMSK, r16
call init_display
ldi r17,0b10000000
call set_ram ;prin r17 se seteaza adresa 0x00 pentru RAM de afisare
ldi r17,'T'
call put_char
ldi r17,'e'

call put_char
ldi r17,'n'
call put_char
ldi r17,'s'
call put_char
ldi r17,'i'
call put_char
ldi r17,'u'
call put_char
ldi r17,'n'
call put_char
ldi r17,'e'
call put_char
ldi r17,'a'
call put_char
ldi r17,' '
call put_char
ldi r17,'e'
call put_char
ldi r17,'s'
call put_char
ldi r17,'t'
call put_char
ldi r17,'e'
call put_char
ldi r17,':'
call put_char

ldi r17,0b11000000 ;prin r17 se seteaza adresa 0x40 pentru RAM de afisare
call set_ram
ldi r17,'0'
call put_char
ldi r17,'b'
call put_char
ldi r17,0b11001100 ;prin r17 se seteaza adresa 0x4C pentru RAM de afisare
call set_ram
ldi r17,'x'
call put_char
ldi r17,'4'
call put_char
ldi r17,'m'
call put_char
ldi r17,'V'
call put_char
sei
sbi ADCSRA,ADEN ;se porneste ADC
in r16,TCCR1B
andi r16,0b11111101 ;se porneste timerul 16b care va numara la 1024 imp. de ceas
ori r16,0b00000101
out TCCR1B,r16
bucla:
rjmp bucla
gata_conversia:
in r20,SREG 15
in r21,ADCL ;se citeste rezultatul conversiei

in r22,ADCH
in r16,TIFR
ori r16,0b00001000 ;se reseteaza flagul timerului 16biti
out TIFR,r16
ldi r17,0b11000010 ;prin r17 se seteaza adresa 0x42 pentru RAM de afisare
call set_ram
ldi r17,'0'
sbrc r22,1 ;se trimite bitul 9 al conversiei
ldi r17,'1'
call put_char
ldi r17,'0'
sbrc r22,0 ;se trimite bitul 8 al conversiei
ldi r17,'1'
call put_char
ldi r18,0x09
bucla1:
ldi r17,'0'
dec r18
breq end
rol r21
brcc PC+2
ldi r17,'1'
call put_char
rjmp bucla1
end:
out SREG,r20
reti

init_display:
cbi ctrl,rs
ldi r16,0b00100000
out PORTA,r16
sbi ctrl,e
call wait_48us
cbi ctrl,e
ldi r16,0b00100000
out PORTA,r16
sbi ctrl,e
call wait_48us
cbi ctrl,e
ldi r16,0b10000000
out PORTA,r16
sbi ctrl,e
call wait_48us
cbi ctrl,e
call wait_30ms
ldi r16,0b00000000
out PORTA,r16
sbi ctrl,e
call wait_48us
cbi ctrl,e
ldi r16,0b11000000
out PORTA,r16
sbi ctrl,e
call wait_48us

cbi ctrl,e
call wait_30ms
ldi r16,0b00000000
out PORTA,r16
sbi ctrl,e
call wait_48us
cbi ctrl,e 16
ldi r16,0b00010000
out PORTA,r16
sbi ctrl,e
call wait_48us
cbi ctrl,e
call wait_30ms
ldi r16,0b00000000
out PORTA,r16
sbi ctrl,e
call wait_48us
cbi ctrl,e
ldi r16,0b00100000
out PORTA,r16
sbi ctrl,e
call wait_48us
cbi ctrl,e
call wait_30ms
ret
set_ram:
cbi ctrl,rs

mov r16,r17
andi r16,0xF0
out PORTA,r16
sbi ctrl,e
nop
nop
cbi ctrl,e
mov r16,r17
andi r16,0x0F
swap r16
out PORTA,r16
sbi ctrl,e
nop
nop
cbi ctrl,e
call wait_48us
ret
put_char:
sbi ctrl,rs
mov r16,r17
andi r16,0xF0
out PORTA,r16
sbi ctrl,e
nop
nop
cbi ctrl,e
mov r16,r17

andi r16,0x0F
swap r16
out PORTA,r16
sbi ctrl,e
nop
nop
cbi ctrl,e
call wait_48us
ret
wait_48us:
ldi r16,0x00
out TCNT0,r16
ldi r16, 0x06 ;se incarca valoarea de prag: 0x06=6
out OCR0,r16 ;6 * 1/(8MHz/64) =48us
in r16,TCCR0
andi r16,0b11111000 ;se porneste timerul si este setat sa numere
ori r16,0b00000011 ;la fiecare 64 perioade de ceas, fara a modifica alti biti
out TCCR0,r16
wait: 17
in r16,TIFR
sbrs r16,OCF0 ;se asteapta atingerea pragului OCR0
rjmp wait
in r16,TIFR
ori r16,0b00000010
out TIFR,r16 ;se reseteaza flagul
in r16,TCCR0
andi r16,0b11111000 ;se opreste timerul

out TCCR0,r16
ret
wait_30ms:
ldi r16,0x00
out TCNT0,r16
ldi r16, 0xF0 ;se incarca valoarea de prag: 0xF0=240
out OCR0,r16 ;240 * 1/(8MHz/1024) =~ 30ms
in r16,TCCR0
andi r16,0b11111000 ;se porneste timerul si este setat sa numere
ori r16,0b00000101 ;la fiecare 1024 perioade de ceas, fara a modifica alti biti
out TCCR0,r16
wait1:
in r16,TIFR
sbrs r16,OCF0 ;se asteapta atingerea pragului OCR0
rjmp wait1
in r16,TIFR
ori r16,0b00000010
out TIFR,r16 ;se reseteaza flagul
in r16,TCCR0
andi r16,0b11111000 ;se opreste timerul
out TCCR0,r16
ret

Senzor de temperatura
#define F_CPU 4000000UL
#include <avr/delay.h>
#include <avr/io.h>
#include <string.h>
#include <avr/interrupt.h>
/*Global Variables Declarations*/
/*LCD function declarations */
void LCD_send_command(unsigned char cmnd);
void LCD_send_data(unsigned char data);
void LCD_init();
void LCD_goto(unsigned char y, unsigned char x);
void LCD_print(char *string);
/*ADC Conversion Complete Interrupt Service Routine (ISR)*/
ISR(ADC_vect);
#define LCD_DATA_PORT
#define LCD_DATA_DDR
#define LCD_DATA_PIN

PORTB
DDRB
PINB

#define LCD_CNTRL_PORT PORTC


#define LCD_CNTRL_DDR DDRC
#define LCD_CNTRL_PIN PINC
#define
#define
#define
#define
#define

LCD_RS_PIN
LCD_RW_PIN
LCD_ENABLE_PIN 7
SET_HOUR
SET_MINUTE

5
6
3
4

int main(void)
{
unsigned char i;
LCD_init();
LCD_goto(1,2);
LCD_print("Temperature is");
LCD_CNTRL_PORT = (1<<SET_HOUR | 1<<SET_MINUTE);
DDRA = 0x00;

// Configure PortA as input

ADCSRA = 0x8F;

// Enable the ADC and its interrupt

feature
// and set the ACD clock pre-scalar
to clk/128
ADMUX = 0xE0;
left justify

//

Select

internal

2.56V

as

Vref,

// data registers and select ADC0 as


input channel
sei();
ADCSRA |= 1<<ADSC;
while(1);

// Enable Global Interrupts


// Start Conversion

}
/* This function sends a command 'cmnd' to the LCD module*/
void LCD_send_command(unsigned char cmnd)
{
LCD_DATA_PORT = cmnd;
LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN);
LCD_CNTRL_PORT &= ~(1<<LCD_RS_PIN);
LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
_delay_us(2);
LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
_delay_us(100);
}
/* This function sends the data 'data' to the LCD module*/
void LCD_send_data(unsigned char data)
{
LCD_DATA_PORT = data;
LCD_CNTRL_PORT &= ~(1<<LCD_RW_PIN);
LCD_CNTRL_PORT |= (1<<LCD_RS_PIN);
LCD_CNTRL_PORT |= (1<<LCD_ENABLE_PIN);
_delay_us(2);
LCD_CNTRL_PORT &= ~(1<<LCD_ENABLE_PIN);
_delay_us(100);
}
void LCD_init()
{
LCD_CNTRL_DDR = 0xFF;
LCD_CNTRL_PORT = 0x00;
LCD_DATA_DDR = 0xFF;
LCD_DATA_PORT = 0x00;
_delay_ms(10);
LCD_send_command(0x38);
LCD_send_command(0x0C);
LCD_send_command(0x01);
_delay_ms(10);
LCD_send_command(0x06);
}
/* This function moves the cursor the line y column x on the LCD module*/
void LCD_goto(unsigned char y, unsigned char x)
{
unsigned char firstAddress[] = {0x80,0xC0,0x94,0xD4};
LCD_send_command(firstAddress[y-1] + x-1);
_delay_ms(10);
}
void LCD_print(char *string)
{
unsigned char i=0;
while(string[i]!=0)
{
LCD_send_data(string[i]);
i++;
}

}
/*ADC Conversion Complete Interrupt Service Routine (ISR)*/
ISR(ADC_vect)
{
char tempC, tempF, display;
float tempff;
tempC = ADCH;
tempff = (float)tempC;
tempff = (tempff*9)/5 + 32;
tempF = tempff;
LCD_goto(2,4);
itoa(tempC/10,display,10);
LCD_print(display);
itoa(tempC%10,display,10);
LCD_print(display);
LCD_send_data(0xDF);
LCD_print("C
");
itoa(tempF/10,display,10);
LCD_print(display);
itoa(tempF%10,display,10);
LCD_print(display);
LCD_send_data(0xDF);
LCD_print("F");
_delay_ms(500);
ADCSRA |= 1<<ADSC;

// Output ADCH to PortD

// Start Conversion

Senzor de lumina listing program


#include <avr/delay.h>
#include <avr/io.h>
#include <string.h>
#include <avr/interrupt.h>
static voidsetup();
unsignedintfilter_adc();
voidmain()
{
unsignedintdisp_avg[4];
unsignedintavg=0;
unsignedlonglux_value=0;
setup();

do
{
avg=filter_adc();
if(avg>=0 &&avg<=286)
{lux_value=0;}
elseif(avg>286 &&avg<410)
{lux_value=1600;}
elseif(avg>=410 &&avg<470)
{lux_value=3200;}
elseif(avg>=470 &&avg<500)
{lux_value=4800;}
elseif(avg>=500 &&avg<510)
{lux_value=6400;}
elseif(avg>=510 &&avg<520)
{lux_value=8000;}
elseif(avg>=520 &&avg<530)
{lux_value=9600;}
elseif(avg>=530 &&avg<535)
{lux_value=11200;}
elseif(avg>=535 &&avg<540)
{lux_value=12800;}
elseif(avg>=540 &&avg<545)
{lux_value=14400;}
elseif(avg>=545 &&avg<550)
lux_value=16000;}
else
{Lcd_Out(2,6,"Max Limit! ");}

LongToStr(lux_value,disp_avg);
Lcd_Out(2,6,disp_avg);
}

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