Acest concept, al alarmării oamenilor dintr -un anumit loc, in caz de intr ări ale străinilor [602115]
Capitolul. 1. Generalități
Acest concept, al alarmării oamenilor dintr -un anumit loc, in caz de intr ări ale străinilor
poate sa fie urmărit pana la vremea in care câ inii avertizau oamenii cu privire la prezența
raufăcătorilor . Lătratul lor era semnalul care ii alerta pe oameni cum că ceva ar fi in neregulă.
Mai târzi u, oam eni i au f ol osi t cl opoței . Un ul di n pri m el e si stem e de al arm ă el ectri ce a f ost un
sistem simplu cu un fir subțire dintr -un material conductor (cupru) care alimenta un releu
conectat cu a jutorul acelui fir în automenținere. În momentul în care firul era rupt de un intrus
releul comuta in pozitia normal închis alimentând o sonerie carea avertiza proprietarul si punea
pe fuga intrusul. Un dezavantaj mare al acestui sistem era pe timp de iarn ă, când zăpada se
depunea pe acel fir, care unu îl facea vizibil și doi greutatea zăpezii chiar îl pute rupe. Acel fir
trebuia pus la un anumit nivel sa nu poată fi rupt de animalele care frecventează acea zonă.
Instalarea unui sistem de alarmă este cea m ai buna alegere in cazul in care se dorește protecția si
siguranț a anumi tor bunuri , a l ocuinței și familiei sau, de ce nu, a unei intregi com panii. Ținând
cont de nivelul de risc la efracție, sistemele de alarmă pot fi clasificate prin grade de securitate.
Prin urmare configurația optima a sistemului de alarmă contra efracțiilor este data de acest grad
de securitate si de clasa de mediu. Astăzi, sistemele de securitate au ajuns extrem de complexe.
Sistemele de alarmă sunt sisteme electronice de protecție care detectează fenomene
neobișnuite in locul unde sunt montate pe perioada in care sunt active. Aceste sisteme de alarmă
pot fi de o diversitate mare in funcție de senzorii folosiți, de modul de comunicare a sistemelor
cu senzorii, a interfeței de comunicar e a omului cu sistemul etc..
Sistemele de alarmă antiefracție sunt sisteme de protecție concepute pentru a proteja caile prin
care un infractor poate patrunde într -o cladire și sustrage obiecte de valoare. Scopul acestui
sistem este de a imbunatați s ecuritatea locurilor protejate.
Detecția poate fi facută cu diferiți senzori
– Senzori de miscare
– Senzori cu lumina IR
– Senzori magnetici
– Senzori cu ultrasunete
– Senzori de presiune
– Senzori de zgomot
1
1.1 Senzor PIR (senzor de mișcare)
Un senzor pasiv în infra roșu (senzor PIR) este un dispozitiv electronic care măsoară
radiația infraroșie (IR) provenită de la obiecte aflate în raza sa de acțiune. Inițial mișcarea este
detectată atunci când un corp cu o temperatură diferită fața de mediul înconjurător trece prin fața
sursei infraroșu cu o altă temperatură, cum ar fi un perete. Acest lucru duce la schimbarea stării
senzorului pe motivul că senzorul detectează căldura de la trecerea prin câmpul de acțiune al
senzorului și acel corp rupe câmpul pe care senzorul l -a determinat anterior ca fiind normal.
Orice obiect, chiar unul de aceeași temperatură ca și obiectele din jur va activa senzorul PIR dacă
corpul se deplasează în raza de acțiune a senzorului. Senzorul intern este alcătuit din două
ferestre îndreptate spre zona protejată, fiecare fereastră primește o radiație în infraroșu. În
momentul în care radiația de infraroșu se transferă de pe o lentilă pe alta el transmite un semnal
electric procesorului de semnal pentru a fi prelucrat. Amplitudinea acestui semnal dep inde de
mai mulți factori: distanța, unghi de acțiune a senzorului, temperatura.
Toate corpurile emit energie sub formă de radiații. Radiațiile infraroșii nu sunt vizibile pentru
ochiul uman, dar pot fi detectate de dispozitive electronice concepute în acest sens.
Corpurile de iluminat cu tehnologia senzorilor de mișcare infraroșu (PIR) se aprinde atunci când
o persoană trece prin câmpul de acțiune al senzorului, iar senzorul va activa lumina doar dacă o
persoană este în mișcare în raza de acțiune a senzoru lui.
Senzorii de mișcare cu infraroșu sunt mai sensibil în zilele răcoroase decât în zilele calde. Acest
lucru se datorează faptului că diferența de temperatură dintre aerul înconjurător și corpul uman
este mai mare în zilele reci, senzorul sesizând ușor d iferența de temperatură. Acest lucru are
dezavantaje, în cazul în care senzorul este prea sensibil, senzorul va detecta și mișcarea
animalelor mici creând alarme false, aprinderea inutilă a luminii sau aclanșarea sistemelor de
alarmă. Temperatura optimă de funcționare a senzorului de mișcare pentru sistemele de alarmă
este cuprinsă între 150-200 C. La temperaturi mai mari de 300 C, sensibilitatea senzorului va
scădea și emisiile în infraroșu vor fi detectate mai greu. Nici un sistem de detectare a mișcării nu
este perfect, dar senzorii PIR sunt ideali pentru sistemul de securitate al casei.
Senzorul folosit în acest proiect este HC -SR501 se bazează pe tehnologia în infraroșu, cu
modul de control automat, cu sensibilitate mare, cu un mod de operare care necesită o tensiune
de alimentare foarte scăzută.
2
Specificații tehnice:
– Tensiune de alimentare: 3,3V -5V
– Consum de curent: 50mA
– Ieșire TTL: 3.3v/0v
– Timp de întârziere ajustabil : 5sec – 5minute
– Timp de blocare: 0,2secunde
– Pragul de sensibilitate: unghi de 120 de grade, distanță de 7 metri
– Temperatura de operare: – 15 + 70 grade Celsius
Aplicații :
Cela mai importante aplicații cu senzor PIR sunt aprindere automată a luminii la detecția
persoanelor și sisteme de alarmă antiefracție.
Schema internă a senzorul ui PIR
Figura 1.1
http://eecs.oregonstate.edu/education/docs/pir/Schematic.PNG
Partea optică a senzorului de mișcare are rolul de focaliza energia termică pe senzorul de
Captu ră. Pentru partea optică a senzorului de obicei se utilizează oglindă sau lentilă Fresnel.
Zona de acoperire a detectorului este definită de fâțele oglinzii sua a secțiunii lentilelor.
3
Senzorul propiuzis este PIR2, el are rolul de a converti energia infrar oșie în energie electrică
Procesarea semnalului este realizată de circuitul dedicate BISS0001 care are rolul de a analiza
semnalul electric și a separa alarmele reale de cele false folosind intern praguri multiple.
1.2 Senzorul cu lumină în infraroșu
Spectrul vizibil este domeniu spectrului electromagnetic ce este vizibil și poate fi detectat
de ochiul uman fără mijloace ajutătoare. Radiațiile electromagnetice din acest interval de lungimi de unda se numesc lumină vizibilă. În condiții normale ochiul uman percepe în aer lungimile de
unda cuprinse între 380 și 750 nanometri. Lumina infraroșie este o lumină care nu este vizibilă
ochiului cu lungimea de undă ce depășește valoarea de 750 nanometri.
Senzorii de lumină în infraroșu sunt niște fototranzistori sau fotodiode care prin
construcția să transformă lumina în tensiune de deschidere, la tranzistor curentul de colector este
dependent de fluxul de lumina primit în baza fototranzistorului. Fototranzistorii pot fi cu două
sau trei terminale. În configurația cu două terminale, bază nu este accesibilă, caz în care semnalul
de intrare în fototranzistor este exclusiv lumină. În configurația cu trei terminale, bază se
conectează în circuit și asigură o stabilitate mai bună a punctului static pe funcționare față de variațiile cu temperatura. Capsula fototranzistorului este prevăzută cu o fereastră în care este
plasată o lentilă care focalizează fluxul luminosspre baza acestiua. Dacă se dorește funcționarea unui fototranzistor pe o lungime de undă i se aplică un filtru pe acea lungime de undă. Pe acest
principiu sunt făcute sistemele de alarmă cu infraroșu. Avem un emițător IR focalizat de la la distanța spre un fototranzistor. Condiția principală a acestui sistem este că emițătorul și
receptorul să lucreze cu aceiași l ungime de undă și emițătorul să aibe putere să atace baza
fototranzistorului cu aceiași intensitate a fluxului luminos indiferent de diferite condițiiale mediului înconjurător.
În general aceste tipuri de sisteme formează un număr de bariere luminoase car e odată
întreruptă o barieră fototranzistorul nu este comandat dând un semnal de comandă unității centrale a sistemului de alarmă, acesta în cele din urmă ia decizie în funcție de configurările care le are, de preferat acest semnal ar trebui să fie dat și în cazul în care cineva ar încerca să
îndepărteze senzorul intenționat din rea voință.
Aceste tipuri de sisteme de alarmă sunt sigure dar necesită multă atenție la instalarea pe distanțe
mari, ca lumina să focalizeze în elementul fotosensibil.
4
Costuril e sunt mai mari la un astfel de sistem deoarece un singură pereche emițător -receptor nu
este suficient pentru un sistem sigur, creșterea numărului de perechi duce la costuri materiale mai
mari și consumul de energie este mai ridicat față de cel cu senzori PIR . Pentru distanțe mai mari
de lucru emițătorul trebuie să fie unul de putere și consumul acestuia este pe măsură.
1.3 Senzori magnetici.
Pentru sisteme de alarmă sunt două tipuri de zenzori:
– Senzori Hall
– Senzori reed comandați cu magnet permanent
Senz orii Hall
În anul 1879 fizicianul american Edwin Herbert Hall (1855 – 1938) a observat că atunci
când un semiconductor, parcurs de un curent electric, este plasat sub acțiunea unui câmp
magnetic, apare o tensiune electrică, proporțională cu curentul elect ric și perpendiculară pe
direcția câmpului magnetic și a curentului electric. Acest efect manifestat în materialele
semiconductoare se numește efect Hall. Curentul electric ce parcurge materialul semiconductor
este influențat de câmpul magnetic. Liniile de flux magnetic exercită o forță asupra electronilor
(forță Lorenz). Datorită acestei forțe, electronii sunt deviați către o extremitate a
semiconductorului, în funcție de intensitatea și direcția liniilor de câmp. Aceasta deviere de
electroni produce o dif erență de potențial numită tensiune Hall.
Acest efect este mai pronunțat la materialele semiconductoare cum ar fi: arseniura de
galiu (GaAs), antimoniura de indiu (InSb) sau arseniura de inidiu (InAș). La materialele
conductoare (metale) efectul Hall est e foarte slab deoarece densitatea de electroni este foarte
mare iar efectul deviației de către câmpul magnetic este insesizabil.
Un element sensibil Hall detectează câmpuri magnetice de intensități relativ reduse ( 0.1
mT – 10T) și produce tensiuni electr ice între 1 … 10 mV . De asemenea, dimensiunile acestuia
sunt extrem de reduse, grosimea semiconductorului fiind în jur de 0.01 mm iar laturile de
ordinul milimetrilor.
Senzorii Hall sunt senzori activi, care necesită alimentare cu energie electrică. Astf el, cei
mai simpli senzori Hall au cel puțin 3 pini: tensiune alimentare, masă, tensiune Hall
Tensiunea de ieșire Hall (UH) este direct proporțională cu intensitatea câmpului magnetic.
5
Deoarece valoare tensiunii este foarte mică, toți senzorii de tip Hall au integrate amplificatoare
electronice și circuite de reglare pentru a ridica tensiunea de ieșire a senzorului în jurul valorii
de +5V.
Senzorii cu efect Hall sunt cei mai răspândiți senzori cu electronică integrată, cu o gamă
largă de aplicații. Î n s i s t e m e l e d e a l a r m ă e i s u n t m o n t a ț i p e u ș i ș i g e a m u r i î m p r e u n a c u u n
magnet permanent. Cât timp ușa este închisa magnetul este în imediata apropiere a senzorului generând la ieșirea acestuia o tensiune Hall. În momentul în care unitatea centrală nu dep istează
tensiune la ieșirea senzorului rezultă două variante: să îndepărtat magnetul de senzor prin deschiderea ușii sau a ferestrei sau senzorul a fost înlăturat voit din sistem cea ce duce la pornirea alarmei.
Acest tip de senzor mai sunt folosiți și în încuietori elecronice.
Senzor Hall:
http://john -service.blogspot.ro/2015/02/senzor -hall.html
1.4 Senzorul reed
Este alcătuit din două lamele feromagnetice, de obicei aurite, iar zo na de contact electric
este amalgamată cu mercur. Lamelele sunt închise ermetic într -un tub de sticlă din care ies către
exterior două sârme pentru legături electrice. În prezența câmpului magnetic, liniile de câmp se concentrează în zona lamelelor, care c onstituie o cale de reluctantă mică.
6
Între lamele apare o forța de atracție magnetică. Când forța este suficient de puternică
pune în contact lamele și închide contactul electric.
Acest tip de senzor se montează pe uși și geamuri împreuna cu un magnet permanent. În
momentul în care ușa sau geamul se deschide magnetul se îndepărtează de releu rupând contactul
pornind sistemul de alarmă. Acest tip de senzor nu asigura protecție maximă unei locuințe
monitorizând doar ferestre și uși. Acest tip de senzori ar face o pereche bună cu senzorii de
mișcare asigurând o securitate ridicată.
1.5 Senzori cu ultrasunete
Senzorul de ultrasunete HC -SR04 funcționează pe principiul sonarului pentru a aprecia
distanța până la un obiect, oferind o mare precizie a distanț ei măsurate: de la 2 cm până la 400
cm, cu precizie de până la 3 mm. Modulul include atât Transmițătorul (T) care trimite semnalul cât și Receptorul (R) care îl recepționează. Ultrasunetele au o frecvență ridicată (în principiu
40kHz). La început este trim is un semnal de 10μs, apoi o serie de 8 impulsuri de 40 kHz.
7
Receptorul așteaptă ecoul: dacă răspunsul este între 150μs -25ms se detectează un
obstacol; dacă timpul este peste 38ms nu se detectează nimic). Distanța este calculată folosind
formula L= C * T/2, unde L este lungimea, C este viteza sunetului în aer (344 m/s la temperatura
ambiantă de 20 grade C), iar T este diferența de timp de la trasmitere până la recepționare; timpul
este înjumătățit deoarece distanța este parcursă în ambele sensuri. Treb uie ținut cont că viteza
sunetului este afectată de densitatea aerului (iar densitatea este afectată în principal de temperatură și altitudine).
În sisteme de alarmă acești sensori sunt instalați în apropierea locurilor de acces, având o
putere de detect are de obstacole de la o distanța până în 4 metri. La detectarea de obstacole care
sunt mai aproape decât distanțele memorate inițial, alarma se activează.
1.6 Sistemele de alarmă cu senzori de presiune sunt cel mai greu de depistat de către
intrus. Aceșt i senzori sunt montați la intrare în camere sau la ferestre dedesuptul parchetului sau
dușumelei. Acești senzori fiind ascunși exista șanse mari ca intrușii să fie prinși în timpul unei spargeri. Aceste sisteme nu sunt cele mai folosite datorită întreținer ii greoaie a senzorilor și a
locurilor incomode unde sunt situați aceștia.
1.7 Sistemele de alarmă cu senzori de zgomot.
Senzorii de zgomot nu sunt folosiți singuri în sisteme de alarmă deoarece un intrus nu
încearcă să facă cât mai mult zgomot la intrarea în locuințe. Aceștia sunt montați pentru a depista
în general geamurile sparte, lovituri în pereți și alte zgomote ce depășesc un anumit prag de audibilitate. Ca și element receptor la acest tip de senzor avem un microfon. Ieșirea acestuia este amplificat ă și filtrată de către amplificatoare operaționale deoarece acestea au o amplificare
foarte mare. O problemă întâlnită la acest tip de sistem de alarmă o reprezintă partea de alarmă
propriuzisă, microfonul recepționează semnalul audio dat de soneria alarme i, moment în care
zgomotul produs de sonerie intră în buclă cu sistemul nostru. Ca și soluție la declanșarea alarmei
trebuie ținut cont că unitatea centrală să comande oprirea blocului de amplificare a microfonului.
Unele sisteme de alarmă sunt prevăzute ș i cu camere de supraveghere video care
monitorizează permanent locul protejat. Aceste camere prezintă un mare avantaj în a depista identitatea intrusului cât și traseul pe care îl are în interiorul obiectivului protejat, fiind considerate ca și probe în cazul găsirii vinovaților numai dacă sistemul de supraveghere este
montat de o firmă autorizată în acest scop.
8
Cele mai noi tehnologii cu camere de supraveghere oferă posibilitatea de a vizualiza pe o
pagină de internet creată de firma care montează camere le locul protejat 24 ore pe zi. Filmările
realizate se stochează pe o unitate hdd pe o perioadă mare de timp înregistrarea fiind acsesibila
proprietarului locului supravegheat. Pentru a reduce memoria utillizată sistemul poate înregistra
pe hdd doar când detectează mișcare în cadru (imaginile staționare nefiind înregistrate). Ca și metodă de siguranță se practică stocarea înregistrărilor în alte locații pentru a evita luarea sau distrugerea acestora intenționată. Aceste înregistrări sunt stocate pe servere dedicate și gestionate
de firme specializate alocând fiecărui utilizator o memorie de stocare la care are acces doar cu
nume de utilizator și parolă.
Aceste sisteme de supraveghere video sunt practice și ușor de întreținut. Consumul de
energie este nesem nificativ în raport cu beneficiile aduse de un asemenea sistem.
9
Capitolul 2
Tipuri de comunicare și moduri de introducere a datelor în sisteme de alarmă
Fiind un domeniu în continuă evoluție, sistemele de alarmă au diferite moduri de co ntrol
și de comunicare cu senzorii de la modul clasic folosind o tastatură numerică sau alfanumerică
până diverse tehnologii de exemplu cu ecran tactil, telecomenzi, recunoaștere vocală etc..
– Comunicarea sistemelor de alarmă cu senzorii cu transmisie pri n cablu
– Comunicarea sistemelor de alarmă cu senzorii prin transmisie wireless
– Sistemele de alarmă cu tastaturi numerice
– Sistemele de alarmă cu telecomanda
2.1 Comunicarea sistemelor de alarmă cu senzorii cu transmisie prin cablu
Sistemele de alarmă cabl ate sunt răspândite în majoritatea cazurilor unde locurile sunt
prevăzute cu instalații de alarmă sau senzorii cer acest tip de comunicare cu unitatea centrală.
Comunicarea prin cablu a senzorilor cu unitatea centrală se face cu semnale de tip zero și unu
logic cu diferite protocoale specificate de producătorii senzorilor. La senzorii PIR transmisia este
simplă deoarece pe ieșirea acestuia se găsește tensiune continuă 3,3v în caz de să depistat mițcare
sau 0v când senzorul nu depistează nimic. Pentru a aj uta sistemul de alarmă cu senzori PIR
intrarea în unitate este prevăzută cu rezistențe de pull -up de aproximativ 10k.
Protocoalele de comunicare pe sistemele cablate cele mai des întâlnite sunt I2C, SPI,
USART, protocoale de comunicare pe un singur fir etc
2.2 Comunicarea sistemelor de alarmă cu senzorii prin transmisie wireless
Sistemele de alarmă cu transmisie wireless sunt sisteme nou apărute, cu o utilizare mare
în locurile unde nu sunt instalații cablate și au o eficiența ridicată sau senzorii cer acest tip de
comunicare. La aceste sisteme, senzorii sunt montați în module care asigură comunicarea pe baza undelor radio sau infraroșu și alte metode fără fir funcție de senzor sau ce poate suporta unitatea centrală. În ultimii ani rețelele fară fir au cunoscut o dezvoltare semnificatvă pe plan
mondial, rezolvând diverse probleme ce apar în cazurile în care sunt multe cabluri.
10
Tehnologiile wireless asigura interconectarea mai multor dispozitive la distanțe variabile
funcție de puterea de emisie a module lor, tipul de date transferat, tipul de semnal folosit,
frecvența la care lucrează dispozitivele. Alimentarea acestor senzori se face în general cu
acumulatori având un consum foarte mic, ei putând fi montați în diverse locuri unde nu se
găsește rețea electrică de exemplu la distanțe semnificative față de locuință.
2.3 Sistemele de alarmă cu tastaturi numerice pentru introducerea codurilor de acces
activarea sau dezactivarea alarmei sunt printre primele tipuri de sisteme inteligente. Principiul de funcți onare a tastaturii fiind simplu este ușor de implementat pe sistemele cu microcontroler.
Tastaturile numerice sunt de forma matricială intersecția unei linii cu o coloană reprezintă câte un buton. Cele mai folosite sunt tastaturile de tip matrice cu patru linii și patru coloane. Citirea
lor se face prin două metode:
Prima metodă este folosind liniile la pinii de ieșire a microcontrolerului și coloanele la
intrări dacă intrările sunt prevăzute cu rezistențe pull -up comanda liniilor se face cu zero logic
altfal se face cu unu logic. La apăsarea unei taste coloana corespunzătoare tastei apăsate trece din
unu în zero logic în acest fel se depistează coloana. Pentru a afla linia apăsata se schimbă
valoarea linilor prin baleiere iar linia care schimba starea iniț ială a coloanei găsite anterior. Este
linia de interes. Tastă apăsată este tasta care este le intersecția liniei cu coloanei găsite. Modul de citire a tastaturii se poate face permanent sau în întrerupere. La citirea tastaturii în permanența se
risipește t imp de calcul inutil și acest duce la o activitate intensă a microcontrolerului. Citirea
tastaturilor se recomandă a fi făcută în funcția de întrerupere pentru o funcționare normală.
Funcția de întrerupere este internă microcontrolerelor și microprocesoarelor și are ca scop un salt de la linia de comandă executată în acel timp de microcontroler sau microprocesor în rutină de
întrerupere pe care o execută apoi revine la linia de unde a plecat.
A doua metodă folosită constă în legarea liniilor la pini de ie șire și coloanele la pini de
intrare. La apăsarea unei taste microcontrolerul intra în rutină de întrerupere unde detectează
coloană care a sesizat întreruperea apoi interscimbă intrările cu ieșirile descoperind linia prin
verificarea fiecarii linii care este în zero logic. La intersecția liniei cu coloana detectată
corespunde o tastă.
11
Principala problemă întâlnită la sistemele cu tastatură o reprezintă contactul care îl face
tasta la apăsare unde pot apărea oscilații locale până la stabilizare. Acest defi cit se rezolvă prin
introducerea unei întârzieri în program, ca butonul să aibă timp să fie apăsat fără probleme.
Tastaturile numerice deservesc la introducerea codurilor de acces, navigarea și
configurarea setărilor de bază a unității centrale
2.4 Sistemele cu telecomanda sunt de un grad de dificultate mai ridicat, dar sunt mai
practice și mai sigure. În general telecomenzile pentru sistemele de alarmă sunt de dimensiuni reduse. Comunicarea dintre telecomandă și microcontroler se face cu ajutorul unui r eceptor IR,
care sesizează trenurile de impulsuri care vin de la telecomandă, și le transformă în semnal electic care este prelucrat de microcontroler. Citirea telecomenzilor se face prin diferite
protocoale, de exemplu: Sony SIRC, NEC, RC -5, PANASONIC, et c.
12
Capitolul 3
Afișajul alfanumeric de tip LCD controlat cu microcontroler
Pentru afișarea caracterelor alfanumerice, utilizarea dispozitivelor de afișare cu cristale
lichide în format matricial este cel mai comod și mai răspândit. Fiin d o aplicație complexă
managementul datelor afișate trebuie gestinate de un microcontroler sau un microprocesor.
3.1 Arhitectura
Tipul de LCD folosit este Hitachi HD44780 ce permite afișarea caracterelor alfanumerice
în format matricial 5×7, pe 2 linii a câte 16 caractere pe linie. Afișajul permite afișajul a 192 de
caractere ASCII, în forma memorată în memoria fixă a generatorului de caractere, precum și a maxim 8 caractere definite de utilizator.
Pentru controlul afișajului se folosește un microcontroller de tip PIC18F4520 pe 8 biți.
Schema bloc a dispozitivului de afișare HD44780
Dispozitivul de afișare se conectează la microcontroller prin intermediul magistralei da
date DB0~DB7 (se pot scrie/citi date în/din controlerul dispozitivului de afișaj) și prin
intermediul a trei linii de control astfel:
– RS (Register Selection) selecție registru. Semnalul de pe această linie selectează tipul
registrului intern (Registru de date sau registru de instrucțiuni);
13
– RW (Read/Write) citește/scrie. Semnalul de pe această linie precizează dacă operația cu
registrele interne este de scriere sai citire.
– E (Enable) autorizare. Semnalul de pe această linie activează sau dezactivează
conectarea controleruluidispozitivului de afișaj la microcontroler.
Pentru alimentare d ispozitivele sunt prevăzute cu două linii de alimentare VDD tipică de
5V și VSS(GND). Mai există o linie denumită VLC (tensiune de comandă cristale lichide).
Tensiunea pe această linie variază între 0 și VDD, funcție de această tensiune se controlează
contrastul afișajului. Dacă linia este lăsată în aer, pe afișaj nu apare nici un caracter.
Instrucțiuni de utilizare
Registre
Controlerul HD44780 are două tipuri de register de 8 biți:
– Registru de instrucțiuni (IR)
– Registru de date (DR)
Acestea sunt selectate de semnalul de selecție RS ca în tabelul următor:
RS R/W Operație
0 0 Scrie IR ca operație internă(stergere afițaj)
0 1 Citește flag ocupat(DB7) și adresă contor (DB0 pană la DB7)
1 0 Scrie date în DDRAM sau CGRAM (DR în DDRAM sau CGRAM)
1 1 Citește date din DDRAM sau CGRAM (DDRAM sau CGRAM în DR)
Registrul de instrucțiuni stochează codurile de instrucțiuni, el poate fi scris de către
microcontroller dar nu poate fi citit. Registrul de date(DR) stochează temporar datele ce
trebuiesc scrise în DD RAM sau în CG RAM.
3.2 Descrierea instrucțiunilor:
Când o unitate cu microprocessor comandă controlerul de pe modul de afișare LCD,
respectiva unitate controlează direct numai două register ale controlerului: registru de instrucțiuni și registru de date. Îna inte să înceapă o operație internă, controlerul stochează
temporer informațiile de control în aceste register, pentru a permite interfațarea cu diferite tipuri
de microprocesoare sau circuite integrate de control ce funcționează la diferite viteze și a le
adapta cu viteza internă de lucru a controlerului.
14
Setul de instrucțiuni:
Instrucțiuni Coduri Descriere Timp de
Execuție RS R/W B7 B6 B5 B4 B3 B2 B1 B0
ștergere
afișaj 0 0 0 0 0 0 0 0 0 1 șterge ajișajul și aduce
cursorul în poziția
inițială 1.52ms
Returnarea
cursorului 0 0 0 0 0 0 0 0 1 * Întoarce cursorul în
poziția inițială.Afișajul
deplasat revine pe
poziția inițială.Conținutul
DDRAM rămâne
neschimbat 1.52ms
Setare mod
introducere 0 0 0 0 0 0 0 1 I/D S Setează direcția de
mișcare a
cursorului(I/D ),specifică
dacă afișajul se
deplasează în timpul
operațiilor de
citire/scriere 37µ
Controlul
on/off al
afișajului 0 0 0 0 0 0 1 D C B Comutarea on/off a
afișajului(D) și a cursorului(C) și clipirea
cursorului pe poziția în
care se află 37µ
Deplasarea
cursorului/
afișajului 0 0 0 0 0 1 S/C R/L * * Deplasează cursorul și
afișajul fără a modifica
DDRAM 37µ
Setare
funcție 0 0 0 0 1 DL N F * * Setează lungimea
interfeței de
date(DL),numarul
liniilor de afișare(N) și
fontul caracterelor(F) 37µ
Fixare
adresă CGRAM 0 0 0 1 adresa CGRAM Fixează adresa CGRAM
pentru a începe
transmisia și recepția 37µ
15
dateloer CGRAM
Fixare
adresă
DDRAM 0 0 1 Adresa DDRAM Fixează adresa
DDRAM pentru a
începe transmisia și
recepția datelor
DDRAM
Citirea flag
„ocupat” \
adresă 0 1 BF Adresa CGRAM/DDRAM Citește flagul
„ocupat”(BF) ce indică
operație internă pentru
modul de afișare și
citirea adreselor
CGRAM și DDRAM 0µ
Scriere
CGRAM
sau
DDRAM 1 0 Scriere de date Scrie date în CGRAM
sau DDRAM 37µ
Citește
CGRAM
sau
DDRAM 1 1 Citeșt e date Citește date din
CGRAM sau DDRAM 37µ
Instrucțiuni:I/D=0:decrementare poziție cursor;I/D=1:incrementare pozișie cursor;S=0:fără deplasare
afișaj;S=1:deplasare afișaj;D=0:afișaj OFF;D=1:afișaj ON;C=0:cursor oprit;C=1:cursor pornit;B=0:clipire
cursor OFF;B=1:clipire cursor ON;S/C=0:deplasare cursor;S/C=1:deplasare afișaj;
Timpul de execuție din tabelul de mai sus indică valoarea maximă când frec vența oscilatorului
fosc=270kHz . Înainte să înceapă o operațiune internă, controlerul stochează temporar
informațiile de control în aceste registre, pentru a permite interfațarea cu diferite tipuri de
microprocesoare sau circuite integrate periferice de control ce funcționează la diferite viteze și a
le adapta cu viteza internă de lucru a controlerului.
* : bit indiferent
I/D=1: incrementare B=1: licărire ON N=1: umplere 1/16
I/D=0: decrementare B=0: licărire OFF N=0: umplere 1/8 sau 1/11
ACG : adresă CG RAM
ADD : adresă DD RAM
16
AC : adresă GC RAM
S=1: deplasare afișaj S/C=1 deplas are afișaj F=1: matrice 5×10 puncte
S=0: fără deplasare afișaj S/C=1 mișcare cursor F=0: matrice 5×7 puncte
D=1: afișaj ON R/L=1: deplasare dreaptă BF=1: operație internă în desfăș.
D=0: afișaj OFF R/L=0: deplasare stânga BF=0: se poate accepta instrucțiune
C=1: cursor ON DL=1: 8 biți
C=0: cursor OFF DL=0: 4 biți
** Timpul de execuție din tabelul de mai sus indică valoarea maximă când frecvența
oscilatorului fosc este 250 kHz. Când fosc se schimbă, s e schimbă și timpul. De exemplu, dacă
fosc = 270 kHz, timpul de execuție este 40 μs x 250/270 = 37 μs.
Când controlerul execută o instrucțiune și este în desfășurare o operațiune internă,
controlerul nu va accepta și executa nicio altă instrucțiune, cu excepția instrucțiunii Flag Ocupat
/ Citire adresă ( Busy Flag / Address Read). Deoarece flagul “ocupat” ( busy) este setat la valoarea
“1” când o instrucțiune este în curs de execuție, înainte de a trimite de la microprocesor spre controler o altă instrucți une se testează starea flagului și trebuie să ne asigurăm că aceasta este
“0”. Pentru a transmite instrucțiuni fară testarea flagului “ocupat” ( busy) trebuie să ne asigurăm
că intervalul de timp dintre două instrucțiuni este mai mare decât timpul de execu ție al
instrucțiunii precedente.
3.3 Contorul de adrese (AC) – Address Counter Contorul de adrese (AC) precizează o
adresă atunci când dată este scrisă în DD RAM sau CG RAM și când este extrasă prin citire data
stocată în DD RAM sau CG RAM.
17
Dacă o instr ucțiune de setare adresă (pentru DD RAM sau CG RAM) este scrisă în
registrul de instrucțiuni IR, informația despre adresă este transferată din registrul de instrucțiuni
IR în contorul de adrese AC. Când datele afișate sunt scrise în sau citite din DD RAM s au CG
RAM, contorul de adrese AC este incremetat sau decrementat automat, conform cu modul de introducere fixat. Conținutul contorului de adrese AC este extras la ieșirile DB0 la DB6 dacă RS = 0 și R/W = 1.
Memoria RAM a datelor afișate (DD RAM) – Display Data Random Access Memory
Memoria DD RAM are capacitatea până la 80 x 8 biți, stocând date pentru 80 de caractere cu
coduri de 8 biți. Unele zone de stocare ale memoriei DD RAM, nefolosite la afișare, pot fi utilizate ca locații de memorie de date RAM generale.
Adresele locațiilor de memorie DD RAM
Adresele locațiilor de memorie DD RAM și digiții afișați pe panoul LCD sunt în
următoarea corespondență pentru modulele LCD comandate cu factor 1/16. Un controler poate
afișa maxim 80 decaractere.
Se observă că ultima adresă de pe prima linie (27H) și adresa de început a celei de- a doua
(40H) nu sunt consecutive. Adresele locațiilor de memorie DD RAM pentru modulul de afișaj
L2432 folosit în cadrul lucrării de față sunt prezentate mai jos.
Generatorul de caractere ROM (CG ROM) – Character Generator Read Only
Memory Memoria CG ROM generează șabloanele caracterelor pentru matricea de 5×7 puncte
pornind de la codurile de 8 biți ale caracterelor.
18
În modulele cu caractere în format matricial 5×7 puncte, generat orul de caractere CG
generează 192 de tipuri de caractere. Tabelul 2 prezintă corespondența între codurile caracterelor
din CG ROM și șabloanele craracterelor respective în format matricial de 5×7 puncte.
19
Circuitul de control al cursorului /licărire – Cursor/Blink Control Circuit Circuitul poate
genera cursorul sau efectul de licărire. Când numărătorul de adrese (AC) selectează adreasa DD
RAM, pe poziția digitului corespunzător adresei apare cursorul sau efect de licărire. Când
contorul de adresă AC are conținutul 08H, cursorul sau efectul de licărire apare pe poziția
digitului 9 de pe linia 1, cum se prezintă mai jos. Cursorul sau efectul de licărire apar și atunci
când se selectează memoria RAM a generatorului de caractere (CG RAM) de către numărătorul de adrese. În acest caz cursorul sau efectul de licărire nu au nicio semnificație.
Flagul Busy (ocupat) (BF) Flagul busy indică dacă modulul este gata să accepte
următoarea instrucțiune. După cum se arată în Tabelul 1, semnalul este scris la DB7 dacă RS = 0
și R/W = 1. Dacă starea este 1, modulul este în ciclu de funcționare internă și instrucțiunea nu poate fi acceptată. Dacă flagul busy este în starea 0, se poate scrie următoarea instrucțiune. Ca
urmare, starea flagului busy trebuie testată înainte de executarea unei instrucțiuni. Pentru a
executa o instrucțiune fără a testa starea flagului, trebuie să se aștepte mai mult decât timpul
necesar executării instrucțiunii precedente. În capitolul “Descrierea instrucțiunilor” se găsește
timpul necesar fiecăre i instrucțiuni.
Generatorul de caractere RAM (CG RAM) – Character Generator Random Access
Memory
Memoria CG RAM este folosită pentru a crea prin program șabloane în mod liber. În
memoria CG RAM pot fi scrise șabloane în format matricial de 5×7 puncte pent ru 8 tipuri de
caractere. În Tabelul 3 se prezintă șabloane de caractere create “R” și “¥”), precizându -se
adresele CG RAM și datele CG RAM.
Pentru a afișa un caracter cu șablon creat, codul caracterului scris în coloana din stânga a
tabelului este scris î n DD RAM în corespondență cu poziția pe afișaj (digit). Zonele nefolosite
pentru afișare sunt disponibile ca locații RAM de memorie de date generale.
20
* – valoare indiferentă a bitului
Note :
– În datele CG RAM, “1” înseamnă selecția afișajului, iar “0” n eselecția;
– Biții codurilor de caracter 0 la 2 și biții de adresă CG RAM 3 la 5 sunt în corespondență
(3 biți -8 octeți);
– Biții de adresă CG RAM 0 la 2 specifică poziția liniei pentru șablonul caracterului, linia
8 a șablonului este poziția cursorului, pentru care se afișează rezultatul funcției logice SAU între
cursor șidata CG RAM. Pentru a afișa cursorul, se fixează la “0” data liniei 8. Dacă data este
schimbată în “1”,bitul corespunzător este afișat, indiferent de cursor;
21
– Pozițiile coloanelor șablo nului caracterului corespund biților de date 0 la 4 din CG
RAM, iarbitul 4 se plasează la capătul din stânga. Biți 5 la 7 din CG RAM nu sunt afișați, dar pot
fi folosiți cadate RAM de tip general.
– Când se lucrează cu șablonul unui caracter din CG RAM, se fixează în “0” toți biții 4 la
7 din codul caracterului. Biții 0 la 2 determină care șablon va fi extras. Deoarece bitul 3 nu este
valabil, 00Hși 08H selectează același caracter.
22
Capitolul 4
Interfeț e
4.1. Interfața seriala I2C
4.1.1 Gene ralitati:
Acronimul I2C vine de la “Inter -Integrated Circuit”. Acest tip de comunicare a fost
definit de Philips în 1970 din dorința de simplificare și standardizare a liniilor de date din
produsele lor. Prin această soluție s -a redus numărul de linii l a două (SDA – date și SCL – ceas).
Popular această interfață este cunoscută și sub numele de “comunicare pe dou ă fire” sau “two wire
interface”.
I2C presupune:
Rata de transfer: 10 Kb/s – 100Kb/s
SDA – Serial Data line
SCL – Serial Clock line
128 de adres e posibile
16 adrese rezervate 112 dispozitive se pot conecta pe I2C
Dispozitivele conectate trebuie sa aibă masa comuna (GND).
4.1.2 Descrierea interfetei:
Realizarea unui sistem I2C presupune interconectarea unor circuite integrate
(specializate) prin numai trei linii: două de semnal și una de masă. Cele două linii de semnal sunt
denumite "serial dată" (SDA) și "serial clock" (ȘCL). Fiecare circuit integrat are o adresă unică și poate funcționa fie ca transmițător, fie ca receptor, în funcție de tipul circuitului. De exemplu,
un ci rcui t pen tru c om an da un ui afi șaj cu cri stal e li chi de poa te fi n um ai receptor, î n ti m p ce un
circuit de memorie RAM poate fi atât transmițător cât și receptor (evident, nu simultan).
23
Dintr -un alt punct de vedere, un circuit int egrat din sistem poate fi coordonator sau
executant.
Circuitul integrat coordonator este circuitul care inițiază un transfer de date și tot el
generează semnalele de tact pentru a permite realizarea unui transfer. Orice alt circuit integrat
adresat de coor donator este subordonat.
Rata maximă de transfer pe magistrală este de 100 kbit/s. Ultimele realizări de circuite
integrate destinate să funcționeze în sisteme I2C admit rate maxime de transfer de 400 kbit/s.
Numărul de circuite care se pot conecta la magi strală este limitat numai de capacitatea
maxim admisă pentru fiecare linie, care este de 400 pF.
Structura I2C este o structură multi -coordonator, adică se pot interconecta mai multe
circuite care pot avea rolul de coordonator. Termenii implicați în descri erea funcționării
interfeței I2C, precum și semnificația acestora sunt prezentate în tabelul următor:
Termenul Descrierea termenului
Transmițător Dispozitivul care pune datele pe magistrală
Receptor Dispozitivul care preia datele de pe magistrală
Coordonator Dispozitivul care inițiază un transfer, generează semnalele de
tact și termină transferul
Subordonat Dispozitiv adresat de către coordonator
Multi -coordonator Există mai multe dispozitive care pot să ceară în a celași timp funcția de
coordonator fără să vicieze mesajul aflat pe magistrală
Arbitraj Procedura prin care, fără să vicieze mesajul aflat pe magistrală, se
declară un singur câștigător atunci când există mai multe dispozitive care solicită simultan funcț ia de coordonator
Sincronizare Procedură prin care se sincronizează semnalul de tact funcție de viteza
de transfer acceptată de dispozitivele implicate în transfer
24
Ambele linii, SDA și SCL sunt linii bidirecționale, conectate la plusul sursei de
alimen tare prin câte un rezistor (rezistor “pull -up”). Dacă magistrala este liberă, ambele linii sunt
la nivel ridicat.
Etajele de ieșire ale fiecărui circuit care se conectează la magistrala I2C trebuie să aibă o
ieșire de tip colector în gol sau drenă în gol, pentru a putea permite realizarea funcției ȘI -cablat.
4.1.3 Protocolul de transfer pe magistrala I2C
Protocolul de transfer al datelor pe magistrala I2C presupune inițierea transferului prin
aducerea magistralei într -o condiție de START, transferul propr iu-zis și încheierea transferului
prin aducerea magistralei într -o condiție de STOP.
Condiția de START (S) este definită prin trecerea liniei SDA din 1 în 0, în timp ce linia
SCL este menținută la nivel ridicat.
Condiția de STOP (P) este definită prin trecerea liniei SDA din 0 în 1, în timp ce linia
SCL este menținută la nivel ridicat.
Fig 4.1 Definirea condițiilor de START și STOP.
Datele trebuie să fie stabile pe durata impulsurilor de tact Modificarea datelor se poate
face pe durata pauzelor dintre im pulsurile de tact
25
Figura 4.2 Definirea intervalelor în care datele se pot
schimba și în care trebuie să fie stabile.
Datele sunt transferate pe magistrală sub formă de octeți. După transmiterea fiecărui octet
transmițătorul trebuie să afle dacă acesta a fost recepționat în bune condiții de către receptor.
Aceasta se face prin procedura de acceptare (figura 4.3). După transmiterea celui de- al 8-lea bit,
transmițătorul lasă în starea sus linia de date SDA; dacă recepția s -a făcut corect (fiecare bit a
fost preluat, s -a verificat paritatea, cuvântul recepționat în registrul de deplasare pentru recepție a
fost preluat de registrul tampon pentru recepție), atunci receptorul trage jos linia SDA pe durata
celui de -al 9-lea tact de pe linia S CL.
Fig 4.3 Procedura de acceptare a unui octet.
26
Fig 4.4 Transferul datelor pe magistrala I2C.
Numărul de octeți care poate fi transmis în cadrul unui transfer nu este limitat. În cadrul
unui octet, primul bit transferat este bitul cel mai semnificativ (figura 4.4). După primele opt
impulsuri de tact necesare transmiterii unui octet urmează un al nouălea impuls, utilizat pentru
recunoașterea efectuării transferului (a se vedea mai sus).
Dacă, după recepția unui octet, receptorul nu admite un nou octet (pentru că, de
exemp lu, tratează o întrerupere internă), el poate menține linia SCL la nivel coborât pentru a
forța transmițătorul într -o stare de așteptare. Transferul poate continua când receptorul este gata,
situație indicată prin eliberarea liniei SCL. În felul acesta se face adaptarea vitezei de transmisie
după viteza celui mai lent participant.
Întotdeauna, primul octet transmis după condiția de START reprezintă adresa unui
subordonat, împreună cu tipul operației solicitate (scriere sau citire). Primii șapte biți ai aces tui
octet reprezintă adresa. Tipul operației este precizat de bitul 8, notat R/W. Astfel, dacă R/W = 1, coordonatorul va citi date de la subordonatul adresat iar dacă R/W = 0, coordonatorul va
transmite date subordonatului adresat.
Un transfer complet este ilustrat în figura 4.5
27
Fig 4.5 Transferul unui mesaj pe magistrala I2C.
Utilizarea tehnicii de recunoaștere a transferului este obligatorie pentru asigurarea unui
transfer corect. Impulsul de tact corespunzător fiecărui octet, denumit impuls de recunoaștere,
este generat de coordonator. Transmițătorul eliberează linia SDA pe durata impulsului de
recunoaștere.
Receptorul trebuie să aducă linia SDA la nivel coborât și să o mențină așa pe toată durata
impulsului de recunoaștere, ceea ce garantează efectuarea corectă a transferului octetului
respectiv. În general, un receptor adresat trebuie să recunoască fiecare octet transmis. Există și
excepții, care însă nu fac obiectul acestei tratări.
Dacă un receptor subordonat nu recunoaște adresa care i -a fost trim isă pe magistrală (de
exemplu, nu poate recepționa date pentru că execută o funcție în timp real), subordonatul trebuie
să lase linia SDA la nivel ridicat. În această situație, coordonatorul poate genera o condiție de
STOP pentru a abandona transferul.
4.1.4 Adresarea în sistemul I2C
În I2C se i m pun e ca pri m ul octe t după c on di ți a de sta rt să fi e adresa sub ordon atul ui cu
care coordonatorul dorește să facă transfer. Adresa trebuie să urmeze după condiția S. Excepție
de la această regulă este situația de “adresare generală” la care toate elementele din sistem
trebuie să răspundă și care se codifică prin doi octeți. Totuși, există elemente care nu răspund (nu
este util să răspundă) la “adresarea generală”. Ele vor ignora codul adresării generale.
La adresarea ob ișnuită, octetul ce urmează după condiția S codifică pe primii 7 biți mai
semnificativi adresa subordonatului, iar bitul mai puțin semnificativ este bitul R/W și arată
sensul transferului. Atunci când se transmite adresa, fiecare dispozitiv din sistem comp ară adresa
28
recepționată cu propria adresă; dacă constată egalitatea, dispozitivul devine subordonat receptor
sau subordonat transmițător, funcție de valoarea bitului R/W.
Adresa
subordonat bitul
R/W Descriere
0000.000
0000.000 0
1 Adresare generală
Cuvân tul START
0000.001
0000.010 x
x adresare pentru sisteme CBUS
rezervat pentru adresarea în alte tipuri de magistrale
0000.011
0000.1xx
…………
1111.1xx x
x ..
x utlizate ca adrese
1111.0xx x rezervat pentru adresarea cu 10 biți
Adresa unui subordonat poate avea o parte fixă și o parte programabilă. Partea fixă
definește clasa dispozitivului (spre exemplu: memorii, dispozitive de afișare, microprocesoare, etc.) iar partea programabilă identifică dispozitivul din clasa respectivă. Mărimea părții
programab ile depinde de numărul de pini pentru adresă pe care circuitul îi are. Spre exemplu, un
circuit are 4 biți de adresa fixă și 3 biți programabili; aceasta înseamnă că se pot conecta la
magistrala I2C 8 dispozitive de acest fel.
Comitetul de coordonare al magistralei I2C a recomandat o alocare a celor 127 de adrese
prezentată în tabelul de mai sus. Există două grupe de câte 8 adrese: 0000xxx și 1111xxx rezervate pentru scopurile arătate în tabel. Adresele 11110xx sunt rezervate pentru adresarea cu 10 biți, fo losită în sisteme I2C de mare întindere.
4.2 Protocolul de transmisie serială
4.2.1 Parametrii comunicației seriale
Viteza de comunicație (numită și debit binar ) este măsurată în biți/s (bps):
[biți/s] T D 1 unde T este perioada de timp necesară pentru transmisia sau recepția unui singur
bit. Modemul reprezintă semnalele de date prin diferite stări electrice, în funcție de tipul de modulație pe care îl utilizează: frecvență, amplitudine, sau fază. Fiecare stare electrică este
menținută la ieșirea modemului pentru un interval de timp numit perioadă de modulație ( ).
29
Viteza de modulație este inversul perioadei de modulație, reprezentând numărul
schimbărilor pe secundă ale stării electrice a modemului: [baud] 1 m V Unitatea de măsură a
vitezei de modulați e este baud, după numele inginerului și tele -grafistului francez Jean -Maurice
Baudot. Relația dintre viteza de comunicație D și viteza de modulație Vm este: D = Vm log2 n
[biți/s] unde n este numărul stărilor electrice distincte ale modemului. În cazul par ticular când
există doar două stări electrice distincte ale modemului, viteza de comunicație este egală cu viteza de modulație. În general însă, există un număr mai mare de stări electrice ale modemului,
ast-fel încât viteza de comunicație este un multiplu al vitezei de modulație.
Viteza de modulație este confundată adesea cu viteza de comunicație (debitul binar).
Viteza de modulație (exprimată în baud) este rata cu care se modifică stările electrice ale
modemului într -o secundă. De exemplu, dacă se utilizează modulația în frecvență, iar frecvența
semnalului purtător se poate modifica de către modem cu o rată de 2.400 de ori pe secundă, viteza de modulație este de 2.400 baud. Primele modemuri codificau un bit de 0 printr -o anumită
frecvență și un bit de 1 p rintr-o altă frecvență.
În acest caz particular, viteza de modulație are aceeași valoare cu viteza de comunicație.
În general însă, modemurile codifică mai mulți biți de informație printr -o stare electrică. De
exemplu, dacă modemul codifică 4 biți de info rmație printr -o anumită frecvență, pentru exemplul
anterior viteza de comunicație va fi de 4 2.400 = 9.600 biți/s.
4.2.2 Tipuri de comunicație serial
Din punctul de vedere al direcției de transfer , se pot distinge următoarele tipuri de comunicație
serială:
– Simplex;
– Semiduplex;
– Duplex.
În cazul comunicației simplex , datele sunt transferate întotdeauna în aceeași direcție, de la
echipamentul transmițător la cel receptor. La comunicația semiduplex , fiecare echipa- ment
terminal de date funcționează alternativ ca transmițător, iar apoi ca receptor. Pentru acest tip de
conexiune, este suficientă o singură linie de transmisie (două fire de legătură). Într -o comunicație
duplex (numită și duplex integral), datele se transferă simultan în ambele direcții.
30
Primele c onexiuni duplex necesitau două linii de transmisie (patru fire de legătură), dar
conexiunile ulterioare necesită o singură linie.
Din punctul de vedere al sincronizării dintre transmițător și receptor, există două tipuri de
comunicație serială:
– Asincronă ;
– Sincronă.
4.2.3 Comunicația asincronă
Pentru a asigura sincronizarea dintre transmițător și receptor, fiecare caracter transmis
este precedat de un bit de START, cu valoarea logică 0 (“ space ”), și este urmat de cel puțin un
bit de STOP, cu valoarea log ică 1 (“mark ”). Biții de START și de STOP încadrează deci fiecare
caracter transmis; caracterul transmis între acești doi biți reprezintă un cadru de date. Un
asemenea cadru reprezintă informația digitală de bază într -un sistem de comunicație seria- lă. În
cazul comunicației asincrone, intervalul de timp între transmisia a două caractere succe- sive este
variabil, pe durata acestui interval linia de comunicație fiind în starea 1 logic. Acest mod de
comunicație este numit și start-stop.
Sincronizarea la nivel de bit se realizează cu ajutorul semnalelor de ceas locale cu aceeași
frecvență. Atunci când receptorul detectează începutul unui caracter indicat prin bitul de START,
pornește un oscilator de ceas local, care permite eșantionarea corectă a biților indivi duali ai
caracterului. Eșantionarea biților se realizează aproximativ la mijlocul intervalului corespunzător
fiecărui bit.
Figura 4.6 ilustrează transmisia caracterului cu codul ASCII 0x61. După bitul de START,
având durata T corespunzătoare unui bit, tran smisia caracterului începe cu bitul cel mai puțin
semnificativ b0. După transmisia bitului cel mai semnificativ b7, se transmite un bit de paritate
p; în acest exemplu, paritatea este impară. Bitul de paritate este opțional, iar în ca- zul în care se
adaugă la caracterul transmis, paritatea poate fi selectată pentru a fi pară sau impară. Există și
posibilitatea ca bitul de paritate să fie setat la 0 sau 1, indiferent de paritatea efectivă a
caracterului. În exemplul ilustrat, la sfârșitul caracterului se transmi t doi bi ți de STOP s 1 și s2,
după care linia rămâne în starea 1 logic un timp nedefinit. Acest timp cores -punde unui interval
de pauză.
31
Figura 4.6
În cazul comunicației asincrone, sincronizarea la nivel de bit este asigurată numai pe
durata transmis iei efective a fiecărui caracter. O asemenea comunicație este orientată pe ca-
ractere individuale și are dezavantajul că necesită informații suplimentare în proporție de cel
puțin 25% pentru identificarea fiecărui caracter.
4.2.4 Comunicația sincronă
În cazul comunicației sincrone, un cadru nu conține un singur caracter, ci un bloc de
caractere sau un mesaj . Sincronizarea la nivel de bit trebuie asigurată permanent, nu numai în
timpul transmisiei propriu -zise, ci și în intervalele de pauză. De aceea, timpu l este divizat în mod
continuu în intervale elementare la transmițător, intervale care trebuie regăsite apoi la receptor.
Aceasta pune anumite probleme. Dacă ceasul local al receptorului are o frecvență care diferă într-o anumită măsură de frecvența transm ițătorului, vor apare erori la recunoaște- rea
caracterelor, din cauza lungimii blocurilor de caractere.
Pentru a se evita asemenea erori, ceasul receptorului trebuie resincronizat frecvent cu cel
al transmițătorului. Aceasta se poate realiza dacă se asigu ră că există suficiente tranziții de la 1 la
0 și de la 0 la 1 în mesajul transmis. Dacă datele de transmis constau din șiruri lungi de 1 sau de 0, trebuie inserate tranziții suficiente pentru resincronizarea ceasurilor. Asemenea tehnici sunt
dificil de implementat, astfel încât se utilizează de obicei o tehnică numită comunicație asincronă
sincronizată (numită în mod simplu comunicație sincronă).
32
Acest tip de comunicație este caracterizat de faptul că, deși mesajul este transmis într -un
mod sincron, nu exi stă o sincronizare în intervalul de timp dintre două mesaje. Informația este
transmisă sub forma unor blocuri de caractere sau a unor biți succesivi, fără biți de START și
STOP. Pentru ajustarea oscilatorului local la începutul unui mesaj, fiecare mesaj es te precedat de
un număr de caractere speciale de sincronizare, de exemplu, caracterul SYN (0x16). Pentru
menținerea sincronizării, se pot insera caractere de sincronizare suplimentare în mesajul transmis, la anumite intervale de timp.
La receptor există tr ei nivele de sincronizare:
– Sincronizare la nivel de bit, utilizând circuite cu calare de fază PLL ( Phase –Locked
Loop)1, pe baza tranzițiilor existente în semnalul recepționat;
– Sincronizare la nivel de caracter, asigurată prin recunoașterea anumitor caractere de sincronizare
;
– Sincronizare la nivel de bloc sau mesaj, care depinde de protocolul de date utilizat.
Transmit Data, TD (Transmisie Date )
Datele sunt transmise serial pe această linie de către cal culator. După bitul de start, se
transmite bitul cel mai puțin semnificativ al unui caracter. În general, pentru transmisia date- lor
este necesar ca semnalele RTS , CTS, DTR și DSR să fie active. Aceste semnale sunt activa- te în
cadrul unei secvențe de stab ilire a legăturii cu modemul.
Receive Data, RD (Recepție date)
Această linie este utilizată de calculator pentru recepția datelor de la modem sau de la un
echipament extern.
Data Terminal Ready, DTR
Atunci când calculatorul este operațional și pregătit p entru comunicația de date, acti –
vează semnalul DTR . Modemul va răspunde la semnalul DTR prin activarea semnalului DSR .
Data Set Ready, DSR (Modem operațional)
Atunci când modemul sau echipamentul extern este operațional și pregătit pentru co –
municația de d ate, activează semnalul DSR. Acest semnal este activat de modem ca răspuns la
activarea semnalului DTR de către calculator. Calculatorul va transmite date către modem doar în
cazul în care semnalul DSR este activ.
33
Request To Send, RTS (Cerere de emisie)
Atunci când calculatorul este pregătit pentru transmisia datelor, activează semnalul RTS.
Acest semnal indică modemului faptul că poate transmite date către calculator. Un sem -nal RTS
inactiv va preveni modemul de a transmite date către calculator. Aceasta p ermite cal -culatorului
să controleze fluxul datelor transmise de modem. Răspunsul la semnalul RTS se recepționează de
calculator pe linia CTS .
Clear To Send, CTS (Gata de emisie)
Prin activarea acestui semnal, modemul sau echipamentul extern indică faptul că este
pregătit pentru recepția datelor de la calculator. Semnalul CTS este activat de modem ca răs -puns
la activarea semnalului RTS de către calculator. Un semnal CTS inactiv va preveni calcu -latorul
de a transmite date către modem. Aceasta permite mode mului să controleze fluxul da -telor
transmise de calculator.
4.3 Protocolul NEC
Protocolul de transmisie NEC utilizeaza codarea mesajelor de biti folosind o secventa de
pulsuri cu perioade bine definite pentru transmisa la distanta. Fiecare secventa de p ulsuri are o
perioada de 562.5μs la o frecventa purtatoare de 38kHz .
Starile logice a bitilor sunt transmise dupa cum urmeaza:
‘0’ logic – o secventa de pulsuri la frecventa de 38kHz pentru o perioada de 562.5μs urmate de
un spatiu de 562.5 μs , perioada totala fiind de 1.125ms.
‘1’ logic – o secventa de pulsuri la frecventa de 38kHz pentru o perioada de 562.5μs urmate de
un spatiu de 1.6875ms , perioada totala fiind de 2.25ms.
Când o tastă este apăsată pe telecomandă , mesajul transmis este format din următoarele, în
ordine:
– o perioada de 9ms semnalul sta in ‘1’
– o perioada de 4.5ms semnalul sta in ‘0’
– 8 biti de adresa a receptorului
– 8 biti de adresa a receptorului inversati logic
– 8 biti de comanda
34
– 8 biti de comanda inversati logic
– la fin al o secventa de pulsuri la frecventa de 38kHz pentru o perioada de 562.5μs care
marcheaza sfarsitul mesajului transmis.
Figura 4.7
http://techdocs.altium.com/disp lay/FPGA/NEC+Infrared+Transmission+Protocol
O transmisie compate are o perioada de 67,5ms nefiind luata in considerare secventa de
incheiere.
Cand o tasta de la telecomanda este tinuta apasat un cod de repetare este emis la o
perioada de 40ms de la secv enta initiala a tastei. In componenta codului gasim:
– o perioada de 9ms semnalul sta in ‘1’
– o perioada de 2,5ms semnalul sta in ‘0’
– o secventa de pulsuri la frecventa de 38kHz pentru o perioada de 562.5μs care
marcheaza sfarsitul mesajului transmis
Figura 4.7
http://techdocs.altium.com/display/FPGA/NEC+Infrared+Transmission+Protocol
35
Decodarea semnalului IR se face cu receptor IR de tip TSOP1738. Diagram bloc
interna a receptorului:
Figura 4.8
http://www.8051projects.info/threads/ir -transmission.657/page -2
Logica de functionare :
La captarea semnalului IR fotodioda transmite un sem nal blocului de intrare ce
urmarește semnalul transmis de telecomandă. Semnalul primit este amplificat de etajul AGC si
trecut printr -un filtru trece banda cu frecvența centrată pe 38KHz apoi fiind demodulat.
Demodulatorul și amplificatorul de semnal siind controlate de un circuit de control comandat de
filtru trece bandă. T renzistorul din etajul final este comandat în baza doar la prezența semnalului
fiind tranzistor de tip NPN cand tranzistorul conduce ieșirea stă în ‘0’ logic, iar in lipsa comenzii
avem ‘1’ logic la ieșire. ca in figura urmatoare:
36
Figura 4.9
http://www.8051projects.info/threads/ir -transmission.657/page -2
37
Capitolul 5
Descrierea funcționarii s istemului de alarmă
Unitatea centrală este cea mai importantă parte a sitemului de alarmă. Pentru realizarea
acestui sistem am folosit un microcontroller PIC18F4520.
În realizarea acestui proiect protocoalele de comunicare folosite sunt:
– I2C folosit pen tru citirea și scrierea unui RTC (Real Time Clock)
– UART pentru comunicarea serială cu modulul GSM SIM900A
– NEC citirea telecomenzii
– Pentru afișarea stărilor sistemului pe afișaj LCD alphanumeric
Principiul de funcționare:
Senzorii PIR sunt montați într -o încăpere, cât timp ei nu detectează mișcare la ieșirea lor
avem “0” logic.
Microcontrolerul din unitatea centrală este configurat cu întrerupere la schimbarea stării a
portului B. Ca și măsura de protecție am activat rezistențele pull -up a portului B, pr otecția consta
în cazul în care se încearcă înlăturarea senzorilor din sistem, rezistențele asigură un semnal 1
logic care ar declanșa alarma. Dacă pinii de intrare a portul unde sunt conectați senzorii sunt în
“0” rezulta că senzorii sunt în regulă și nu au depistat nici o problemă, altfel alarma se
declanșează.
La punerea în funcțiune, alarma este oprită urmând a fi activată la nevoie. La activare se
acorda un timp de armare de 20 secunde, timp suficient pentru a ieși din raza de acțiune a
sistemului. În cazul detectării unui eveniment de senzori sistemul alocă un timp de 20 secunde
pentru introducerea codului de dezactivare din telecomanda.
38
Schimbarea codului de dezactivare fiind posibile din meniul principal fără a fi nevoie să
se reprogameze microcontr olerul după preferința utilizatorului. La activare, sistemul transmite un
mesaj scris, către numărul de telefon aflat în memorie cu textul corespunzător stării alarmei și
ora la care este activată.
La dezarmarea alarmei mesajul trimis este adecvat situație i doar în cazul scurgerii celor
20 secunde fără introducerea parolei. Sistemul merge configurat să citească mesajele scrise primate de modulul GSM și în funcție de mesajele care pot fi predefinite, sistemul să ia decizii executabile, de exemplu oprire, por nire, dezactivare etc. La acest tip de sistem de alarmă se pot
conecta diferiți senzori pentru alarmăre în caz de: detecție fum, detecție gaz, detecție apa etc… Acești senzori sunt foarte folositori și pot reduce la minim producerea unui eveniment care p oate
fi fatal locuinței. Ca și element de execuție am folosit un modul cu 8 releie comandat cu tranzistori de tip PNP. Folosind mai multe releie, configurările pot fi multiple. Pe un releu se
pune o sirenă care avertizează detecția unui eveniment neaștepta t, pe alt releu oprirea alimentarii
cu energie în cazul detecției de gaz pentru a evita o explozie. Și multe alte aplicații utile. Limita
acestor aplicații fiind felul în care gândește omul.
Microcontrolerul folosit este un microcontroler pe 8 biți care se mulează perfect unui
sistem de alarmă, datorită posibilităților extinse de comunicare cu dispozitivele externe (senzori,
releie, afișaj, tastaturi, dispozitive analogice și digitale ).
PIC18f4520 se bucura de o frecvența de lucru mare până la max 40MHz, 32768 bytes
memorie program, 16384 instrucțiuni scrise în memorie program, 20 de surse de întrerupere, 5 porturi, 4 timere, 2 module CCP (compare/capture/pwm), comunicații seriala MSSP, USART,comunicații paralele PSP, 13 CAN pe rezoluția de 10 bit.
Oră și dată sunt citite de pe circuitul RTC DS1307Z permanent și afișate pe LCD, în plus
se permite reglarea orei și datei direct din telecomandă prin protocolul I2C. La fiecare fiecare activare și dezactivare sunt memorate oră și data activării și dezactivării în doi vectori, ale căror
valori sunt scrise în mesajul trimis pe telefonul mobil.
Există posibilitatea ca prin trimiterea unui mesaj scris cu textul “stare” de la numărul
înregistrat în memorie sistemul răspunde cu mesaj scris care conține starea corespu nzătoare
sistemului și ora de activare sau dezactivare a acestuia.
39
5.1 Citirea telecomenzii
Urmărind modul de funcționare a protocolului NEC prezentat la capitolul 4, am realizat
citirea telecomenzii folosite în proiect patru pași.
– definirea variabilelor și constantelor
– configurări ale registrelor microcontrolerului
– captura semnalului dat de receptorul IR
– prelucrarea rezultatelor
În acest proiect citirea telecomenzii se face cu ajutorul blocurilor hardware TIMER1,
TIMER3, CCP1, CCP2 interne a microcontro lerului pic 18F4520, unde TIMER1 sursa de clock
pentru CCP1 și TIMER3 sursa de clock pentru CCP2. TIMER1 și TIMER3 sunt două timere pe
16biți format din câte doi octeți partea high și partea low. Timer1 este setat pe modul timer, la
fiecare tact a microcon trolerului valoarea numerică din timer este incrementată. La recepționarea
de semnal de la senzorul TSOP1738 modul CCP1 cere întrerupere microcontrolerului, unde
resetează valoarea existentă în timer. Pe următorul front CCP2 ia valoarea din timer1 și o introduce într -o variabilă și resetează timer3. În acest fel valoarea din timer1 înmulțita cu
perioada de lucru a microcontrolerului 0,1us dă perioada de 1 logic a semnalului și valoarea din timer3 înmulțita cu perioada de 0,1us dă perioada de 0 logic a semna lului.
Schema blocurilor interne si principiul de functionare este cel din imaginea urmatoare:
Figura 5.1
40
Frecve nța de lucru a microcontrorelui este FOSC/4 = 40MHz/4 = 10MHz de unde rezultă că
T=(1/F) =>T=(1/10)MHz=0.1 μs
Definirea variabilelor si co nstantelor folosite in program:
#define START 6325 //se defineste secventa de start
#define LOGIC_ONE 2813 // se defineste ‘1’logic (0.1 μs
*2813*4=2,250ms)
#define LOGIC_ZERO 1400 // se defineste ‘0’logic (0.1 μs
*1400*4=1,20ms) #define REPEAT 2810 // se defineste ‘REPEAT’ (0.1 μs *
2810*4=2.5ms)
Configurari ale registrelor microcontrolerului:
Aceasta parte contine configurari de register si porturi ale microcontrolerui necesara functionarii
partilor hardware falosite.
Captura semnalului dat de receptorul IR:
La fiecare intrerupere data de registrul PIE.CCPIF se citesc valorile aflate in registrele CCPR1L
si CCPR1H care se compara cu valorile definite anterior. In CCPR1L se gasesc datele TMR1L si in CCPR1H se gasesc datele TMR1H.
ir_time=
CCPR1L H+CCPR1L;
if(START) ir_pntr++;
if((ir_time<LOGIC_ZERO_MAX)&&(ir_time>LOGIC_ZERO_MIN))
ir_buff[ir_pntr]='0';
elseif((ir_time<LOGIC_ONE_MAX)&&(ir_time>LOGIC_ONE_MIN))ir_buff[
ir_pntr]='1';
41
else
if((ir_time<REPEAT_MAX)&&(ir_time>REPEAT_MIN))ir_buff[0]='R';
else
if((ir_time<START_MAX)&&(ir_time>START_MIN))F_FRAMESTART_ON();
secventa de mai sus se rep etă de 32 de ori pentru a memora fiecare bit in octetul corespunzator .
byte0 = adresa ,byte1=adresa negata byte2=cod, byte3=cod negat
Prelucrarea rezultatelor: In partea de in terpretare se iau cei patru octeț i unde sunt introduse rezultatele conversiei
și se verific ă daca codul transmis este recep ționat corect dup ă cum urmaz ă:
if((byte0 == ~byte1)&&(byte2 == ~byte3)) //
dacă este adevărat dată este validă se convarteste în hex a z eci m al d oa r b y te 2 (c od b u t on ) ș i s e
memorează într -o variabilă, care este folosită ulterior în diferite aplicații.
În acest fel se extrage câte un cod în hexazecimal pentru fiecare testa apăsată. Codurile
sunt unice și fiecare tastă are o funcție bine de finită în programul sistemului de alarmă.
5.2 Citirea și scrierea RTC
RTC folosit în realizarea proiectului este DS1307Z. Pentru a realiza comunicarea dintre
microcontroler și circuitul RTC folosim interfața serială I2C explicată la capitolul 4.1.
Pentru a putea folosi interfața I2C a microcontrolerului am urmărit pașii următori:
– configurarea microcontrolerului
– crearea de secvențe folosite în comunicarea I2C
– apelarea DS1307
– citirea datelor de pe RTC
– scrierea datelor în RTC
– prelucrearea datelor obținute
Pentru configurarea microcontrolerului în modul I2C se scriu în registrele de configurare
găsite în datasheet -ul microcontrolerului
42
SSPADD setează frecvența de clock a interfeței
SSPCON1 setează tipul de comunicare I2C ca fiind master
SSPSTATbi ts.SMP=1 setează modul I2C ca fiind modul standard
ADCON1 =0x FF; declară ieșirile porturile care conțin CAN de tip digital
Secvențele de interes în comunicarea I2C sunt:
– secvența de start
– secvența de restart
– secvența de apelare dispozitiv
– secvența de scriere
– secvența de citire
– secvența de stop
Secvențele definite anterior sunt create prin scrierea registrelor microcontrolerelor in funcție
de secvența dorit ă prin definirea de mici funcții create în acest scop. Registru care conțin e
secvențele interfeței I2C este SSPCON2 (din datasheet -ul pic 18f4520)
Secvența de start:
void i2c_start(void) //inițializare secvența de start
{
PIR1bits.SSPIF=0;//se resetează bit de intrerupere PIR1bits.SSPIF
SSPCON2bits.SEN=1;// este inițiat ă condi ția de start la pinii SDA și SCL a
microcontrolerului
while(PIR1bits.SSPIF==0);//se menține pâna se execută secvența
return;
}
Secvența de stop:
void i2c_stop(void) // inițializare secvența de stop.
{
PIR1bits.SSPIF=0;// se resetează bit de intrerupere PIR1bits.SSPIF
SSPCON2bits.PEN=1;//activare secvența de stop
while(PIR1bits.SSPIF==0);
return; }
43
Celelalte secvențe sunt srise în mod similar cu cele două prezentate anterior.
Adresa unică a RTC este 1101000x unde x poate fi 1 pentru citire din RTC sau 0 pentru
scriere în RT C.
Funcția de scriere in regiștrii RTC are următoarea formă și execută comenzile descrise în
comentarii:
void set_time(unsigned int address, unsigned int x) //
sets time
{
i2c_start(); //secvența de start
i2c_write(0b11010000);// se introduce adresa dispozitivului RTC
i2c_write(address);// adresa la care se face scrierea
i2c_write(x); //valoarea care este scrisă la adresa anterioară i2c_stop();//secvența de stop
return;
}
Figura 5.2
Datasheet catalog DS1307Z
Pentru scrier e a d a t e l o r i n D S 1 3 0 7 Z n e f o l o s i m d e t a b e l u l u r m ă t o r c u c o n ț i n u t u l
regiștrilor si adresele la care se află:
44
Figura 5.3
http://www.DatasheetCatalog.com/
Știind adresele la care se află registrele de co nfigurare am creat o funcție cu doua argumente
Primul argument este adresa la care se dorește scrierea și cel deal doilea valoarea care se dorește
introdusă. De exemplu
set_time(0x00,0x00);//scrie la adresa 0x00 valoarea 00 reseteaza
secundele set_time(0x01,0x21);//scrie la adresa 0x01(minutele) 21 set_time(0x02,0x16);// scrie la adresa 0x01(ora) 16
rezultatul scris în RTC este ora:minute:secunde 16:21:00
Data / Luna/ Anul/ I registrul de control se setează în mod similar cu funcția
set_time(adresa,valoare).
Pentru a citirea datelor din DS1307Z am folosit secvența urmatoare de citire:
Figura 5.4
http://www.DatasheetCatalog.com/
45
Funcția de citire este urmatoarea și are semnificațiile din comentarii:
unsigned int get_time(unsigned int address) // citește timp
{
unsigned int data;
i2c_start();//secvență de start
i2c_write(0b11010000);// adresa dispozitivului
i2c_write(address);//adresa de unde are loc c itirea(secunde /minute /ora /data /
luna/zi /an
i2c_restart();//restart i2c
i2c_write(0b11010001);//adresa dispozitivului în mod citire
SSPCON2bits.ACKDT=1;//bitul de acceptare
data=i2c_read();//valoarea citită este introdusă în variabila data
i2c_stop();// secvența d e stop
return (data);//returnează data
}
Prelucrarea datelor obținute
În funcție de registrele citite, descrise la punctul anterior, prelucrarea datelor se face
individual. Pentru a prelucra secundele se ia variabila data returnată de funcția get_time( 0x00) și
se execută urmatoarea secvența:
void decode(unsigned int data)
{
zeci=data>>4;//prin shiftare cu 4 pozitii se extrage zecile de secunde
unitați=data&0x0F;// facând and cu 0x0F se extrage unitațile
return;
}
Valorile citite sunt m emorate intr -un vector și afișate pa LCD.
Restul registre lor se prelucrează în mod similar.
46
Verificarea programului si a funcționarii corecte a codului a fost facută cu simulatorul
Proteus conform imaginii urmatoare:
Figura 5.5
5.3 Afișarea pe LCD
Partea de afișare a fost realizată cu displayul LCD Hitachi HD44780. Configurarea
acestuia și comunicarea cu microcontrelerul a fost făcut ă conform funcționarii descrise la
capitolul 3.
Realizarea afișării pe LCD sa făcut urmân d urmatorii pași:
– configurarea porturilor microcontrolerului
– crearea funcției de inițializare și comandă LCD
– crearea funcției de scriere caracter
– crearea funcției de scriere unui șir de caractere
47
Porturile microcontrolerului se configurează prin scrierea în registrele T RIS și PORT a
microcontrolerului. Registrele TRIS specifică tipul portului , dacă este port de intrare sau daca
este port de ieșire. Registrele PORT specifică starea portului dacă este port de ieșire, stările
porturilor fiind zero logic sau unu logic.
Func ția de inițializare și comandă a acestui tip de display este facută în doi pași:
Primul pas a fost declararea unei structuri, elementele structurii fiind 8 biți corespunzători
fiecarei linii de comandă a LCD, iar pasul doi prin realizarea funcției care ar e ca și argument
diferite coduri de comandă știute din descrierea funcționarii de la capitolul 3.
typedef struct
{
unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1;
unsigned char b7:1; }octet;
Void cmd_LCD(char comanda)
//
{
mychar cmd;
cmd.val = comanda; //atributul comanda este alocat biților din structurâ
RS = 0; //comanda de scriere
D7 = cmd.bits.b7; D6 = cmd.bits.b6; D5 = cmd.bits.b5; D4 =
cmd.bits.b4; //scrierea a câte un i bit
I_E(); //semnalul de autorizare display
Delay100TCYx(20);//200us timp de intârziere obligatoriu conform funcționarii LCD
48
D7 = cmd.bits.b3; D6 = cmd.bits.b2; D5 = cmd.bits.b1; D4 =
cmd.bits.b0; //
I_E(); (); //semnalul de autorizare display
//
Delay1KTCYx(20);//2ms timp de întârziere obligatoriu confor m funcționarii LCD
}
Funcția pentru scrierea caracterelor folosește aceeași structură definită mai sus și aceiași
metodă de trimitere a datelor displayu -lui pentru afișarea caracterelor. La afișarea unui cuvânt se
ia câte u n caracter din componența cuvântului se afișează si se incrementează pozitia cursorului
pentru a afișa urmatorul caracter.
Simularea rezultată acestei etape este urmatoarea:
Figura 5.6
5.4 Trimiterea mesajelor scrise
Pentru trimiterea mesajelor de pe modulul GSM SIM900A am folosit comunicarea
serial ă UART folosind libr ăriile definite in interiorul compilatorului MPLAB C18 usart.h .
Secvențele de comenzi care le cere modulul GSM pentru trimiterea de mesaj text sunt
urmatoarele:
AT // atenție coma ndă
AT+CMGF=1//setează modul gsm în mod text
49
AT// atenție comandă
AT+CMGS=”+40726166xxx” //trimitere sms la nr de telefon
>mesaj text (ctrl+z) // raspunsul modulului gsm și trimiterea mesajului la combinația de
taste ctrl+z sau trimiterea codului ASCII corespunz ător 26 .
Realizarea acetei parți a fost facută cu declararea de vectori unde sunt stocate toate
valorile ASCII a caracterelor necesare comenzilor în ordinea corespunzătoare. Trimiterea datelor
prin USART are loc intr -o bucl ă for funcție de numarul de caractere trimis.
unsigned char at[]={'A','T'};
unsigned char mod_text[]={'A','T','+','C','M','G','F','=','1'};
unsigned char
sms_send[]={'A','T','+','C','M','G','S','=','"','+','4','0','7','2','6','1','6','6','x','x','x','"'};
unsigned char mesaj_on[]={'a','l','a','r','m','a',' ','a','
','f','o','s','t',' ','a','c','t','i','v','a','t','a'};
unsigned char mesaj_off[]={'a','l','a','r','m','a',' ','a',' ','f','o','s','t',' ','d','e','z','a','c','t','i','v','a','t','a'}; unsigned char terminal=0x1A;
void send_sms()//funcție de trimitere sms { for(i=0;i<2;i++)//trimiterea secventei atenție comandă { WriteUSART (at[i]); while(BusyUSART()); if(i==1) WriteUSART (13); }
Delay10KTCYx(250);//250ms timp de întarziere obligatorio pentru respunsul
modulului
for(i=0;i<9;i++)//setarea modulului pe mod text
50
{
WriteUSART (mod_text[i]); while(BusyUSART()); if(i==8) WriteUSART (13); } Delay10KTCYx(250);//250ms for(i=0;i<22;i++)
{WriteUSART (sms_send[i]);//trimiterea de sms la numar de tel din vector
while(BusyUSART());
if(i==21) WriteUSART (13); while(BusyUSART()); } for(i=0;i<25;i++) {WriteUSART (mesaj_off[i]); //sms cu mesajul text while(BusyUSART());
if(i==24)
WriteUSART (26);
while(BusyUSART());
}
51
Simularea rezultată acestei etape este urmatoarea:
Figura 5.7
5.5 Comanda releielor este realizată prin setarea pinilor microcontrolerului în zero logic
la trecerea celor 20 de secunde de la dezarmare în cazul in care nu a fost introdusă parola de
dezactivare, și la oprirea alarmei din telecomandă în cazul în carea ea este pornită.
5.6 Metode de redundanță si back -up a sistemului de alarmă folosit :
– sistemele trebuiesc prevă zute cu acumulatori pentru a putea fi menț inut activ si in cazul
in care apar defecțiuni la instalația electrică.
– Senzorii trebuie conectaț i in așa fel incât atunci când comunicarea nu mai există intre
senzor și unitate, alarma sa pornească dacă ea este activată.
– Sa nu poată fi dezactivată decât de propritar sau persoane care sunt autorizație .
5.7 Realizarea parții practice:
În realizarea parții practice, realizarea layo ut-ului a fost facuta în programul Dip Trace.
Figura 5.8
52
PCB bottom
Figura 5.9
PCB Top
Figura 5.10
53
Sistem de alarmă ( circuit complet )
Figura 5,11
54
CONCLUZII
Sistemul de alarma realizat este fu ncțional și lucreaza foarte bine în condițiile testate
conform simularilor efectuate. S i s tem ul e s te c on c e p u t i n i ți al p en tru 3 s e n z ori P IR d a r p oa te fi
expandat prin utilizarea unui circuit cu porți logice OR. Exista posibilitatea de implementare a
recunoaș terii senzorului care a activat intreruperea și în mesajul trimis pe telefon s ă se specifice
și locul unde a fost detectată mișcare. Senzorii P IR a u s e n si bi l i ta te a și ti m p ul câ t s ta u î n u n u
logic reglabil. Recomandat ar fi ca perioada de stat în unu logic a senzorului PIR sa fie cât mai
mică deoarece microcontrolerul are nevoie doar de schimbarea stării pinilor portului B pentru face intreruperea. Dacă timpul de stat în unu logic ar fi mare, la armare dupa expirarea timpului
de 20 de secunde alarma ar cere cod de dezactivare pe motiv că senzorul sesizase mișcare.
La depașirea de scală a orei minutelor sau secundelor, RTC se blochează fiind necesară
resetarea acestuia.
Placa cu releie trebuie alimantată separat deoarece are un consm de energie mult mai
mare decât cel al unitații centrale, iar tensiunea microcontrolerul PIC18F4520 daca scade sub
4,8v nu mai lucrează corect la frecvența de 40MHz. Alimentarea modulului GSM merge facută
de pe placa unitații centrale cu condiția ca alimentarea să scoată un curen t de minim 1A.
Avantajul folosirii microcontrolerelor constă in posibilitatea de upgrade a sistemului de
alarmă cu diferiți senzori în funcție de necesitate, posibilitatea uni număr mare de reprogamări,
dimensiuni reduse a unității centrale, are un consum mic de energie, arhitectura internă permite
intrarea în starea de veghe a microcontrolerului în cazul în care nu sunt evenimente.
55
Anexă
#include <p18f4520.h>
#include <delays.h> #include<usart.h>
#include "telecom.h"
#include "main.h" unsigned char menu=1; unsigned char variabila=0; #pragma config OSC=HS, FCMEN=ON, WDT=OFF, IESO=OFF, XINST=OFF, LVP=OFF #include "i2c.c" #include "ds_1307.c" #include "lcd.c" #include "clock.c" #include "lm_75.c"
#include "telecom.c" void send_sms(); #include "900a.c" #include "menu.c" void init_mcu(); void init_mcu() { TRISA=0x00;
TRISC=0x18;
TRISB=0xF0;
TRISD=0x00;
PORTD=0x00;
56
PORTB=0x00;
PORTC=0;
PORTA=0;
ADCON1=0x0F;
TRISCbits.RC2 = 1;
CCP1CON = 0x05; //capture mode every rising edge
T3CONbits.T3CCP2 = 0;// | Timer1 is assigned to CCP1,
Timer3 is assigned to CCP2
T3CONbits.T3CCP1 = 1;// | Timer1 is assigned to CCP1, Timer3 is assigned to CCP2
T1CON = 0x31;//prescaler 1:4 B0 //0x31
PIE1bits.TMR1IE = 1;
IPR1bits.TMR1IP = 0;
PIE1bits.CCP1IE = 1;
IPR1bits.CCP1IP = 1;
RCONbits.IPEN = 1;// daca ipen este 0 GIEL trebuie sa fie 1
INTCONbits.GIEH = 1;
INTCONbits.GIEL = 1;
INTCONbits.RBIE=0;
INTCONbits.RBIF=0;
INTCON2bits.RBIP=0; INTCON2bits.RBPU=0; ir_buff[0]='N';
ir_buff[33]='\n';
ir_buff[34]='\r';
ir_buff[35]=0x00;
TRISCbits.RC6=1;
TRISCbits.RC7=0;
57
OpenUSART(USART_TX_INT_OFF & USART_RX_INT_OFF &
USART_ASYNCH_MODE & USART_EIGHT_BIT & USART_BRGH_LOW, 64); //10->9765@10MHz PORTCbits.RC0=1; } void main (void) { init_mcu(); init_i2c(); init_LCD(); while(1)
{
citeste_telecom();
display(); alarma_on_off();
if(menu==0)
{
afisare_ora();
}
if(menu==1)
meniu_reglare_ora();
if(menu==2) {
afisare_alarma(); }
if(menu==3)
{
citeste_temperatura();
}
}
58
}
//================================================= High ISR Vector #pragma code high_vector=0x08 void interrupt_at_high_vector() { _asm GOTO high_isr _endasm } #pragma code /* return to the default code section */ //========================= Low ISR Vector #pragma code low_vector=0x18 void interrupt_at_low_vector(void)
{
_asm GOTO low_isr _endasm } #pragma code
//========================= High ISR #pragma interrupt high_isr void high_isr() { telecom_intr(); } //========================= LOW ISR #pragma interruptlow low_isr void low_isr (void) { if(PIR1bits.TMR1IF==1) {
time_cnt++;
if(time_cnt>=2)F_TIMEOUT_ON();
59
PIR1bits.TMR1IF=0;
}
if((INTCONbits.RBIF==1)&(INTCONbits.RBIE==1))
{
if(PORTBbits.RB5==1)
{cmd_LCD(1);
menu=2;
dezarmare_alarma=1;
memorare_dezactivare[0]=zeci_ora();
memorare_dezactivare[1]=unit_ora();
memorare_dezactivare[2]=zeci_min();
memorare_dezactivare[3]=unit_min();
memorare_dezactivare[4]=zeci_sec();
memorare_dezactivare[5]=unit_sec();
memorare_dezactivare[6]=zeci_data();
memorare_dezactivare[7]=unit_data();
INTCONbits.RBIE=0;
}
PORTBbits.RB4=0;
PORTBbits.RB5=0;
PORTBbits.RB6=0;
PORTBbits.RB7=0;
INTCONbits.RBIF=0;
}
}
60
telecom.c
//*****************************************
typedef struct
{
unsigned char lbyte;
unsigned char hbyte;
}twochr;
typedef union
{
twochr chrval;
unsigned int intval;
}group2b;
typedef struct {
unsigned char byte0; //low byte
unsigned char byte1; unsigned char byte2;
unsigned char byte3; // high byte
}fourchar; typedef union
{
fourchar chrval;
unsigned long longval;
}group4b;
group2b tmrdata; group4b irdata;
61
void telecom_intr() { if(PIR1bits.CCP1IF==1)
{
tmrdata.chrval.lbyte = CCPR1L;
tmrdata.chrval.hbyte = CCPR1H;
ir_new_val = tmrdata.intval;
ir_time_sl = (short long)ir_new_val – (short
long)ir_old_val;
if(ir_time_sl < 0)ir_time=ir_time+65536;
ir_time = ir_time_sl;
if(F_FRAMESTART())ir_pntr++;
if((ir_time<LOGIC_ZERO_MAX)&&(ir_time>LOGIC_ZERO_MIN))ir_bu
ff[ir_pntr]='0'; else
if((ir_time<LOGIC_ONE_MAX)&&(ir_time>LOGIC_ONE_MIN))ir_buff[ir_pntr]='1'; else
if((ir_time<REPEAT_MAX)&&(ir_time>REPEAT_MIN))ir_buff[0]='R'; else
if((ir_time<START_MAX)&&(ir_time>START_MIN))F_FRAMESTART_ON(); else{
F_FRAMESTART_OFF();
ir_pntr=0;
}
if(ir_pntr==32)
62
{
F_DATAREADY_ON();
F_FRAMESTART_OFF();
ir_pntr=0;
}
ir_old_val=ir_new_val;
time_cnt=0;
PIR1bits.CCP1IF=0;
}
} void inttostr(unsigned int number,char *buff) {
buff[0] = (number / 10000)+48;
buff[1] = (number / 1000) % 10 +48;
buff[2] = (number / 100) % 10 + 48; buff[3] = (number / 10) % 10 + 48; buff[4] = number % 10 + 48; } void chrtohex(unsigned char chr, char *buff) { unsigned char hexvalue[16]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'}; unsigned char temp; temp=chr&0x0F; buff[3]=hexvalue[temp]; temp=chr>>4&0x0F; buff[2]=hexvalue[temp]; }
63
void citeste_telecom() { if(F_DATAREADY())
{
PIE1bits.CCP1IE = 0;//inhib intreruperea de la ccp
pentru a preveni suprascrierea codului daca acesta nu a fost afisat contor=0;
irdata.longval = 0;
for(index=0x80000000;index>0;index /=2)
{
contor++;
if(ir_buff[contor]=='1') irdata.longval |=
index; }
if((irdata.chrval.byte0 ==
~irdata.chrval.byte1)&&(irdata.chrval.byte2 == ~irdata.chrval.byte3)) //true = data este valida {
chrtohex(irdata.chrval.byte1,displaybuff);
switch(irdata.chrval.byte1)
{
case 0x62: displaybuff[8] =
'U';test='U' ;if(menu==1)up++ ;break; case 0x22: displaybuff[8] =
'L';test='L';menu–;break; case 0x02: displaybuff[8] =
'K';test='K';
64
if(menu==1)//reglare ora
set_time(val,up);
if(menu==2)// la apasare 'ok' se
memoreaza ora si se activare alarma
{
armare_alarma=1;
memorare_activare[0]=zeci_ora();
memorare_activare[1]=unit_ora();
memorare_activare[2]=zeci_min();
memorare_activare[3]=unit_min();
memorare_activare[4]=zeci_sec();
memorare_activare[5]=unit_sec();
memorare_activare[6]=zeci_data();
memorare_activare[7]=unit_data();
}
break;
case 0xC2: displaybuff[8] =
'R';test='R';menu++;break; case 0xA8: displaybuff[8] =
'D';test='D';if(menu==1)up–;break; case 0x68: displaybuff[8] =
'1';test='1';if(menu==1)val=0x00;up=0; break; case 0x98: displaybuff[8] =
'2';test='2';if(menu==1)val=0x01;up=0; break; case 0xB0: displaybuff[8] =
'3';test='3';if(menu==1)val=0x02;up=0; break; case 0x30: displaybuff[8] =
'4';test='4';if(menu==1)val=0x03;up=1; break; case 0x18: displaybuff[8] =
'5';test='5';if(menu==1)val=0x04;up=0; break;
65
case 0x7A: displaybuff[8] =
'6';test='6';if(menu==1)val=0x05;up=0; break;
case 0x10: displaybuff[8] =
'7';test='7';if(menu==1)val=0x06;up=0; break; case 0x38: displaybuff[8] =
'8';test='8'; break; case 0x5A: displaybuff[8] =
'9';test='9'; break; case 0x4A: displaybuff[8] =
'0';test='0';if(menu==2){armare_alarma=0;alarma_on=0;PORTCbits.RC0=1;dezarmare_alarma=0;INTCONbits.RBIE=0;} break; case 0x42: displaybuff[8] =
'*';test='*'; break;
case 0x52: displaybuff[8] =
'#';test='#'; break;
}
cmd_LCD(1);
if(menu>3)menu=0; }
F_DATAREADY_OFF();
PIE1bits.CCP1IE = 1;// reactivam intreruperea
}
}
66
menu.c
void meniu_reglare_ora() { //TRANSFORMA DIN HEX IN ZECIMALCAND INCREMENTEZ UP CAND UP==A(10) if(up==0x0A)up=0x10; if(up==0x1A)up=0x20; if(up==0x2A)up=0x30; if(up==0x3A)up=0x40; if(up==0x4A)up=0x50; if(up==0x5A)up=0x00; buf[0]=(up>>4)+48;; buf[1]=(up&0x0F)+48; buf[3]=val+48;
cmd_LCD(128); scrie_rom_string_LCD((const rom far char *)"<– REG ORA –>"); cmd_LCD(192); switch (val)
{
case 0:scrie_rom_string_LCD((const rom far char *)"secunde
");break; case 1:scrie_rom_string_LCD((const rom far char *)"minute
");break; case 2:scrie_rom_string_LCD((const rom far char *)"ora
");break; case 3:scrie_rom_string_LCD((const rom far char
*)"ziua/sapt ");break; case 4:scrie_rom_string_LCD((const rom far char *)"zi
");break;
67
case 5:scrie_rom_string_LCD((const rom far char *)"luna
");break;
case 6:scrie_rom_string_LCD((const rom far char *)"an
");break; }
if(val==3) {
if(up>7)up=1;
switch((up&0x0F))
{
case 1: scrie_rom_string_LCD((const rom far char *) "Sun");
break; case 2: scrie_rom_string_LCD((const rom far char *) "Mon");
break; case 3: scrie_rom_string_LCD((const rom far char *) "Tue");
break; case 4: scrie_rom_string_LCD((const rom far char *) "Wed");
break; case 5: scrie_rom_string_LCD((const rom far char *) "Thu");
break; case 6: scrie_rom_string_LCD((const rom far char *) "Fri");
break; case 7: scrie_rom_string_LCD((const rom far char *) "Sat");
break; } }
else
{
scrie_caracter_LCD(buf[0]);//afiseaza valoarea care trebuie
introdusa(zecimi) scrie_caracter_LCD(buf[1]);//afiseaza pa lcd unitati
}
68
} //////*********************MENU 3*********************///////////// void alarma_on_off() {
if(armare_alarma==1)
{
if(memorare_activare[4]<4)
zeci_time_armare=memorare_activare[4]+2;
if((memorare_activare[4]>=4)&(memorare_activare[4]<5))
zeci_time_armare=0;
if(memorare_activare[4]>=5)
zeci_time_armare=1;
if(zeci_time_armare==zeci_sec())
{
INTCONbits.RBIE=1;
armare_alarma=0;
variabila=0;
cmd_LCD(1);
menu=0;
alarma_on=1;
send_sms();
}
}
if(dezarmare_alarma==1) {
if(memorare_dezactivare[4]<4)
69
zeci_time_dezarmare = memorare_dezactivare[4]+2;
if((memorare_dezactivare[4]>=4)&(memorare_dezactivare[4]<5)
)
zeci_time_dezarmare = 0;
if(memorare_dezactivare[4]>=5)
zeci_time_dezarmare=1;
if((zeci_time_dezarmare==zeci_sec())&(alarma_on==1))
{ menu=0;
cmd_LCD(1);
PORTCbits.RC0=0;
dezarmare_alarma=0;
variabila=1;
send_sms();
}
}
}
//////////////////////////////////////////////////////////////////// void afisare_alarma() { if((armare_alarma==1)&(alarma_on==0))
{
cmd_LCD(192);
scrie_rom_string_LCD((const rom far char *) "Armare in
20sec"); }
70
if((dezarmare_alarma==1)&(INTCONbits.RBIE==0)) { cmd_LCD(128);
scrie_rom_string_LCD((const rom far char *) "PAROLA
20-SEC"); cmd_LCD(192); scrie_rom_string_LCD((const rom far char *)
"DEZARMARE"); }
if(INTCONbits.RBIE==1)
{
cmd_LCD(128);
scrie_rom_string_LCD((const rom far char *) "Alarma
ON"); }
if((INTCONbits.RBIE==0)&(dezarmare_alarma==0)&(PORTCbits.RC
0==1))
{
cmd_LCD(128);
scrie_rom_string_LCD((const rom far char *) "Alarma
OFF"); }
if((INTCONbits.RBIE==0)&(dezarmare_alarma==0)&(PORTCbits.RC
0==0)) { cmd_LCD(128);
scrie_rom_string_LCD((const rom far char *) "SUNA
BAAA"); }
}
71
////////////////////////////////////////////////////////////////
/////////////////// typedef struct { unsigned char b0:1; unsigned char b1:1; unsigned char b2:1; unsigned char b3:1; unsigned char b4:1; unsigned char b5:1; unsigned char b6:1; unsigned char b7:1; }octet;
typedef union
{ char val; octet bits;
}mychar; //////////////////////////////////////////////////////////////////////////////////
void cmd_ LCD(char comanda)
//
{ mychar cmd; cmd.val = comanda;
RW = 0; //scriu
//
RS = 0; //comanda
//
72
D7 = cmd.bits.b7; D6 = cmd.bits.b6; D5 = cmd.bits.b5; D4 =
cmd.bits.b4; //
I_E();
//
Delay100TC Yx(20);//200us
//
D7 = cmd.bits.b3; D6 = cmd.bits.b2; D5 = cmd.bits.b1; D4 = cmd.bits.b0; //
I_E();
//
Delay1KTCYx(20); //2ms
//
}
//
////////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////////// //functia tipateste pe LCD un caracter si primeste ca parametru codul asci al // //acestuia. caracterul dorit se poate pune intre apostrofi ex 'x' //
void scrie_caracter_LCD(c har caracter)
//
{ mychar chr;
73
chr.val = caracter;
RW = 0; //scriu
//
//
RS = 1; //date
//
D7 = chr.bits.b7; D6 = chr.bits.b6; D5 = chr.bits.b5; D4 = chr.bits.b4; // I_E();
Delay100TCYx(20);//200us
//
D7 = chr.bits.b3; D6 = chr.bits.b2; D5 = chr.bits.b1; D4 = chr.bits.b0; //
I_E();
//
Delay100TCYx(20);//200us
//
}
//
////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////
void scrie_string_LCD(char *buffer)
//
{
//
while(*buffer) // Write data to LCD up to null //
74
{
//
scrie_caracter_LCD(*buffer); // Write character
to LCD //
buffer++; // Increment buffer
//
}
//
}
//
//////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////
////////////////// void scrie_rom_string_LCD(const rom far char *buffer) //
{
//
while(*buffer) // Write data to LCD up to null //
{
//
scrie_caracter_LCD(*buffer); // Write character to LCD //
buffer++; // Increment buffer
//
}
//
}
//
75
////////////////////////////////////////////////////////////////
////////////////// //////////////////////////////////////////////////////////////////////////////////
void init_LCD()
//
{
//
Delay1KTCYx(50);//50ms // intirziere obligatorie. 50ms suficient pt toate LCD // cmd_LCD(51);//Config1 Valorile pt Config1 si Config2 sunt constante // cmd_LCD(50);//Config2 acestea sunt 51 respectiv 50 (zecimal) //
cmd_LCD(40);//Function Sel
//
cmd_LCD(15);//DisplayControl
//
cmd_LCD(6); //Entry Mod Sel
//
cmd_LCD(1); //Clear Display cmd_LCD(12); //
}
//
76
unsigned char at[]={'A','T'}; unsigned char mod_text[]={'A','T','+','C','M','G','F','=','1'}; unsigned char sms_send[]={'A','T','+','C','M','G','S','=','"','+','4','0','7','2','6','1','6','6','7','9','6','"'}; unsigned char mesaj_on[]={'a','l','a','r','m','a',' ','a',' ','f','o','s','t',' ','a','c','t','i','v','a','t','a'}; unsigned char mesaj_off[]={'a','l','a','r','m','a',' ','a',' ','f','o','s','t',' ','d','e','z','a','c','t','i','v','a','t','a'}; unsigned char terminal=0x1A; unsigned char i;
unsigned char recive[5];
void send_sms() {
for(i=0;i<2;i++) { WriteUSART (at[i]); while(BusyUSART()); if(i==1) WriteUSART (13); } Delay10KTCYx(250);//250ms for(i=0;i<9;i++) { WriteUSART (mod_text[i]); while(BusyUSART());
77
if(i==8)
WriteUSART (13); } Delay10KTCYx(250);//250ms for(i=0;i<22;i++) { WriteUSART (sms_send[i]); while(BusyUSART()); if(i==21) WriteUSART (13); while(BusyUSART()); }
Delay10KTCYx(250);//250ms Delay10KTCYx(250);//250ms
if(variabila==0) {
for(i=0;i<6;i++) { WriteUSART (memorare_activare[i]+48);
while(BusyUSART()); if(i==1) { WriteUSART (':');
while(BusyUSART());
}
if(i==3)
{
78
WriteUSART (':');
while(BusyUSART());
}
if(i==5)
{ WriteUSART (' ');
while(BusyUSART());
}
} for(i=0;i<22;i++) { WriteUSART (mesaj_on[i]);
while(BusyUSART());
if(i==21)
WriteUSART (26);
while(BusyUSART());
}
} if(variabila==1) { for(i=0;i<25;i++) { WriteUSART (mesaj_off[i]);
while(BusyUSART());
if(i==24)
WriteUSART (26);
while(BusyUSART());
}
} } void init_i2c()
79
{
SSPADD=49; //set i2c clock
SSPCON1=0b00101000; //set i2c master SSPSTATbits.SMP=1; //select mode…standard selected ADCON1 =0x00; } void i2c_start(void) // Initiate a Start sequence { PIR1bits.SSPIF=0; SSPCON2bits.SEN=1; while(PIR1bits.SSPIF==0); return;
}
void i2c_restart(void) // Initiate a Restart sequence { PIR1bits.SSPIF=0;
SSPCON2bits.RSEN=1; while(PIR1bits.SSPIF==0); return; } void i2c_device(void) // device specification { PIR1bits.SSPIF=0; SSPBUF=0b11010000; while(PIR1bits.SSPIF==0); while(SSPCON2bits.ACKSTAT==1); return; } void i2c_write(unsigned int data) // Write data to slave. { PIR1bits.SSPIF=0;
80
SSPBUF=data;
while(PIR1bits.SSPIF==0); return; } void i2c_stop(void) //Initiate a Stop sequence. { PIR1bits.SSPIF=0; SSPCON2bits.PEN=1; while(PIR1bits.SSPIF==0); return; } unsigned int i2c_read(void) //Read data from I2C bus. {
unsigned int r;
PIR1bits.SSPIF=0; SSPCON2bits.RCEN=1; while(PIR1bits.SSPIF==0);
r=SSPBUF; PIR1bits.SSPIF=0; SSPCON2bits.ACKEN=1; while(PIR1bits.SSPIF==0); return r; }
81
//////////////////////////////////
clock.c ////////////////////////////////// void display(void) { time(get_time(0x02),get_time(0x01),get_time(0x00)); date(get_time(0x04),get_time(0x05),get_time(0x06)); day(get_time(3)); return; } void afisare_ora() {
cmd_LCD(128);
switch(zi_sapt())
{ case 1: scrie_rom_string_LCD((const rom far char *) "Sun
"); break; case 2: scrie_rom_string_LCD((const rom far char *) "Mon
"); break; case 3: scrie_rom_string_LCD((const rom far char *) "Tue
"); break; case 4: scrie_rom_string_LCD((const rom far char *) "Wed
"); break; case 5: scrie_rom_string_LCD((const rom far char *) "Thu
"); break; case 6: scrie_rom_string_LCD((const rom far char *) "Fri
"); break; case 7: scrie_rom_string_LCD((const rom far char *) "Sat
"); break; }
82
scrie_caracter_LCD(zeci_data()+48);
scrie_caracter_LCD(unit_data()+48);
scrie_caracter_LCD('/');
scrie_caracter_LCD(zeci_luna()+48);
scrie_caracter_LCD(unit_luna()+48);
scrie_caracter_LCD('/');
scrie_caracter_LCD(zeci_an()+48);
scrie_caracter_LCD(unit_an()+48);
cmd_LCD(192);
scrie_rom_string_LCD((const rom far char *) "TIME: ");
scrie_caracter_LCD(zeci_ora()+48);
scrie_caracter_LCD(unit_ora()+48);
scrie_caracter_LCD(':');
scrie_caracter_LCD(zeci_min()+48);
scrie_caracter_LCD(unit_min()+48);
scrie_caracter_LCD(':');
scrie_caracter_LCD(zeci_sec()+48);
scrie_caracter_LCD(unit_sec()+48);
} void time(unsigned int hours,unsigned int minutes,unsigned int seconds) { decode(hours); // sepatates the variable into highr and lower nibble if(tens>3) // To set AM or PM { if((tens == 6)|(tens == 7)) { an_zi_ora[1]=1 ; an_zi_ora[2]=1 ;
83
tens=tens&1;
an_zi_ora[3]= tens ; } else if((tens == 4)|(tens == 5)) { an_zi_ora[1]=1 ;
an_zi_ora[2]=0 ;
tens=tens&1; an_zi_ora[3]= tens ; }
} else
{
an_zi_ora[1]= 0 ;
an_zi_ora[3]= tens ; an_zi_ora[4]= units;
decode(minutes); an_zi_ora[5]= tens ; an_zi_ora[6]= units; decode(seconds); an_zi_ora[7]= tens ; an_zi_ora[8]= units; } } ////////////////////////////////////////////////////////////////////////////////////// void date(unsigned int date, unsigned int month,unsigned int year) {
84
decode(date); // sepatates the variable into highr
and lower nibble an_zi_ora[9]= tens ; an_zi_ora[10]= units; decode(month); // sepatates the variable into highr and lower nibble an_zi_ora[11]= tens ; an_zi_ora[12]= units; decode(year); // sepatates the variable into highr and lower nibble an_zi_ora[13]=tens;
an_zi_ora[14]=units;
} ////////////////////////////////////////////////////////////////
/////////////////////// void day(unsigned int disp) { an_zi_ora[15]=disp;
} ///////////////////////////////////////////////////////////////////////////////////////// void decode(unsigned int val) // Function sepatates the variable into highr and lower nibble { tens=val>>4; units=val&0x0F; return; }
85
//////////////////////////////////////////////
ds_1307.c //////////////////////////////////////////////// void reset_time() // resets the time-keeping register { i2c_start(); i2c_write(0b11010000); i2c_write(0x01); // sec i2c_write(0x05); // min i2c_write(0x01); // hrs i2c_write(0x01); // day i2c_write(0x01); // date
i2c_write(0x01); // month
i2c_write(0x01); // year i2c_write(0x02); // wave i2c_stop();
return; } unsigned int get_time(unsigned int address) // Gets time { unsigned int data; i2c_start(); i2c_write(0b11010000); i2c_write(address); i2c_restart(); i2c_write(0b11010001); SSPCON2bits.ACKDT=1; data=i2c_read(); i2c_stop(); return (data);
86
}
void set_time(unsigned int address, unsigned int x) // sets time { i2c_start(); i2c_write(0b11010000); i2c_write(address); i2c_write(x); i2c_stop(); return; }
main.h //////////////////////////////////////////////////////////////////////////////////
#define RS PORTDbits.RD0
#define RW PORTDbits.RD1
#define E PORTDbits.RD2
#define I_E() {PORTDbits.RD2 = 1; _asm nop _endasm PORTDbits.RD2 = 0;}
#define D7 PORTDbits.RD7
#define D6 PORTDbits.RD6
#define D5 PORTDbits.RD5
#define D4 PORTDbits.RD4 #define _12_24h() an_zi_ora[1] #define am_pm() an_zi_ora[2] #define zeci_ora() an_zi_ora[3] #define unit_ora() an_zi_ora[4] #define zeci_min() an_zi_ora[5]
87
#define unit_min() an_zi_ora[6]
#define zeci_sec() an_zi_ora[7] #define unit_sec() an_zi_ora[8] #define zeci_data() an_zi_ora[9] #define unit_data() an_zi_ora[10] #define zeci_luna() an_zi_ora[11] #define unit_luna() an_zi_ora[12] #define zeci_an() an_zi_ora[13] #define unit_an() an_zi_ora[14] #define zi_sapt() an_zi_ora[15] void init_LCD(void);
void cmd_LCD(char comanda);
void scrie_caracter_LCD(char caracter); void scrie_string_LCD(char *buffer); void scrie_rom_string_LCD(const rom far char *buffer);
void reset_time(); void set_time(unsigned int address, unsigned int x); void time(unsigned int hours,unsigned int minutes,unsigned int seconds); void date(unsigned int date, unsigned int month,unsigned int year); void day(unsigned int disp); void decode(unsigned int val); void display(void); void init_i2c(); void i2c_start(void); void i2c_restart(void); void i2c_device(void); void i2c_write(unsigned int data); void i2c_stop(void);
88
void meniu_reglare_ora();
void alarma_on_off(); void citeste_telecom(); void init(); void high_isr(); void low_isr(void); void pir(); void afisare_ora(); void afisare_alarma(); unsigned int get_temp(); unsigned int i2c_read(void); unsigned int get_time(unsigned int address);
unsigned char up=0;
unsigned char val=0; unsigned char buf[3]; unsigned int temperatura=0;
unsigned int temp,temp1,temp2,units,tens; unsigned char semn_temp,sute_temp,zeci_temp,unit_temp,zecimala,temp_lsb; unsigned char armare_alarma=0; unsigned char dezarmare_alarma=0; unsigned char an_zi_ora[16]; unsigned char memorare_activare[10]; unsigned char memorare_dezactivare[10]; unsigned char zeci_time_armare; unsigned char alarma_on=0; unsigned char zeci_time_dezarmare;
89
BIBLIOGRAFIE
1. http://ep.etc.tuiasi.ro/site/Sisteme%20Cu%20Conectare%20Multiplexata/I2C_1_fin+.pdf
2. http: //ep.etc.tuiasi.ro/site/Aparate%20Electrice%20de%20Masura%20si%20Control/lucrari_de_lab
orator/LUCRAREA%209.pdf
3. http://senzor -miscare.ro/senzori/senzori -de-miscare/
4. https://www.teguna.ro/wiki/Senzor_de_distan%C5%A3%C4%83_cu_ultrasunete_HC -SR04
5. http://www.sbprojects.com/knowledge/ir/nec.php
6. http://www.robotics.ucv.ro/flexform/aplicatii/m2/Salahoru%20Amedeo%20 –
%20Limitatoare%20de%20cursa%20si%20senzori/
90
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Acest concept, al alarmării oamenilor dintr -un anumit loc, in caz de intr ări ale străinilor [602115] (ID: 602115)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
