Sistem Semaforizat cu Modul de Decongestionare a Traficului

Sistem semaforizat cu modul de decongestionare a traficului

(PIC 16F887)

Abstract

În prezent, aglomerația în trafic reprezintă o problemă destul de majoră. Aceasta poate fi cauzată, în mare parte, de timpul îndleungat de schimbare a luminii semaforului. Prin urmare, am încercat sa aduc în discuție în acest proiect o soluție pentru simularea si optimizarea condițiilor de trafic, realizând un modul " controlor de trafic ". Sistemul se bazează pe un microcontroler și senzori IR. Scopul implementării acestuia intr-un sistem real este acela de a elimina aglomerația din intersecții cauzată de semafoare prost sincronizate cât si de timpii de schimbare foarte mari. Dacă există un " bruiaj de trafic " pe drumul respectiv, semaforul va decide el singur timpii de schimbare a culorilor în funcție de densitatea traficului pe acel sector de drum.

Acest proiect este numit Sistem semaforizat cu modul de decongestionare a traficului (PIC18F4331P) și a fost testat folosind modelul de simulare și în scenarii-reale de caz.

Cuvinte cheie : senzori IR, microcontroler, semafor.

Traffic light system with decongestion module

(PIC 16F887)

Abstract

A radio data transmitter includes radio switching circuit which is activated in response to first radio signal having a predetermined particular pattern, and a data transmitter unit. The data unit transmits a first radio signal include a carrier modulated by predetermined data from an antenna when supplied with power in accordance with the activation of the radio switching circuit, and subsequently disconnect the power supply.

In addition, a radio data receiver includes switch-activation to circuit for transmitting the first radio signal having the predetermined particular pattern, a receiving circuit for receiving the second radio signal including the data from the data transmitter unit activated by the first radio signal having the predetermined particular pattern, and a storage device for storing data received by the receiving circuit.

This project is called Traffic light system with decongestion module (PIC 18F4331P), and was tested using the simulation model and real life case scenarios.

Keywords: IR-sensors, microcontroller, traffic lights.

Thesis Supervisor S.L.DR.ING. DAN PUCHIANU

Associate professor, Ph.D. Eng.,

Electronic, Telecommunication and Power Energy Department

Electrical Engineering Faculty

University VALAHIA of Targoviste

Abrevieri

PIC 18f452

LCD – Liquid Crystal Display

ET – Email Teleftalic

PCB – Placă cu circuite imprimate

SMT – Surface-Mount Technology

SMD – Surface Mounted Device

EPROM – Erasable Programmable Read Only Memory

NPN – Tranzistor bipolar

CPU – Central Procesing Unit

PIC – Peripheral Interface Controller

PVC – Policlorură de vinil

Cuprins

Capitolul I – Introducere

1.1 Sistem semaforizat cu modul de decongestionare a traficului. (PIC 16F887)

1.2 Probleme specifice traficului rutier

1.3 Metode de fluidizare a traficului

Prezentare machetă

Schemă bloc

Date tehnice de principiu ale componentelor electronice

Capitolul II – Proiectarea electronică .

Schema electrică

Capitolul III – Proiectarea informatică

Schema logică

Codul sursă

Capitolul IV – Concluzii

Bibliografie .

Anexa

CAPITOLUL I

INTRODUCERE

1.1 Sistem semaforizat cu modul de decongestionare a traficului. (PIC 16F887)

Justificarea alegerii acestei teme este una complexă. Deși industria auto este într-o continuă și rapidă evoluție, accidentele rutiere reprezintă încă o problemă majoră fără o soluție viabilă. În medie, în fiecare minut o persoană moare într-un accident de circulație. În plus, pe baza statisticilor furnizate de Organizația pentru Cooperare și Dezvoltare Economică Paris, facturile din spitale, deteriorarea proprietăților, precum și alte costuri pot ajunge până la 1.3 la sută din produsul intern brut al omenirii. Având în vedere doar Statele Unite, suma totală anuală se ridică la aproximativ 200 miliarde dolari SUA. Și, foarte important, pierderile care contează cel mai mult nu sunt capturate de aceste statistici, și nu pot fi evaluate în bani.

Un alt factor important a fost acela că această temă este una interdisciplinară, combinând majoritar domeniul telecomunicațiilor, tehnologiei informației cu cel al transporturilor, al matematicii și fizicii. Având în vedere faptul că aceste domenii sunt dinamice, sunt oferite numeroase posibilități de abordare, cât și un vast orizont de perfecționare a unei metode specifice.

Scopul proiectului este cel de a găsi o arhitectură optimă bazată pe sisteme distribuite de senzori IR combinată cu algoritmii adecvați, pentru detectarea situațiilor anormale (ambuteiaje in intersectiile aglomerate), având scopul de a fluidiza circulația și asigura un grad sporit de securitate pentru participanți.

1.2 Probleme specifice traficului rutier

Nevoia de mobilitate și de viteză specifică secolului XXI a dus la dezvoltarea mijloacelor de transport dar și la apariția unor probleme specifice. Dintre acestea cele mai stringente sunt cele legate de securitatea participanților la trafic, cele legate de apariția congestiilor cât și cele legate de mediul înconjurător.

În general congestiile apar la anumite ore, considerate ca fiind de vârf, ore în care un număr ridicat de participanți folosesc același segment de drum sau se îndreaptă spre aceeași destinație. Acest lucru se datorează în principal faptului că infrastructura segmentului respectiv de drum nu suportă un volum mare de participanți simultan la trafic. Alte cauze ale apariției congestiilor sunt: uneltele de taxare la intrarea sau ieșirea de pe anumite segmente de drum la care se percepe o taxă, capacitatea redusă a segmentului de drum de a gestiona un volum mare de vehicule, o capacitate insuficientă pentru mijloacele de transport în comun, problemele de infrastructură a semafoarelor. La aceste cauze aș adăuga și următoarele: condiții meteo nefavorabile, care duc la scăderea vitezei și astfel la o golire mai înceată a segmentului respectiv, lucrările de reparație pe anumite segmente de drum, ceea ce duce la îngustarea sau blocarea unei anumite porțiuni, apariția unui eveniment neprevăzut ( cum ar fi de exemplu un accident ).

Această problematică a traficului rutier este una fără frontiere, și care afectează majoritatea statelor

Pe post de soluții primare sunt propuse următoarele acțiuni: construirea mai multor drumuri, unelte pentru taxare mai performante, construirea unor rampe pentru acces gradual pe autostradă, construirea de sisteme inteligente pentru managementul traficului, construirea unor benzi cu un grad sporit de ocupare, viteza de reacție sporită în cazul accidentelor sau a incidentelor rutiere, luarea în considerare a noilor zone ocupate și creșterea densității pe segmentele corespunzătoare de drum, oferirea unei autorități sporite departamentelor de transport regionale.

Deoarece majoritatea soluțiilor primare propuse mai sus vizează domeniul transporturilor și cel economico-politic, mă voi axa în continuare pe soluția care împachetează direct domeniul ingineriei electrice, și anume descrierea sistemelor inteligente pentru managementul traficului, din care face parte și tema dezbătută, dorindu-se să aducă îmbunătățiri în acest sens.

1.3 Metode de fluidizare a traficului

Problematica traficului rutier este una foarte stringentă, lucru demonstrat atât de numeroasele articole științifice publicate în domeniu transporturilor, și nu numai, cât și al realizărilor din industrie. În acest sens industria auto prin marile concerne constructoare de mașini a transpus în practică rodul cercetărilor științifice prin numeroase realizări care au dus la facilitarea și fluidizarea traficului rutier, creșterea nivelului de siguranță a participanților, și nu în ultimul rând au avut un impact favorabil asupra mediului înconjurător.

În continuare voi prezenta succint câteva dintre aceste realizări. În primul rând voi descrie soluțiile deja existente pe piață și care s-au dovedit a fi eficiente. Una dintre acestea este reprezentată de transmiterea către participanții din trafic a informațiilor utile.

Una din cele mai uzuale metode de a informa participanții la trafic despre posibilele incidente apărute, sau despre condițiile meteo este reprezentată de rezervarea unei anumite frecvențe radio pe care sunt transmise informațiile, fie din timp în timp cu scopul de reamintire sau actualizare a mai vechilor informații, fie în scopul de a atrage atenția asupra unui eveniment sau a unei condiții nou apărute. O altă posibilă formă de punere în practică a tehnicii bazate pe mesaje este cea prin panourile de informare. Dezavantajul acestei metode este bazat pe faptul că doar prezintă un incident sau o situație deja creată, fără a încerca însă să anticipeze situația.

Având scopul de a fluidiza traficul rutier, de a reduce timpul petrecut în aglomerație, dar și cu o intenție declarată de ecologizare, unul din cei mai mari producători de mașini, Audi, a implementat la nivel urban, Travolution, un sistem capabil să comunice șoferului viteza cu care ar trebui să se deplaseze astfel încât la următoarea intersecție să prindă semaforul pe verde, și în acest mod să reducă ambuteiajele create în intersecții. Din păcate acest sistem nu este răspândit la scară industrială, astfel încât să poată fi utilizat pentru orice marcă de autovehicul, fiind aplicate doar pe câteva bucăți din modelele A5 și A6 ale producătorului, cât și în alte locații în afara orașului Ingolstadt. Rolul acestui proiect a fost acela ca pe lângă operațiunea frustrantă și consumatoare de combustibil, de a opri la semafor, traficul să fie optimizat și de asemenea să se reducă emisia de CO2. Sistemul se bazează pe module de comunicații integrate în fiecare semafor, și care sunt capabile de a trimite mesaje spre mașinile din vecinătatea lor, alertându-le de timpul rămas până la următoarea fază verde. Mașina de la bord este capabilă de a calcula viteza pe care conducătorul auto trebuie să o mențină, în scopul de a trece prin lumina verde în timpul acestei faze, și afișează acest lucru prin intermediu ecranului cu interfață multimedia. Sistemul este alcătuit dintr-o rețea de 46 semafoare „inteligente” ce a fost instalată în centrul orașului și din software-ul capabil de optimizare treptată. Scopul acestuia este acela de a reduce opririle la minim, de reducere a consumului de combustibil și a poluării în acest proces. În vederea evaluării proiectului încă 20 autoturisme și 50 de instalații de lumină urmează să fie încorporate.

Un alt mod de informare al participanților la trafic, este Suna, produs și comercializat în special în Australia . Suna GPS Trafic Updates furniză în timp real informații despre trafic direct sistemului de navigare. De asemenea acest sistem este compatibil cu toate mărcile lidere din domeniu GPS. Sistemul a fost conceput ca, în timp real, să determine condițiile de drum și să informeze sistemul de navigație de posibilele probleme, în perspectivă, și să recomande rute care ar reduce congestia. Din păcate și acest sistem are o întindere restrânsă, fiind disponibil în prezent, doar la Melbourne, Sydney, Brisbane, Gold Coast, Adelaide și Perth. Suna GPS Trafic se actualizează continuu, bazat pe monitorizarea traficului și condițiilor rutiere aducând informații detaliate despre incidente, congestionarea traficului în întreaga zonă metropolitană, sau a zonelor care ar putea afecta călătoria. Sistemul este bazat pe o combinație de senzori și camere video pentru a monitoriza continuu nivelele de congestie pe o suprafață de mii de kilometri de drumuri locale, naționale, și autostrăzi. În plus, avertismente despre incidente majore (cum ar fi accidentele), importante lucrări de drumuri, condițiile meteorologice severe din punct de vedere rutier, precum și evenimente speciale cu posibil impact în trafic sunt transmise periodic. În funcție de caracteristicile dispozitivului GPS deținut, Suna se integrează perfect cu dispozitivul iar o dată activat, acestae congestie pe o suprafață de mii de kilometri de drumuri locale, naționale, și autostrăzi. În plus, avertismente despre incidente majore (cum ar fi accidentele), importante lucrări de drumuri, condițiile meteorologice severe din punct de vedere rutier, precum și evenimente speciale cu posibil impact în trafic sunt transmise periodic. În funcție de caracteristicile dispozitivului GPS deținut, Suna se integrează perfect cu dispozitivul iar o dată activat, acesta va beneficia de un număr de caracteristici noi: mesaje audio de avertizare cu privire la schimbarea condițiilor meteo, afișarea hărții cât și a locației și natura problemelor de trafic în special cele care afectează traseul. De asemenea sistemul este capabil să estimeze întârzierile posibile, iar în acest caz să calculeze și să recomande o rută auxiliară.

Prezentare machetă

În lucrarea de față este prezentat un sietem cu microcontroler, menit să aducă îmbunătățiri substanțiale traficului auto dintr-o intersecție semaforizată. Practic, montajul permite detectarea ambuteiajelor în intersecție și luarea deciziilor optime pentru decongestionare.

Fig. 1.1 Schiță explicativă

Acest lucru se face prin modificarea timpilor de aprindere a culorilor semaforului în funcție de gradul de ocupare. S-au folosit senzori IR pentru detecție si unitate centrala ce are la bază microcontrolerul PIC18F4331P.

Ca mod de alimentare electrică pentru montaj s-a folosit sursa clasică în componența căruia intră un transformator de 5vcc, stabilizator tensiune și punte redresoare.

Funcționalitatea acestui modul constă în intervenția și modificarea timpilor de aprindere ai semafoarelor în funție de semnalele primite de la senzori. În lucarea de față s-au folosit trei senzori pe fiecare sector de drum. Avem trei timpi diferiți setați în program și în funcție de gradul de întrerupere al acestora 1,2 sau 3 vom avea 3 timpi de aprindere pe langa timpul default al semaforului fara ca modulul nostru sa fie interpus. Montajul este prevăzut și cu un display pentru evidențierea schimbării timpilor.

Timpul de aprindere are trei stadii, trecând prin toate acestea funcție de senzorul “înterrupt”.conform tabelului.

Descriere timpi aprindere

Figura 1.2 Schema bloc a montajului

Date tehnice de principiu ale componentelor electronice,

folosite în lucrarea de față

Microcontroler-ul PIC16F887

Configurația microcontroler-ului

PIC16F887

Înaltă performanță RISC CPU ;

35 de instrucțiuni ;

Viteză de operare:

Intrare ceas 20 MHz max.

200ns/ciclul de instrucțiune ;

Până la 8K x 14 cuvinte de memorie FLASH programabilă ;

Până la 368 x 8 biți de memorie RAM ;

Până la 256 x 8 biți de memorie EEPROM ;

Capabilitate de intrerupere de până la 15 surse ;

Moduri de adresare directe și indirecte ;

Power-on Reset (POR) ;

Power-up Timer (PWRT) și Oscilator Start-up

Timer (OST);

Watchdog Timer (WDT) atunci când se folosește oscilator RC;

Cod de protecție programabil; Putere scăzută în modul SLEEP;

Opțiune de selectare a oscilatorului;

Putere scăzută, tehnologie CMOS FLASH/EEPROM de mare viteză;

Design static;

Intrare serială de programare (ICSP) prin doi pini ;

Permite scrierea sau citirea datelor din memorie;

Plaja tensiunii de alimentare pentru funcționare (2V – 5.5V) ;

Nivelul maxim de curent (25 mA) ;

Consumul în regimul scăzut al puterii :

< 0.6 mA la 3V, 4MHz ;

20 μA la 3V, 32KHz ;

1 μA în standby ;

Două module PWM de captură :

Captură pe 16 biți la o rezoluție de 12.5 ns ;

Captură pe 16 biți la o rezoluție de 200 ns ;

PWM max. rezoluție de 10 biți ;

Convertor Analog – Digital pe 10 biți ;

Synchronous Serial Port (SSP) cu SPI în modul (Master) și în modul (Master/Slave) ;

Universal Synchronous Asinchronous Receiver Transmitter (USART) cu 9 biți de adrese de detecție;

Parallel Slave Port (PSP) pe 8 biți cu RD’, WR’ și CS’
* ;

Circuit de detecție pentru Brown-out Reset (BOR).

Tabelul 1.1 Configurația pinilor microcontroller-ului PIC16F887

Figura 1.3 Schema bloc internă a microcontroller-ului PIC16F887

Tabelul 1.2 Descrierea pinilor microcontroller-ului PIC16F887

Rezistorul

Reprezintă un element pasiv de circuit, cu urmatoarele caracteristici:

u(t)=u(i(t),t) -caracteristica de tensiune

i(t)=u(u(t),t) -caracteristica de curent

Rezistorul reprezintă un fir conductor care fiind parcurs de un curent electric degajă caldură prin efect inversibil; nu produce câmp electromagnetic, nu conține surse de câmp electric străin.

Ecuația de funcționare:

u(t)=Ri(t)

unde:R→Ω(rezistenta) i(t)=Gu(t);

G-conductanța și se măsoară in Ω-1 sau 1S=1Ω-1 (Siemens)

Nu întotdeauna conductanța reprezintă inversul rezistenței (numai în curent continuu).

Caracteristica tensiune-curent în cazul curentului liniar e reprezentat printr-o dreaptă ce trece prin origine=> tensiunea și curentul au aceeași formă de variație la bornele rezistorului.

Dacă rezistența tinde la 0, caracteristica devine u=0 și ramura devine un scurtcircuit, iar dacă rezistența tinde la oo deci G→0 atunci ramura devine o ramura deschisa (deci ramura funcționează în gol).

ec: u(t)=R(t)i(t) reprez. În planul tens.- curent.

3) Rezistoare neliniare- caracteristica tens.- curent nu este o dreaptă ecuația de funcționare:

a) f(u(t),i(t),t)=0 dacă rezistorul este variabil în timp.

b) f(u(t),i(t))=0 dacă rezistorul este invariabil în timp.

Condensatorul

Reprezintă sisteme conductoare, care, fiind parcurse de curent electric de conducție acumulează sarcina electrică, nu degajă caldură prin efect fotocaloric, nu produce câmp magnetic și nu conține surse de câmp electric străine.

Ecuația de evoluție se stabilește pe baza legii conservării sarcinii electrice și se scrie astfel: I=dq/dt unde dq reprezintă sarcina electrică a armăturii condensatorului. Integrând relația în [0,t] ⇒ q(t)=q(0)+S0tq(t)dt numită ecuația de ereditate a condensatorului și care indică, că sarcina la un moment oarecare de timp, depinde de valoarile anterioare ale intensității curentului.

Tipuri de condensatoare:

1) Condensatorul liniar, invariabil in timp

ec de funcționare: q(t)=Cu(t)

C- capacitatea condensatorului

u – unitatea de masura F (Farad)

– ecuația de funcționare a condensatorului reprezintă dependența dintre sarcina armăturii și tensiunea la borne.

În general q(t)=q(u(t),t) u(t)=Sq(t) unde >S->F-1.

Caracteristica sarcină-tensiune este o dreaptă care trece prin origine deci forma de variație în timp a sarcinii electrice q și a tensiunii u este aceeași.

ecuațiile volt-amper ale condensatorului

2) Condensatorul liniar parametric; C-capacitatea variablă în timp

ec: q(t)=C(t)u(t)

– caracteristica sarcină-tensiune reprezintă o familie de drepte ce trec prin origine=> sarcina și tensiunea au variații în timp diferite

i(t)=C(t)*du/dt+u(t)*dc/dt

3) Condensatorul neliniar – poate fi variabil sau invariabil în timp=> ecuația lui poate fi scrisă astfel:

f(q(t),u(t),t)=0 – variabilă ; f(q(t),u(t))=0 – invariabilă.

– caracteristica sarcină-tensiune are forma unui ciclu de histerezis electrolitic.

Tranzistorul bipolar

Tranzistorul bipolar conține trei părti din siliciu (germaniu) foarte purificat la care sunt adăugate cantități mici de materile dopante. Legatura dintre placuțele de siliciu se numește joncțiune care dă voie curentului să treacă de la n la p. Conexiunea la fiecare plăcuță este făcută prin evaporarea de aluminiu pe suprafața acestora; stratul de dioxid de siliciu protejează părțile nemetalice. Un curent mic între joncțiunea bază-emitor produce un curent de 10 până la 1000 de ori mai mare decat cel dintre colector și emitor (Săgețile arată curentul pozitiv). Tranzistorii sunt folosiți în diferite domenii de la detectori electronici sensibili până la amplificatoare puternice Hi-Fi .

Tranzistorii au fost concepuți la Laboratoarele Bell Telephone de fizicienii americani Walter Houser Brattain, John Bardeen și William Bradford Shockley. Pentru această realizare cei trei au împarțit în 1956 Premiul Nobel în fizică. Shockley este cunoscut ca inițiatorul cercetărilor asupra materialelor semiconductoare ce au dus la descoperirea acestor tipuri de dispozitive. Colegii săi sunt creditați pentru descoperirea diferitor tipuri de tranzistori.

Proprietățile electrice ale materialelor semiconductoare sunt determinate de structura atomică. Într-un cristal pur de germaniu sau de siliciu atomii sunt legați într-un aranjament periodic formând un cub perfect. Fiecare atom din cristal are patru electroni de valență, fiecare interacționează cu electronul din vecinatate pentru a forma o legătură divalentă. Deoarece electronii nu sunt liberi să se miște materialul pur la temperaturi scăzute se comportă ca un izolator.

Cristalele de germaniu și siliciu ce conțin cantități mici de anumite impurități pot conduce curentul și la temperaturi scăzute. o impuritate cum ar fi fosforul se numește impuritate donoare pentru că contribuie la un exces de electroni, numai patru intrând în legătura divalentă cu germaniu sau siliciu. Când este aplicat un curent electronul rămas este liber să se miște. Elementele, cum ar fi galiu au trei electroni de valență. Acestea sunt numite impurități acceptoare deoarece accepta electroni de la atomii vecini. Deficiențele rezultante sau așa numitele goluri pe rând sunt umplute de alți electroni.

Acestea se comportă ca purtători pozitivi mișcându-se sub un curent aplicat în direcția opusă electronilor.

Tranzistorii sunt dispozitive electronice care sunt folosite ca oscilatoare, amplificatoare, în comutație și în calculatoare. Diagrama arată structura internă a diferitelor tipuri de tranzistori.

O joncțiune N-P (cunoscută și sub numele de diodă) lasă curentul să treacă doar într-o singură direcție. Electronii din materialul de tip N pot să treacă direct prin cel de tip P dar excesul de electroni din P va prevenii orice scurgere de electroni spre stânga .

*Nota: Curentul este definit ca o curgere în sens opus curgerii de electroni .

LCD-ul (Lyquid Crystal Drive)

Funcții și caractesistici:

Direcția de vizualizare: ora 6

Plaja tensiunii de alimentare: 2.7 – 5.5 V

Lumină de fundal: albastru

Vlcd (reglabilă pentru cel mai bun contrast) : 4.5V

Formatul display-ului: 8X2 caractere (2X4 puncte, formal: 192 tipuri)

Memoria internă: CGROM ( 8320 biți)

CGRAM (64X8 biți)

DDRAM (80×8 biți pentru 80 digiți)

Interfață: interfață facilă cu MPU pe 4 sau 8 biți.

Specificații mecanice:

Nivelul caracterului: 3.55 (L) x 5.95 (H) mm

Dimensiunea caracterului: 2.95 (L) x 5.55 (H) mm

Font-ul caracterului: 5x 8 puncte

Mărimea punctului: 0.55 (L) x 0.65 (H) mm

Nivelul punctului: 0.60 (L) x 0.70 (H) mm

Figura 1.4 Diagrama bloc a LCD-ului

Figura 1.5 Dimensiunile externe ale LCD-ului

Figura 1.6 Schema electrică a LCD-ului

Tabelul 1.3 Repartizarea pinilor

Tabelul 1.4 Tabela de instrucțiuni

Capitolul II

Proiectarea electronică

Metode de fabricare a PCB-urilor

Placa cu circuite imprimate (PCB) este un asamblu mecanic ce este alcătuit din straturi de fibră de sticlă, laminat cu modele de cupru. Este folosită pentru a monta componente elctronice pe un suport solid ce poate fi împachetat. Este cunoscută și sub numele de placă de cablaj.

Cablajul

Un cablaj trebuie dispus astfel încât să arate legătura părților componente pe placă. Fiecare parte de pe schemă ar trebui să aibă un indicator de referință, care să corespunda cu cel de pe lista de materiale. Multe programe ce se ocupă de scheme, permit generarea automată a listei de materiale.

Lista de materiale

Componentele care vor fi montate pe PCB ar trebui să fie scrise pe lista de componente. Fiecare componentă trebuie sa aibă un indicator unic și o descriere (de exemplu o rezistență poate avea un indicator “RI” cu descrierea rezistor cu film de carbon de ½ watti). Se pot include orice detalii care pot ajuta la procesul de asamblare, cum ar fi aparatura necesară montării, distanțierii, sau orice alte materiale care nu sunt arătate în diagramă.

Alegerea componentelor din tabelele de produse

Producătorii de componente pun la dispoziție tabele cu produsele ce pot fi folosite de către proiectanți în realizarea circuitelor. Pentru a putea realiza PCB-urile cât mai bine, aceste componente ar trebui să aibă trecute și dimensiunile fizice. În mod normal, informații cu privire la produse se găsesc pe pagina personală de Internet a producătorului. Dacă o componentă ce va fi folosită nu are specificații tehnice, ar trebui să achiziționăm un exemplar pentru a-i testa proprietățile. Această sunt metodă este mai puțin precisă decât dacă am folosi informația de la producător, mai ales dacă componenta are o toleranță mare, dar este mai bine decât a lua una la întamplare.

Alegerea tipului de placă și dimensiunea

O placă PCB nu reprezintă un produs finit. Va avea mereu nevoie de conexiuni la lumea externă pentru a primi curent, a face schimb de informații, sau pentru a afișa rezultate. Va fi nevoie ca aceasta să intre într-o carcasă sau să gliseze într-un suport pentru a-și putea îndeplini funcția. Este posibil să existe zone pe placă ce au restricții de înălțime (cum ar fi mulajul suportului de baterii sau șinele suportului în care trebuie să gliseze). În cadrul procesului de producție este posibil să fim nevoiți să facem găuri în placă. Toți acești factori externi trebuie să fie definiți înainte ca placa să fie proiectată, inclusiv dimensiunea maximă a placii și amplasamentul conectorilor, a afișajelor, a suporților de susținere sau a altor funcții externe. PCB-ul trebuie să țină cont de grosimea cuprului care va fi laminat pe suprafața sa. Cantitatea de curent ce trece prin circuite duce la stabilirea grosimii stratului de cupru. În mod normal, această grosime este standard. De asemenea putem alege între mai multe tipuri de materiale pentru producerea plăcii și putem alege și numărul de straturi:

Material:

Fibra de sticlă sub formă de rășină ce este laminată ( FR4). Este o placă rigidă cu grosimea de 1.6 mm (convențional) sau 0.8 mm.

Fenolul este un material pentru fabricarea PCB-urilor mai ieftine. Este o placă rigidă cu grosimea de 1.6 mm (convențional) sau 0.8 mm.

Straturi:

Un singur strat: un strat de cupru. În mod normal componentele trebuie să fie montate doar pe o singură parte a PCB-ului, toate legăturile făcându-se prin intermediul găurilor, piesele fiind lipite. De asemenea, componentele se pot monta și pe suprafața plăcii folosind tehnologia SMT sau SMD. Circuitele montate pe suprafața plăcii în general mai mici decât cele convenționale. Acest tip de montaj este în general mai potrivit pentru asamblarea automată decât cea convențională. În practică, majoritatea plăcilor sunt o combinație între componente convenționale și montaj pe suprafața plăcii. Această combinație poate avea dezavantajele sale, deoarece cele două tehnologii necesită metode diferite de lipire. Circuitele convenționale sunt în general mai ușor de diagnosticat și reparat.

Două straturi de cupru, unul pe fiecare parte a plăcii. Componentele trebuie să fie montate doar pe o singură parte a plăcii, dar este posibil și montarea componentelor pe ambele părți. În mod normal numai circuitele montate pe suprafața plăcii pot fi așezate pe ambele părti ale PCB-ului. Componentele trebuie să fie montate folosind și tehnologia convențională și tehnologia de montare a SMD-urilor. Circuitele convenționale sunt în general mai ușor de diagnosticat și reparat.

Multistrat PCB-ul poate fi produs cu mai mult de două straturi de cupru, folosind o construcție de tip sandwich. Costul plăcii reflectă numărul de straturi. Straturile suplimentare pot fi flosite pentru a devia circuite mai complicate și/sau pentru a distribui energia mai eficient.

Desenarea schemei PCB-ului

Schema PCB-ului poate fi desenată fie manual, fie prin intermediul unui program ECAD. Pentru lucrarea de față s-a folosit programul Eagle pentru proiectare scheme electrice și cablaje. Procesul manual este folositor și rapid doar pentru PCB-uri foarte simple, pentru PCB-uri mai complicate sugerez a doua metodă. În prezent programe ieftine se pot ocupa de toate aspectele preprocesării PCB-urilor.

De asemenea sunt disponibile și programe profesionale care pot controla în mod direct uneltele de fabricație (cum ar fi mașina de găurit). Câteva metode empirice pot fi folosite atunci cand se proiectează plăcile:

Amplasarea componentelor

În general, este bine să amplasăm componentele doar pe partea superioară a plăcii. În primul rând plasăm toate componentele care trebuie să fie intr-un anumit loc. Asta include conectori, întrerupatoare, leduri, găuri pentru montaj, radiatoare sau orice alte componente ce trebuie sa fie montate la o locație externă. Componentele care se conecteaza una cu alta trebuiesc puse în apropiere una de alta. Dacă facem o treaba buna aici, va fi mult mai ușor să trasăm circuitele. Aranjăm IC-urile în una sau în două din poziții: sus și jos sau stânga și dreapta. Aliniem fiecare IC, astfel încât pinul numarul 1 să fie în același loc pentru fiecare direcție, de obicei în partea de sus sau în stânga. Componentele polarizate (de exemplu diode și învelișurile electronice) cu legaturile pozitive având aceiași orientare. De asemenea folosim o suprafață pătrată pentru a marca legăturile pozitive ale acestor componente. Vom câștiga mult timp lăsând destul spațiu între IC-uri pentru a putea trasa circuitele. De obicei un începător rămâne fără spațiu atunci când trebuie să traseze circuitele. Lăsăm 0.350” – 0,500” între IC-uri și pentru IC-uri mai mari lăsăm chiar mai mult. Componetele care nu se găsesc în stoc, pot fi făcute prin plasarea unor serii de plăci individuale și apoi grupându-le. Punem câte o plăcuță pentru fiecare legătură a componentei. Este foarte important să măsurăm distanța dintre pini și diametrul acestora cât se poate de exact. Pentru această operație, de obicei se folosesc șublere digitale sau analogice. Atunci când alegem o plăcuță și mărimea găurii pentru pinii componentei, trebuie sa ținem minte că marimea găurii se referă la mărimea burghiului ce este folosit atunci cand placa este făcută. După ce gaura este placată, diametrul se va micșora cu 0.005” până la 0.007”. Când alegem mărimea găurii. adaugăm 0.008 sau chiar mai mult. După ce am amplasat toate componentele, printăm o copie a schemei. Amplasăm fiecare componentă deasupra schemei. Verificăm pentru a vedea dacă am lăsat destul spațiu între componente astfel încât acestea să nu se atingă.

Plasarea circuitelor de alimentare

După ce toate componentele au fost amplasate, următorul pas este amplasarea circuitelor de alimentare cu energie. Este important atunci când lucrăm cu IC-uri să avem linii solide pentru curentul electric, folosind circuite largi care se conectează la șine comune pentru fiecare sursă. Este foarte important să evităm mutarea de pe o parte sau alta sau încâlcirea liniilor de alimentare. O configurație comună este să folosim partea de la baza PCB-ului pentru trasarea liniilor de alimentare. O șină de alimentare poate fi trasată de-a lungul limitei din față a plăcii, iar șina de împământare de-a lungul marginii din spate. De aceste șine atașăm legături ce unesc IC-urile. Șina pentru nul ar trebui să fie foarte largă, aproximativ 0.100” iar celelalte surse de alimentare trebuie sa fie de 0.050”. Când folosim această configurație, partea ce a rămas pe stratul inferior este rezervată pentru liniile semnalelor verticale.

Amplasarea liniilor de semnal

Procesul conectării părților este cunoscut sub denumirea de direcționare și poate fi realizat manual sau automat. Dacă folosim un program de direcționare este o idee bună să direcționăm semnalele critice manual. Astfel semnalul va fi direcționat cu mai puține cotituri decât dacă acesta ar fi fost trasat de către program. Anumite semnale pot avea nevoie de tratament special, cum ar fi împământarea sau lungimi specifice care pot fi mai ușor de făcut înainte de a porni programul. Aceste linii ar trebui marcate drept fixe pentru ca programul să nu le mute. Când amplasăm liniile, este o idee bună să le facem cât mai scurte și cât mai directe posibil. Folosim legăturile prin intermediul găurilor pentru a transfera semnalul de la un strat la altul. În general, cea mai buna strategie este să facem o placă cu trasee verticale pe o parte și trasee orizontale pe partea celalată. Facem legatura acolo unde este nevoie ca un traseu orizontal să se întâlnească cu unul vertical. O lățime a traseului bună pentru semnale digitale și analogice de tensiune joasă este 0.012”. În legăturile care suportă o cantitate de curent mai mare ar trebui să fie mai late decât cele care transportă doar semnal. Tabelul de mai jos prezintă criterii brute cu privire la cât de lată ar trebui să fie o legatură pentru o anumită cantitate de curent.

Atunci când amplasăm o legatură, este foarte important sa ne gândim la spațiul dintre acea legatură și alte legături adiacente. Trebuie să ne asigurăm că există o distanță minimă de 0.007” între componente, optim ar fi 0.010”. Lăsând un spațiu cât mai mic, apare riscul ca în momentul realizării plăcii, să apară un scurtcircuit. De asemenea, este necesar să lăsăm spații mai mari atunci când lucrăm cu voltaj ridicat. Atunci când folosim legături înguste, de 0.025” sau chiar mai mici, evităm întoarcerile de 90o. Problema aici este că în procesul de fabricare al piesei, colțul exterior este deseori gravat prea îngust. Soluția este să folosim două cotituri de 45o lăsând o mică distanță între ele. Este o bună idee să scriem pe stratul superior al plăcii numele produsului sau al companiei. Textul amplasat pe stratul superior poate fi de ajutor pentru a ne asigura că nu există nici o confuzie în procesul de producție cu privire la întâietatea stratului.

Verificarea muncii realizate

După ce toate legăturile sunt amplasate, este bine să verificăm de două ori direcționarea fiecărui semnal pentru a vedea că nu am omis nimic sau nu am legat în mod necorespunzător. Realizăm această operație, verificând schema, luând câte o legătură în parte. Urmărim atent calea pe care o urmează fiecare legătură pe placă pentru a ne asigura că este aceiași cu cea de pe schemă. După ce fiecare legătură este confirmată, marcăm acel semnal pe schemă cu un marker. Inspectăm placa atât pe partea superioară cât și pe cea inferioară pentru a ne asigura că distanța dintre fiecare componentă este de 0.007” sau mai mare. Verificăm să nu existe legături lipsă între cele două straturi. O metodă ușoară de a verifica lipsa unei legături este să tipărim prima dată stratul superior și apoi pe cel inferior. Inspectăm vizual fiecare parte pentru a descoperii legături care nu se conectează la nimic. Când am găsit o conexiune lipsă, o realizăm. Verificăm să nu existe trasee care se intersectează. Acest lucru se poate realiza foarte ușor prin inspectarea schemei fiecărui strat. Componentele mecanice cum ar fi radiatoarele, cristalele, întrupătoarele, bateriile și conectorii, pot cauza scurt-circuite dacă sunt amplasate deasupra legăturilor stratului superior. Inspectăm existența acestor scurtcircuite prin amplasarea componentelor metalice pe suprafața unui imprimat al stratului superior. Apoi căutăm legăturile care trec pe sub componentele mecanice.

Desenarea schemei de fabricație

Schema de fabricație ar trebui să arate dimensiunile plăcii în concordanță cu datele necesare. Trebuie să arate o reprezentare pentru fiecare gaură de pe placă, folosind simboluri diferite pentru fiecare mărime a găurii, și să existe un tabel care să ilustreze numărul de găuri în funcție de mărime. Această schemă va fi folosită de producatorul plăcii împreună cu fișierele de date generate în etapa post-procesare.

Desenarea schemei de asamblare

Este posibil să fie nevoie sa desenăm o schemă de asamblare care să ne ajute la construcție și la reparație. Aceasta ar trebui să arate codul pieselor de identificare. De asemenea, ar trebui să conțină orice informații cu privire la anumite operații speciale de asamblare. Multe companii cer aceste desene, altele folosesc copii ale shemei circuitului.

Metode diferite de realizare a PCB-urilor

Gravarea

Gravarea este probabil cea mai ușoară și mai ieftină metodă.

Gravarea este procesul chimic de îndepărtare a cuprului nedorit de pe o placă. Trebuie să punem o mască peste porțiunile care dorim să ramână după gravare. Aceste porțiuni care rămân pe placă sunt liniile care transmit curentul între componente. Sunt mai multe soluții de gravare:

Clorura ferică: face multă mizerie, dar se poate achiziționa ușor și este mult mai ieftină decât celelalte variante. Atacă ORICE metal, inclusiv oțelul inoxidabil, așa că atunci când gravăm o placă folosim o chiuvetă din plastic sau ceramică, cu instalație tot din plastic, și orice șuruburi din metal le sigilăm cu ajutorul siliconului. Dacă exista posibilitatea ca bateria de la chiuvetă să se stropească o acoperim cu plastic. Un sistem de evacuare al vaporilor nu este necesar, însă este bine să acoperm vasul atunci când nu folosim substanța.

Este indicat să folosim clorura ferică hexahidrată ce are o culoare galben deschis și este sub formă de pudră sau granule care trebuie dizolvate în apă caldă până când aceasta devine saturată. Adaugând o linguriță de sare va face substanța mai clară, pentru ca verificarea să se facă mai ușor.

Uneori, se poate folosi și clorură ferică anhidră care este sub formă de pudră de culoare verde-maroniu. Dacă putem, evităm aceasta solutie și avem mare grijă în manipularea ei, deoarece degajă multă caldură atunci când este dizolvată. Întotdeauna adaugăm pudra foarte ușor; nu adaugăm apă peste pudră; folosim în permanență mănuși și ochelari de protecție. Este posibil ca clorura ferică anhidră să nu ajute deloc la gravare, așa că trebuie să adaugăm o mică cantitate de acid clorhidric și să o lăsăm o zi sau două.

Atunci când dizolvăm oricare dintre soluții, avem mare grijă sa evităm să ne stropim. Soluția afectează ochii și pătează permanent îmbrăcămintea, așa că folosim ochelari și mănuși de protecție și ne spălăm bine în cazul în care soluția a intrat în contact cu pielea.

Dacă realizăm PCB-uri într-un mediu profesional, unde timpul înseamna bani, ar trebui sa ne cumpărăm un recipient cu bule, încalzit, pentru gravură. Având clorura ferica nouă, o placă va fi gravată în mai puțin de 5 minute, în comparație cu o oră cât durează într-un recipient neîncălzit și fără sistem de agitare. Gravarea rapidă produce o mai bună calitate a marginilor și o lățime a liniilor constantă.

Dacă nu folosim un recipient cu sistem de agitare, va trebui să agităm des, pentru a asigura o gravură constantă. Încălzim substanța gravantă prin amplasarea recipientului cu soluție într-o tavă mai mare în care există apă fierbinte – pentru gravuri fine trebuie ca soluția să aibă o temperatura de 300-600.

Persulfat de amoniu: este furnizat sub formă uscată, ce este ușor de amestecat și este folosit drept gravant pentru circuite din cupru. Când este folosit în combinație cu catalistul sau, se poate menține un ritm de gravare constant pe toată durata procesului.

Dupa realizarea amestecului, soluția are o durată de viață de aproximativ trei săptămâni și o capacitate de gravare de 29.96 – 37.45 grame / litru de gravant. Această soluție, în comparație cu clorura ferică și alte substanțe gravante are urmatoarele avantaje:

Nu va păta hainele, reipientele sau pielea.

Se clătește ușor și nu lasă nici un reziduu în apă.

Are o viteză constantă de gravare și cu adăugare constantă a catalistului menține viteza pe toată durata de viață a soluției.

Însă, ca și toate soluțiile gravante, persulfatul de amoniu are și dezavantaje:

Durata de viață activă : soluția are o durată de viață activă de 3 săptămâni, indiferent dacă este folosită sau nu.

Agresivitate: soluția atacă fibrele naturale precum bumbacul, lâna și pânza.

Există mai multe metode de pregătire a plăcii înainte de gravare:

Manual (desen direct)

O metodă de a imprima un model pe placă este să il desenăm direct. Folosind fie un creion permanent sau folosind benzi speciale (transferuri uscate) trasăm liniile direct pe suprafața de cupru a plăcii. Metoda stiloului se bazează pe faptul că cerneala este rezistentă la apă, iar cea cu benzile speciale se bazează pe faptul că acestea sunt făcute dintr-un plastic impermeabil, amândouă împiedicând gravantul să ajungă la cuprul ce se afla sub acestea, astfel, tot cuprul este îndepărtat cu excepția modelului ce a fost trasat. Aceasta este cea mai ușoară metodă de a transpune modelul pe placă dar apar dificultăți în amplasarea liniilor exact..

Aceasta este cea mai ușoară metodă de a trasa un model de circuit pe placă, dar este dificil să poziționăm liniile precis, mai ales dacă folosim pachete IC în cadrul desenului. În plus, din moment ce cerneala nu se aplică uniform, există posibilitatea ca liniile să fie și ele îndepărtate de soluția gravantă. Dacă facem o greșeală va trebui să o luăm de la capăt! Din acest motiv putem folosi această metodă pentru a face PCB-uri care sunt ușoare, fără detalii mari, sau să retușăm ușor placa înainte de gravare.

Fotolitografic

Sugerăm această metodă pentru a produce PCB-uri de calitate, în mod constant și eficient mai ales pentru realizarea prototipurilor profesionale ale plăcilor ce vor fi produse în serie.

În cadrul acestei metode, o placă este acoperită cu un material ce se lipește atunci când este expus la lumina ultravioletă. Pentru a reliza o placă în acest mod trebuie să realizăm o peliculă translucidă, pe care să curațăm zonele ce nu vrem să apară pe placă. După realizarea schemei pe peliculă, aceasta este plasată pe placa sensibilă la lumină și este expusă la ultra violete.

Lumina ultra violetelor transmite prin porțiunile transparente ale peliculei și ajută la lipire.

Ceea ce este imprimat reprezintă forma circuitului nostru. Avantajele acestei metode sunt liniile exacte și fine, și odată ce facem pelicula, aceasta poate fi folosită de multe ori pentru a face numeroase plăci de același f el.

Nu veți obține un rezultat bun decât dacă pelicula este bine realizată.Ideea este să realizăm o imagine clară, precisă, care sa fie de un negru opac. În prezent, pelicula este desenată fie folosind un program de specialitate sau un pachet de desen special.

Pelicula trebuie să fie în așa fel pictată astfel încât, partea imprimată să fie în contact direct cu placa în momentul expunerii, pentru a evita linii neclare.

Calitatea peliculei este influențată și de dispozitivul de desenare și de suportul de imprimare.

PCB-uri fotorezistente

Pentru a putea transfera imaginea de pe peliculă pe placă trebuie să folosim o placă tratată cu vopsea de copiere specială (Photoresist)

Vopsea sub formă de spray, este foarte greu de folosit, deoarece praful se va depune mereu pe suprafața umedă. Această metodă nu este recomandată decât dacă avem acces la o zonă foarte curată și bine ventilată sau la un cuptor de uscare, sau dacă vrem să facem o placă cu o rezoluție mică. În oricare dintre cazuri, pentru a folosi acest spray trebuie să:

1) avem multă practică.

2) curățăm: degresăm suprafața înainte de aplicarea produsului.

3) aplicăm substanța: pulverizăm placa de la o distanță de aproximativ 20 de cm până când vopseaua devine vizibilă. Această operație trebuie să se realizeze în condiții lipsite de praf. Apoi stratul trebuie să fie uscat (la 20° timp de 24 de ore sau la 75° timp de 15 minute.)

Țineți cont de faptul că acest spray este foarte inflamabil.

Întotdeauna folosim o placă de bună calitate. Verificăm cu atenție să nu existe zgârieturi pe folia de protecție, și după îndepărtarea acesteia, pe suprafața plăcii. Nu avem nevoie de o cameră obscură pentru a lucra cu această placă, cu condiția să evităm contactul direct cu lumina soarelui, să minimizăm expunerea inutilă, și o developăm imediat după expunerea la ultraviolete.

Mediu de realizare a peliculei.

Contrar cu ceea ce credem, nu este necesar să folosim un mediu transparent pentru a realiza pelicula, cu condiția să fie cât de cât transparent la lumina ultravioletă. Materialele ce sunt opace este posibil să aibă nevoie de o expunere mai îndelungată Claritatea liniei, transparența dungilor și capacitatea de absorție a cernelei sunt mult mai importante.

Medii posibile pentru peliculă sunt urmatoarele:

folii transparente: acestea pot părea cele mai potrivite pentru această operație dar sunt scumpe, au tendința de a face cute sau a se deforma din cauza imprimării laser, iar cerneala se poate crăpa sau se poate zgâria foarte ușor.

pelicula de transfer din poliestern: este bună, dar scumpă, suprafața aspra reține bine cerneala, și nu se deformează. Dacă este folosită la o imprimantă laser, cautăm cea mai groasă peliculă disponibilă, deoarece o peliculă mai subtțre are tendința de a se încreți datorită căldurii. La anumite imprimante chiar și peliculele mai groase se pot încreți.

foaie de transfer: are o transparență destul de bună și reține destul de bine cerneala și nu se deformează la caldură. Este ieftină, se găsește ușor la orice magazin de birotică (de obicei de aceiași măsură ca și hârtia obișnuită). Cumparăm tipul cel mai gros de foaie, cu o densitate de cel putin 90 grame/m2 (hârtia mai subțire se poate încreți), cea de 120 grame/m—este și mai bună dar mai greu de găsit.

Instrumente pentru a desena pelicula

Dispozitivul de imprimare este esențial pentru a produce o peliculă bună. Printre dispozitivele de imprimare se numără:

Stiloul manual: nu este o alegere adevărată, dar îl putem folosi pentru a face plăci cu detalii reduse sau pentru refinisare. Acesta trebuie să fie un marker permanent negru.

Transferul uscat: este o metodă lentă și scumpă, dar ne permite să desenăm manual și cu precizie mare sau să retușăm pelicula.

Plottere-le sunt destul de complicate și trebuie să folosiți pelicula de transfer din polistiren (hârtia de transfer nu este bună deoarece cerneala nu se imprimă) și avem nevoie de cerneală specială și creioane scumpe pentru a obține rezultate satisfăcătoare. Capetele de scriere au nevoie de curățare frecventă și se înfundă foarte ușor.

Imprimante cu cerneală: reprezintă o metodă atât de ieftină încât merită încercată cu cât mai multe tipuri de mediu de imprimare, dar nu vă așteptați la aceeași calitate pe care o obținem de la o imprimantă laser. Principala problemă va fi obținerea unui negru destul de opac. Este posibil să încercăm o imprimantă cu cerneală și pentru imprimarea pe hârtie, care în cele din urmă poate fi fotocopiată pe hârtie de transfer cu ajutorul unui fotocopiator de bună calitate.

Imprimante laser: reprezintă cea mai bună soluție. Ne-o putem permite, este rapidă și are o calitate bună. Imprimanta ce este folosită trebuie să aibă o rezoluție de cel putin 600 dpi pentru toate PCB-urile, deoarece vom lucra în mod normal cu multipli de 0.025’’(40 de linii/inch). 300 dpi nu se împarte la 40, 600 dpi se împarte așa că vom obține o distanță constantă și o lățime a liniilor bună. Este foarte important că imprimanta să producă un negru opac fără găuri lăsate de toner. Dacă plănuim să cumpărăm o imprimantă pentru a o folosi la PCB-uri, facem câteva teste de imprimare pe hârtie de transfer pentru a vedea rezultatele. Dacă imprimanta are o setare pentru densitate, o setăm la cea mai mare valoare. Chiar și cele mai bune imprimante laser nu acopera bine zone mari (de exemplu, zone pentru împământare), dar aceasta nu este de obicei o problemă atâta timp cât liniile trasate sunt solide. Atunci când folosim hârtie de transfer sau pelicula de transfer, alimentăm imprimanta manual și setăm calea de ieșire cea mai directă pentru a pastra desenul cât mai plat posibil și a minimiza blocarea. Pentru plăci PCB mici, ținem aminte că putem economisi hârtie tăind-o în două (tăiem o hartie de A4 în două de A5); este posibil să facem o setare în cadrul programului PCB-ului de a desena vertical și astfel imprimând pe partea corectă a paginii. Unele imprimante laser au acuratețe dimensională proastă ceea ce duce la probleme pentru PCB-uri mai mari dar atâta timp cât orice eroare este de ordin liniar (de exemplu, nu variază de-a lungul paginii), poate fi compensată prin reglarea programului de imprimare. Singura dată când acuratețea imprimării poate fi vizibilă este atunci când este cauzată de proasta liniere a părților pentru PCB-urile ce sunt imprimate pe ambele părți – acest lucru se poate evita prin aranjarea cu grijă a hârtiei pentru a vă asigura ca eroarea este aceeași pe ambele părți.

Typesetters: pentru o peliculă de bună calitate, realizăm un fișier PostScript și îl ducem la un DTP sau la un serviciu de imprimare, și solicităm să se facă un film dupa acesta. Aceasta va avea o rezoluție de cel putin 2400 dpi, va fi de un negru absolut opac și va avea o bună acuratețe. Costul este “per pagină”, indiferent de suprafața folosită, așa că dacă putem face să intre mai multe modele de PCB sau ambele părți ale unui PCB pe aceeași foaie, vom economisi bani. Aceasta este o metoda buna de a realiza PCB-urile mai mari care nu pot fi imprimate cu ajutorul imprimantei laser. De obicei, imprimările de marimea A3 sunt disponibile cam la toate centrele iar cele mai mari la cateva centre specializate. Peliculele realizate în acest mod sunt destul de bune pentru producția PCB-urilor.

Expunerea

Placa sensibilă la lumină trebuie să fie expusă la lumina ultravioletă prin intermediul peliculei folosind o camera de expunere ultravioletă. Unitațile de expunere ultraviolete pot fi realizate usor, folosind becuri fluorescente sau neoane cu ultraviolete. Pentru PCB-urile mici, 2 sau 4 neoane de 8 watti sunt potrivite, pentru unităti mai mari(A3), 4 tuburi de 15 watti sunt ideale. Pentru a determina distanța dintre neon și sticlă, amplasați o foaie de hârtie de transfer pe suprafața de sticlă și ajustați distanța pentru a obține cel mai uniform nivel de lumină pe întreaga suprafață a hârtiei. Iluminarea uniformă este mai ușor de obținut la unitatile ce folosesc 4 neoane. Neoanele ultraviolete de care avem nevoie sunt acelea vândute ca piese de schimb pentru unități de expunere ultraviolete, aparate de neutralizat insecte sau neoane “cu lumina neagră” pentru discoteci. Acestea au un aspect alb sau ocazional negru/albastru atunci când sunt oprite și luminează cu o culoare purpurie care face hârtia fluorescentă să strălucească puternic. Nu se folosesc lămpi cu ultraviolete de unde scurte, cum ar fi tuburile de stergere EPROM care au sticla clară – acestea emit ultraviolete de unde scurte care pot afecta ochii și pielea. Un temporizator care oprește lămpile cu ultraviolete automat este esențial și ar trebui să permită expuneri de la 2 la 10 minute cu creșteri consecutive de 15-30 de secunde.

Este foarte util ca temporizatorul să aibă un indicator sonor pentru a semnaliza sfârșitul perioadei de expunere. Un temporizator de la un cuptor de microunde mai vechi ar fi ideal. Expunerea ochilor pe timp scurt la lumina ultravioletă nu este dăunatoare dar poate cauza disconfort mai ales pentru neoanele mari. Folosim un strat de sticlă decât unul de plastic pentru suprafața superioară a unității deoarece va flexa mai puțin și se zgârie mai greu. Dacă realizăm multe PCB-uri pe 2 părti, este de dorit să facem o unitate de expunere pentru ambele părti unde PCB-ul poate fi schimbat între cele 2 surse de lumină pentru a expune ambele părti simultan. Va trebui sa facem experimente pentru a găsi timpul de expunere necesar pentru o anumită unitate cu ultraviolete și cu un anumit tip de placă laminată, expunând o piesa de testare între 2 și 8 minute cu creșteri consecutive de 30 de secunde; notăm și folosim timpul care a dat cea mai bună imagine. În general, expunerea îndelungată este mai bună decât o expunere insuficientă. Pentru o PCB cu o singură parte, amplasăm pelicula cu desenul cu fața în sus pe sticla unității, îndepărtăm pelicula protectivă de pe placă și o plasăm cu partea sensibilă la lumină deasupra peliculei cu desen. Placa laminată trebuie să fie aplasată ferm pentru a asigura o suprafață de contact bună, acest lucru fiind realizat prin amplasarea de greutăți deasupra plăcii sau prin montarea unui capac căptușit cu spumă care poate fi folosit pentru a strânge placa PCB și pelicula. Pentru a expune un PCB cu două fețe, mai întâi imprimăm desenul principal după care imprimăm cel de-al doilea desen în “oglindă”. Aplasăm împreună cele două filme, cu partea imprimată în sus, și aliniați-le cu grijă, verificând toată suprafața folosindu-vă de găurile din placă. Un dispozitiv ce iluminează este foarte util în acest caz, dar alinierea se poate face și la lumina zilei, ținând cele două imagini pe suprafața unei ferestre. Dacă erorile de imprimare au cauzat o mică problemă, aliniați desenele astfel încât erorile să fie uniforme pe toată suprafața PCB-ului, pentru a evita distrugearea liniilor atunci când găurim. Când sunt corect aliniate, capsăm cele două desene la capete opuse, la 10mm de margine, formând o mânecă sau un plic. Spațiul dintre marginea foii și capse este foarte important pentru a impiedica distorsionarea marginii. Folosim cel mai mic capsator pe care îl găsim, astfel încât grosimea capsei să nu fie mai mare decât cea a PCB-ului. Dacă nu avem o unitate de expunere pe două părți, expunem fiecare parte, acoperind partea superioară cu o protecție rezistentă la lumină. După expunere putem vedea un model slab în stratul de suprafață.

Developarea

După expunere, trebuie să îndepărtăm pelicula sintetizată pentru a îndepărta surplusul de cupru. Acest proces este numit developare. Printre soluțiile posibile pentru developare se numără:

Hidroxid de sodium – este o alegere proastă, este o soluție foarte nepotrivită pentru developare. Este caustic, foarte sensibil la temperatură și concentrație, iar soluția preparată nu durează mult. Dacă este prea slabă, nu developează deloc, dacă este prea puternică îndepărtează tot stratul de cupru. Este aproape imposibil să obținem rezultate bune, consecvente, mai ales dacă developăm plăcile într-un mediu ce prezintă variații de temperatură.

Produse pe baza de silicat – acestea vin sub formă lichidă, și sunt concentrate. Această solutie are avantaje imense, pricipalul fiind că este foarte greu să se realizeze un proces de developare a întregului strat de cupru. Putem lăsa placa la developat de mai multe ori, fără a observa o degradare. Asta înseamnă că soluția nu este afectată de temperatură, și nu există riscul de exfoliere în cazul unei temperaturi mai ridicate. Soluția preparată are o durată de viață îndelungată, și rezistă până când este folosită, soluția concentrată rezistând cel puțin câțiva ani. Datorită faptului că nu există pericolul îndepărtării și modelului de circuit imprimat pe placă, putem face soluția de o concentrare mai ridicată pentru a obține un timp de developare mai scurt. Amestecul recomandat este o parte soluție concentrată, 9 părți apă, dar o putem face și mai puternică pentru o developare mai rapidă. Putem verifica, că soluția de developare este corespunzatoare, prin înmuierea plăcii în clorura ferică pentru o perioada foarte scurtă de timp, cuprul ce este expus ar trebui să devină roz pal imediat. Dacă zone pe placă rămân strălucitoare, clătim și apoi înmuiem din nou în soluție pentru câteva momente. Dacă placa a fost expusă prea puțin, vom obține un strat subțire ce nu va fi îndepărtat de către substanța developantă. Putem îndepărta acest strat stergându-l cu un șervețel de hârtie, care este destul de abraziv pentru a îndepărta pelicula fără a afecta modelul. Putem folosi ori o tavă de developare sau un rezervor vertical; o tava ne permite să vedem mai ușor evoluția procesului. Nu avem nevoie de o tavă încălzită, decât în cazul în care soluția este cu adevărat rece (<15°).

Gravarea directă

Tonerul pulverizat de imprimanta laser are în compoziție o cantitate mare de plastic, care este rezistent la gravare. De când imprimantele laser au apărut, toată lumea a încercat să găsească o metodă de transfer a desenului de pe calculator direct pe placă. Mai întâi, imprimăm desenul pe o hârtie de transfer specială prin intermediul imprimantei laser. Punem apoi desenul cu fața în jos peste o placă nouă după care dăm cu fierul de călcat peste ea pentru un minut sau două. Apoi, placa este introdusă într-o baie de apă ce dizolvă învelișul special permițând hârtiei să se depărteze lăsând tonerul pe placă. Suntem gata de gravare!

Putem încerca să folosim hârtie normală, dar rezultatele nu sunt aceleași. Această metodă este simplă și ieftină, dar nu este recomandată pentru circuitele complexe.

Finisarea – Curățarea

Pentru a putea continua cu alte procese trebuie să curățăm placa. Mizeria va pune piedici în calea realizării operațiilor dorite, astfel este necesar să ne asigurăm că placa nu are urme de grăsime, oxidare sau alte probleme. Nu curățăm placa decât atunci când suntem gata să dăm găurile sau să facem alte operatii, deoarece stratul de la suprafață protejează împotriva oxidării.

Folosim acetone sau spirt pentru a îndepărta acest strat. Curățăm placa cu vată sau cu un burete moale. După aceea clătim placa cu apă și săpun. Avem grijă să îndepărtăm toate urmele de săpun. Uscăm bine folosind o cârpă ce nu lasă scame. Avem grijă să îndepărtăm toate așchiile de pe margine, ce ar putea apărea în urma procesului de tăiere sau decupare. De obicei plăcile au tendința de a se oxida dupa câteva luni, mai ales dacă s-au lăsat amprente pe ele, dar stratul de cupru poate fi curățat folosind un burete abraziv ce îi va reda strălucirea. Se mai poate folosi pentru curățare și o perie cu peri de fibră de sticlă, dar aceasta are tendința de a lăsa în urmă particule mici ce cauzează iritații. După curățare ștergem cu o cârpă înmuiată în solvent de curățare, ce va îndepărta toate urmele de grăsime. După ce am pregătit suprafața evităm contactul cu aceasta pe cât posibil.

Cositorirea

Cositorirea unei suprafețe a plăcii face ca aplicarea componentelor să decurgă mult mai ușor. Singura soluție pentru realizarea acestei operații este metoda chimică, asta dacă nu avem la dispoziție echipament specializat. Din păcate, substanțele folosite pentru cositorire sunt destul de scumpe, dar rezultatele merită efortul. Dacă nu vom cositori suprafața plăcii, fie nu îndepărtăm stratul protector și pulverizăm placa cu o soluție ce este menită să împiedice oxidarea circuitelor. Vom folosi cristale de cositor, la temperatura camerei care dau un rezultat bun în câteva minute. Clătim și curățăm bine placa înainte de cositorire. În cazul în care soluția veche nu mai cositorește nu o adăugăm la soluția nouă, folosim doar soluția proaspăt preparată.

Pregatirea plăcii este o operație importantă pentru a obține un rezultat bun. Curățăm pelicula protectoare folosind spirt. Ținem placa, turnăm spirt și apoi o înclinăm pentru a permite soluției să curgă. Așteptăti 10 secunde după care putem șterge suprafața cu o cârpă îmbibată în spirt. Apoi ștergem suprafața cu vată minerală pentru a obține rezultatul dorit.

Cuprul ar trebui să capete o culoare argintie după 30 de secunde, și este indicat să lăsăm placa în soluție pentru 5 minute, agitând ocazional. Dacă avem placa imprimată pe ambele părți, ne asigurăm că aceasta este într-un unghi înclinat pentru ca soluția să ajungă peste tot.

Clătim placa bine și ștergem cu un prosop de hârtie pentru a ne asigura că nu au rămas reziduuri de cristale care pot strica finisajul.

Găurirea

Pentru a face o gaură în placa de circuite avem nevoie de o mașină de găurit, de un stand și de burghie. Pentru a da găuri în plăci din fibră de sticlă trebuie să folosim burghie speciale cu cap de wolfram deoarece fibra de sticlă distruge repede burghiile obișnuite. Burghiele speciale sunt foarte scumpe, iar cele subțiri au tendința de a se rupe ușor. Atunci când folosim aceste burghie este foarte important să ținem placa fixă deoarece acestea au tendița să ridice placa imediat cum găuresc întreaga secțiune, astfel ducând la ruperea burghiului.

De asemenea avem nevoie de o lumină bună, fiind indicat să ridicăm suprafața de lucru cu 15 cm pentru a avea o poziție mai bună. Aspiratorul de praf este un lucru bun, dar nu esențial. Mărimea tipică a unei găuri este de 0.8mm. Există și diode mai mari ce folosesc găuri de 1.0 mm. Întotdeauna este bine să avem 2 burghie de rezervă.

Decuparea

Pentru a tăia placa putem folosi mai multe dispozitive:

Fierăstraie obișnuite: trebuie să aibă dinții tratați pentru a evita îndoirea. Praful poate cauza iritarea pielii. Este, de asemenea, posibil să zgârâiem în mod accidental pelicula protectivă ducând astfel la distrugerea unor circute ce se află pe margine.

Ghilotina: este o metodă folositoare, dar greu de utilizat pentru tăierea plăcilor din fibră de sticlă. Putem folosi și o ghilotină de tăiat metalul, dar condiția esențială este să avem un tăiș bine ascuțit.Pentru a face decupaje, dăm mai multe găuri mici, îndepărtăm centrul și finisăm conform mărimii dorite. După realizarea tuturor operațiilor putem aplica un strat protectiv. Procesul de aplicare este același cu cel al imprimării unui tricou și este destinat pentru a proteja placa de umezeală. De obicei stratul protectiv are culoarea verde, deși și alte culori sunt disponibile.

Lipirea

Lipirea este procesul de prindere al componentelor de placă. Este folosit pentru a topi fludorul și a lipi componenta de stratul conductor de cupru.

Proiectarea schemei electrice

Pentru realizarea unui aparat electronic un pas foarte important îl deține proiectarea schemei electrice. Punctul de plecare în realizarea proiectării shemei electrice detaliate, este gruparea sau modularea fiecărei părți a întregului dispozitiv sub forma unui montaj general numit schema bloc.Fiecare bloc din schemă va purta numele celei mai importante componente și efectul pe care îl produce. Următorul pas constă în dezvoltarea fiecărui modul în parte și îmbinarea acestora astfel încât multitudinea de blocuri și schemele acestora să devină una singură, numită schemă electrică generală. Pentru proiectarea ei se pot folosi interfețe software specializate ce dețin în structura lor de date, librării cu componente electronice sortate, denumirea lor și asignarea terminalelor. Astfel de interfețe software de proiectare a schemelor electrice, dar și a cablajelor sunt:

PCB layout, OrCAD, Eagle, Target3001, Proteus, etc.

Diferența între interfețele software de proiectare o reprezintă gradul de complexitate.

Interfața software de proiectare folosită de mine este Eagle v4.03.

Figura 1.11 Schema electrică a montajului

Proiectarea cablajului (PCB)

Ca și proiectarea schemei electrice, proiectarea cablajelor este un alt pas foarte important pentru realizarea unui dispozitiv electronic.Pentru proiectarea cablajelor este nevoie de știut tipul capsulelor folosite și dimensiunea lor. Componentele trebuie amplasate cât mai bine strategic astfel încât traseele să fie cât mai scurte și să se evite șerpuirea lor pentru a nu apărea fenomenul de bobină. Cablajele se pot proiecta și realiza în mai multe metode după complexitatea dispozitivelor și anume:

Pe un singur strat – ceea ce înseamnă că traseele sunt doar pe o singură suprafață a plăcii ;

Pe două straturi – traseele apar pe ambele fețe ale plăcii,

Multistrat – prezența traseelor sunt atât pe cele două suprafețe ale plăcii, cât și prin interiorul ei.

CAPITOLUL III

Proiectarea informatică

Proiectarea codului sursă pentru programarea microcontroller-ului. Așa cum pentru proiectarea hardware avem nevoie de o interfață software, și pentru proiectarea codului sursă avem nevoie de o interfață software în care se scriu liniile de program. Softul utilizat în lucrarea de față se numește MikroPascal, are algoritmi de programare asemănători cu cei ai Pascal-ului, generează la compilare fișiere *.asm, *. Pps, *.hex.

Fig1.12 Schema logică

Codul sursă pentru programarea microcontroller-ului PIC 16F887

program Semafor;

// LCD module connections

var LCD_RS : sbit at RB4_bit;

var LCD_EN : sbit at RB5_bit;

var LCD_D4 : sbit at RB0_bit;

var LCD_D5 : sbit at RB1_bit;

var LCD_D6 : sbit at RB2_bit;

var LCD_D7 : sbit at RB3_bit;

var LCD_RS_Direction : sbit at TRISB4_bit;

var LCD_EN_Direction : sbit at TRISB5_bit;

var LCD_D4_Direction : sbit at TRISB0_bit;

var LCD_D5_Direction : sbit at TRISB1_bit;

var LCD_D6_Direction : sbit at TRISB2_bit;

var LCD_D7_Direction : sbit at TRISB3_bit;

// End LCD module connections

var txt1 : array[8] of char;

txt2 : array[8] of char;

timp1,timp2 : array[3] of char;

rn,vn,ra,va : byte;

i,j : byte;

label stby,pwr,runr,runv,rung,normal1,normal2,normal3,rapr,rapv,rapg;

label rapid1,rapid2,rapid3,atentie,galben;

begin

PORTC := $04; // Initialize PORTC

PWM1_Init(400); // Initialize PWM module, freq = 400Hz.

PWM1_Start(); // Start PWM

TRISC := 0;

TRISD := $FF;

TRISE := 0;

PORTB := 0xFF;

TRISB := 0xFF;

PORTD := $FF;

PORTE := 0;

ANSEL := 0; // Configure AN pins as digital I/O

ANSELH := 0;

rn := 10; vn := 10; i := 0; j:= 0;

Lcd_Init(); // Initialize LCD

Lcd_Cmd(_LCD_CLEAR); // Clear display

Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

LCD_Out(1,1,txt1); // Write text in first row

LCD_Out(2,1,txt2); // Write text in second row

Delay_ms(2000);

Lcd_Init(); // Initialize LCD

Lcd_Cmd(_LCD_CLEAR); // Clear display

Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

LCD_Out(1,1,txt1); // Write text in first row

LCD_Out(2,1,txt2); // Write text in second row

stby:

i := 0;

Delay_us(2500);

Inc(j);

PWM1_Set_Duty(j); // Change duty ratio

txt1 := ' Power ';

txt2 := 'offline ';

LCD_Out(1,1,txt1); // Write text in first row

LCD_Out(2,1,txt2); // Write text in second row

if PORTD = 1 then

begin

Delay_ms(500);

goto pwr;

end;

PORTE := 0;

goto stby;

pwr:

txt1 := ' Power ';

txt2 := ' online ';

LCD_Out(1,1,txt1); // Write text in first row

LCD_Out(2,1,txt2); // Write text in second row

Delay_ms(1000);

//*************************************************************

// Normal

//*************************************************************

runr:

Delay_ms(500);

rn := 10; vn := 10;

if PORTD = 4 then goto rapr;

if PORTD = 8 then goto rapr;

if PORTD = 12 then goto rapr;

if PORTD = 2 then goto atentie;

normal1:

rn := rn-1;

vn := vn-1;

i := 130;

Delay_us(2500);

Inc(j);

PWM1_Set_Duty(j); // Change duty ratio

PORTE := 1;

Delay_ms(1000);

txt1 := 'R:[ ]s';

txt2 := 'V:[ ]s';

LCD_Out(1,1,txt1); // Write text in first row

LCD_Out(2,1,txt2); // Write text in second row

ByteToStr(rn, timp1);

ByteToStr(vn, timp2);

LCD_Out(1,6,timp1); // Write text in first row

LCD_Out(2,6,timp2); // Write text in second row

if PORTD = 4 then goto rapr;

if PORTD = 8 then goto rapr;

if PORTD = 12 then goto rapr;

if PORTD = 2 then goto atentie;

if PORTD = 1 then

begin

Delay_ms(500);

goto stby;

end;

if rn > 0 then goto normal1;

if rn = 0 then goto runv;

//____________________________________________________________

runv:

Delay_ms(500);

rn := 10; vn := 10;

if PORTD = 4 then goto rapr;

if PORTD = 8 then goto rapr;

if PORTD = 12 then goto rapr;

if PORTD = 2 then goto atentie;

normal2:

rn := rn-1;

vn := vn-1;

i := 130;

Delay_us(2500);

Inc(j);

PWM1_Set_Duty(j); // Change duty ratio

PORTE := 4;

Delay_ms(1000);

txt1 := 'R:[ ]s';

txt2 := 'V:[ ]s';

LCD_Out(1,1,txt1); // Write text in first row

LCD_Out(2,1,txt2); // Write text in second row

ByteToStr(rn, timp1);

ByteToStr(vn, timp2);

LCD_Out(1,6,timp1); // Write text in first row

LCD_Out(2,6,timp2); // Write text in second row

if PORTD = 4 then goto rapr;

if PORTD = 8 then goto rapr;

if PORTD = 12 then goto rapr;

if PORTD = 2 then goto atentie;

if PORTD = 1 then

begin

Delay_ms(500);

goto stby;

end;

if rn > 0 then goto normal2;

if rn = 0 then goto rung;

//_____________________________________________________________

rung:

Delay_ms(500);

rn := 3; vn := 3;

if PORTD = 4 then goto rapr;

if PORTD = 8 then goto rapr;

if PORTD = 12 then goto rapr;

if PORTD = 2 then goto atentie;

normal3:

rn := rn-1;

vn := vn-1;

i := 130;

Delay_us(2500);

Inc(j);

PWM1_Set_Duty(j); // Change duty ratio

PORTE := 2;

Delay_ms(1000);

txt1 := 'R:[ ]s';

txt2 := 'V:[ ]s';

LCD_Out(1,1,txt1); // Write text in first row

LCD_Out(2,1,txt2); // Write text in second row

ByteToStr(rn, timp1);

ByteToStr(vn, timp2);

LCD_Out(1,6,timp1); // Write text in first row

LCD_Out(2,6,timp2); // Write text in second row

if PORTD = 4 then goto rapr;

if PORTD = 8 then goto rapr;

if PORTD = 12 then goto rapr;

if PORTD = 2 then goto atentie;

if PORTD = 1 then

begin

Delay_ms(500);

goto stby;

end;

if rn > 0 then goto normal3;

if rn = 0 then goto runr;

//********************************************************************

// Rapid

//********************************************************************

rapr:

Delay_ms(500);

rn := 5; vn := 5;

if PORTD = 0 then goto runr;

if PORTD = 2 then goto atentie;

rapid1:

rn := rn-1;

vn := vn-1;

i := 130;

Delay_us(2500);

Inc(j);

PWM1_Set_Duty(j); // Change duty ratio

PORTE := 1;

Delay_ms(1000);

txt1 := 'R:[ ]s';

txt2 := 'V:[ ]s';

LCD_Out(1,1,txt1); // Write text in first row

LCD_Out(2,1,txt2); // Write text in second row

ByteToStr(rn, timp1);

ByteToStr(vn, timp2);

LCD_Out(1,6,timp1); // Write text in first row

LCD_Out(2,6,timp2); // Write text in second row

if PORTD = 0 then goto runr;

if PORTD = 2 then goto atentie;

if PORTD = 1 then

begin

Delay_ms(500);

goto stby;

end;

if rn > 0 then goto rapid1;

if rn = 0 then goto rapv;

//____________________________________________________________

rapv:

Delay_ms(500);

rn := 5; vn := 5;

if PORTD = 0 then goto runr;

if PORTD = 2 then goto atentie;

rapid2:

rn := rn-1;

vn := vn-1;

i := 130;

Delay_us(2500);

Inc(j);

PWM1_Set_Duty(j); // Change duty ratio

PORTE := 4;

Delay_ms(1000);

txt1 := 'R:[ ]s';

txt2 := 'V:[ ]s';

LCD_Out(1,1,txt1); // Write text in first row

LCD_Out(2,1,txt2); // Write text in second row

ByteToStr(rn, timp1);

ByteToStr(vn, timp2);

LCD_Out(1,6,timp1); // Write text in first row

LCD_Out(2,6,timp2); // Write text in second row

if PORTD = 0 then goto runr;

if PORTD = 2 then goto atentie;

if PORTD = 1 then

begin

Delay_ms(500);

goto stby;

end;

if rn > 0 then goto rapid2;

if rn = 0 then goto rapg;

//_____________________________________________________________

rapg:

Delay_ms(500);

rn := 2; vn := 2;

if PORTD = 0 then goto runr;

if PORTD = 2 then goto atentie;

rapid3:

rn := rn-1;

vn := vn-1;

i := 130;

Delay_us(2500);

Inc(j);

PWM1_Set_Duty(j); // Change duty ratio

PORTE := 2;

Delay_ms(1000);

txt1 := 'R:[ ]s';

txt2 := 'V:[ ]s';

LCD_Out(1,1,txt1); // Write text in first row

LCD_Out(2,1,txt2); // Write text in second row

ByteToStr(rn, timp1);

ByteToStr(vn, timp2);

LCD_Out(1,6,timp1); // Write text in first row

LCD_Out(2,6,timp2); // Write text in second row

if PORTD = 0 then goto runr;

if PORTD = 2 then goto atentie;

if PORTD = 1 then

begin

Delay_ms(500);

goto stby;

end;

if rn > 0 then goto rapid3;

if rn = 0 then goto rapr;

//****************************************************************

// Atentie

//****************************************************************

atentie:

Delay_ms(500);

if PORTD = 2 then goto runr;

galben:

i := 0;

Delay_us(2500);

Inc(j);

PWM1_Set_Duty(j); // Change duty ratio

PORTE := 2;

Delay_ms(500);

PORTE := 0;

Delay_ms(500);

txt1 := 'ATENTIE!';

txt2 := ' ';

LCD_Out(1,1,txt1); // Write text in first row

LCD_Out(2,1,txt2); // Write text in second row

if PORTD = 14 then goto runr;

if PORTD = 6 then goto runr;

if PORTD = 10 then goto runr;

if PORTD = 2 then goto runr;

if PORTD = 13 then

begin

Delay_ms(500);

goto stby;

end;

if PORTD = 5 then

begin

Delay_ms(500);

goto stby;

end;

if PORTD = 9 then

begin

Delay_ms(500);

goto stby;

end;

if PORTD = 1 then

begin

Delay_ms(500);

goto stby;

end;

goto galben;

end.

Interfața software de programare IC-Prog v1.05c

IC-Prog este un program executabil care se va configura la prima lansare, așa cum se observă în figura de mai jos (pentru Win98 se setează la Interface, Direct I/O, pentru WinXP se setează Windows API). Este disponibil și în limba română.

În ce privește programarea, se alege tipul de componentă din « Setings » și apoi « Devices »

Se deschide meniul « File » pentru a selecta (« OpenFile ») fișierul « .hex » ce se dorește a fi scris. Se pot alege manual opțiunile (vizibile) de configurare, specifice fiecărui tip de microcontroler:

CP – Code Protect – Protecția datelor scrise, rescrierea este permisă;

WDT – Watchdog Timer;

PWRT – Power Up Timer;

Oscilator – LP – low power, cristal pentru frecvența de lucru cuprinsă între 32KHz și 200KHz, XT – dacă aplicația utilizează un quartz cu frecvența între 455KHz și 4MHz, HS – pentru quartz 8 … 20MHz și RC – pentru oscilator cu grup RC, la aplicații unde nu se cere precizie mare.

Pentru programare se alege meniul « Command » și apoi « Program All ». După programare din același submeniu se alege « Verify ». Verificarea se poate realiza și automat dacă este setată din opțiunile programului.

CAPITOLUL IV

Concluzii

Sistemul inteligent de semaforizare are, drept scop, decongestionarea traficului din intersecțiile semaforizate. Montajul experimental propus si testat se dovedește a fi unul bun, eficient, simplu. In realitate senzorii IR vor fi înlocuiți de senzori “plantați” în carosabil, senzori cu inducție magnetică, senzori de presiune, etc.

O perspectivă a acestui modul inteligent constă în adaugarea modulelor GPS utilizate pentru a transmite informații la centrele de control trafic sau pentru a comunica între diferite puncte strategice, pentru a transmite date de avarie, condițiile de drum, accidente cat și pentru a ajuta la gestionarea traficului în acea zonă.

Bibliografie

David A.Patterson, John Hennessy "Organizarea și proiectarea calculatoarelor. Interfața hardware/software", Ed. ALL Educational, 2002, traducere Bogdan și Octavian Cărbunar

Andrew Tanenbaum "Organizarea structurata a Calculatoarelor", ed. 4, Ed. Byblos, 2004

Zoltan Francisc Baruch – Sisteme de intare/ieșire ale calculatoarelor, Ed. Albastră, Cluj Napoca, 2000

Bălan Radu, Microcontrolere – Structură și aplicații, Ed. Todesco,

Cluj-Napoca, 2002

F. Stan, E.O. Vîrjoghe, M. Ionel – Tratat de inginerie electrică, Ed. Bibliotheca, Târgoviște,2005

Dragoș Dobrescu, Adrian Rusu, Lidia Dobrescu – Dispozitive și circuite electronice, Ed. PRINTECH, 1999.

Eugenia ISAC – Măsurări electrice și electronice, București, 1993.

P. Cioară, O. Birău, R. Pârvan – Electronică, București 1983.

Bibliografie WEB

www.microchip.com

www.wikipedia.org/ manchester .code

www.audiopractik.go.ro

www.icprog.com

www.eagle.com

ANEXA 1

_main:

;Semafor.mpas,25 :: begin

;Semafor.mpas,26 :: PORTC := $04; // Initialize PORTC

MOVLW 4

MOVWF PORTC+0

;Semafor.mpas,27 :: PWM1_Init(400); // Initialize PWM module, freq = 400Hz.

BCF T2CON+0, 0

BCF T2CON+0, 1

BSF T2CON+0, 0

BSF T2CON+0, 1

MOVLW 156

MOVWF PR2+0

CALL _PWM1_Init+0

;Semafor.mpas,28 :: PWM1_Start(); // Start PWM

CALL _PWM1_Start+0

;Semafor.mpas,30 :: TRISC := 0;

CLRF TRISC+0

;Semafor.mpas,31 :: TRISD := $FF;

MOVLW 255

MOVWF TRISD+0

;Semafor.mpas,32 :: TRISE := 0;

CLRF TRISE+0

;Semafor.mpas,33 :: PORTB := 0xFF;

MOVLW 255

MOVWF PORTB+0

;Semafor.mpas,34 :: TRISB := 0xFF;

MOVLW 255

MOVWF TRISB+0

;Semafor.mpas,35 :: PORTD := $FF;

MOVLW 255

MOVWF PORTD+0

;Semafor.mpas,36 :: PORTE := 0;

CLRF PORTE+0

;Semafor.mpas,37 :: ANSEL := 0; // Configure AN pins as digital I/O

CLRF ANSEL+0

;Semafor.mpas,38 :: ANSELH := 0;

CLRF ANSELH+0

;Semafor.mpas,39 :: rn := 10; vn := 10; i := 0; j:= 0;

MOVLW 10

MOVWF _rn+0

MOVLW 10

MOVWF _vn+0

CLRF _i+0

CLRF _j+0

;Semafor.mpas,42 :: Lcd_Init(); // Initialize LCD

CALL _Lcd_Init+0

;Semafor.mpas,43 :: Lcd_Cmd(_LCD_CLEAR); // Clear display

MOVLW 1

MOVWF FARG_Lcd_Cmd_out_char+0

CALL _Lcd_Cmd+0

;Semafor.mpas,44 :: Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

MOVLW 12

MOVWF FARG_Lcd_Cmd_out_char+0

CALL _Lcd_Cmd+0

;Semafor.mpas,45 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,46 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,47 :: Delay_ms(2000);

MOVLW 11

MOVWF R11+0

MOVLW 38

MOVWF R12+0

MOVLW 93

MOVWF R13+0

L__main17:

DECFSZ R13+0, 1

GOTO L__main17

DECFSZ R12+0, 1

GOTO L__main17

DECFSZ R11+0, 1

GOTO L__main17

NOP

NOP

;Semafor.mpas,48 :: Lcd_Init(); // Initialize LCD

CALL _Lcd_Init+0

;Semafor.mpas,49 :: Lcd_Cmd(_LCD_CLEAR); // Clear display

MOVLW 1

MOVWF FARG_Lcd_Cmd_out_char+0

CALL _Lcd_Cmd+0

;Semafor.mpas,50 :: Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

MOVLW 12

MOVWF FARG_Lcd_Cmd_out_char+0

CALL _Lcd_Cmd+0

;Semafor.mpas,51 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,52 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,53 :: stby:

L__main_stby:

;Semafor.mpas,54 :: i := 0;

CLRF _i+0

;Semafor.mpas,55 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main18:

DECFSZ R13+0, 1

GOTO L__main18

DECFSZ R12+0, 1

GOTO L__main18

NOP

NOP

;Semafor.mpas,56 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,57 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,59 :: txt1 := ' Power ';

MOVLW 32

MOVWF _txt1+0

MOVLW 80

MOVWF _txt1+1

MOVLW 111

MOVWF _txt1+2

MOVLW 119

MOVWF _txt1+3

MOVLW 101

MOVWF _txt1+4

MOVLW 114

MOVWF _txt1+5

MOVLW 32

MOVWF _txt1+6

MOVLW 32

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,60 :: txt2 := 'offline ';

MOVLW 111

MOVWF _txt2+0

MOVLW 102

MOVWF _txt2+1

MOVLW 102

MOVWF _txt2+2

MOVLW 108

MOVWF _txt2+3

MOVLW 105

MOVWF _txt2+4

MOVLW 110

MOVWF _txt2+5

MOVLW 101

MOVWF _txt2+6

MOVLW 32

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,61 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,62 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,63 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main20

;Semafor.mpas,65 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main22:

DECFSZ R13+0, 1

GOTO L__main22

DECFSZ R12+0, 1

GOTO L__main22

DECFSZ R11+0, 1

GOTO L__main22

NOP

NOP

;Semafor.mpas,66 :: goto pwr;

GOTO L__main_pwr

;Semafor.mpas,67 :: end;

L__main20:

;Semafor.mpas,68 :: PORTE := 0;

CLRF PORTE+0

;Semafor.mpas,69 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,71 :: pwr:

L__main_pwr:

;Semafor.mpas,72 :: txt1 := ' Power ';

MOVLW 32

MOVWF _txt1+0

MOVLW 80

MOVWF _txt1+1

MOVLW 111

MOVWF _txt1+2

MOVLW 119

MOVWF _txt1+3

MOVLW 101

MOVWF _txt1+4

MOVLW 114

MOVWF _txt1+5

MOVLW 32

MOVWF _txt1+6

MOVLW 32

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,73 :: txt2 := ' online ';

MOVLW 32

MOVWF _txt2+0

MOVLW 111

MOVWF _txt2+1

MOVLW 110

MOVWF _txt2+2

MOVLW 108

MOVWF _txt2+3

MOVLW 105

MOVWF _txt2+4

MOVLW 110

MOVWF _txt2+5

MOVLW 101

MOVWF _txt2+6

MOVLW 32

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,74 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,75 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,76 :: Delay_ms(1000);

MOVLW 6

MOVWF R11+0

MOVLW 19

MOVWF R12+0

MOVLW 173

MOVWF R13+0

L__main23:

DECFSZ R13+0, 1

GOTO L__main23

DECFSZ R12+0, 1

GOTO L__main23

DECFSZ R11+0, 1

GOTO L__main23

NOP

NOP

;Semafor.mpas,80 :: runr:

L__main_runr:

;Semafor.mpas,81 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main24:

DECFSZ R13+0, 1

GOTO L__main24

DECFSZ R12+0, 1

GOTO L__main24

DECFSZ R11+0, 1

GOTO L__main24

NOP

NOP

;Semafor.mpas,82 :: rn := 10; vn := 10;

MOVLW 10

MOVWF _rn+0

MOVLW 10

MOVWF _vn+0

;Semafor.mpas,83 :: if PORTD = 4 then goto rapr;

MOVF PORTD+0, 0

XORLW 4

BTFSS STATUS+0, 2

GOTO L__main26

GOTO L__main_rapr

L__main26:

;Semafor.mpas,84 :: if PORTD = 8 then goto rapr;

MOVF PORTD+0, 0

XORLW 8

BTFSS STATUS+0, 2

GOTO L__main29

GOTO L__main_rapr

L__main29:

;Semafor.mpas,85 :: if PORTD = 12 then goto rapr;

MOVF PORTD+0, 0

XORLW 12

BTFSS STATUS+0, 2

GOTO L__main32

GOTO L__main_rapr

L__main32:

;Semafor.mpas,86 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main35

GOTO L__main_atentie

L__main35:

;Semafor.mpas,87 :: normal1:

L__main_normal1:

;Semafor.mpas,88 :: rn := rn-1;

DECF _rn+0, 1

;Semafor.mpas,89 :: vn := vn-1;

DECF _vn+0, 1

;Semafor.mpas,90 :: i := 130;

MOVLW 130

MOVWF _i+0

;Semafor.mpas,91 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main37:

DECFSZ R13+0, 1

GOTO L__main37

DECFSZ R12+0, 1

GOTO L__main37

NOP

NOP

;Semafor.mpas,92 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,93 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,94 :: PORTE := 1;

MOVLW 1

MOVWF PORTE+0

;Semafor.mpas,95 :: Delay_ms(1000);

MOVLW 6

MOVWF R11+0

MOVLW 19

MOVWF R12+0

MOVLW 173

MOVWF R13+0

L__main38:

DECFSZ R13+0, 1

GOTO L__main38

DECFSZ R12+0, 1

GOTO L__main38

DECFSZ R11+0, 1

GOTO L__main38

NOP

NOP

;Semafor.mpas,97 :: txt1 := 'R:[ ]s';

MOVLW 82

MOVWF _txt1+0

MOVLW 58

MOVWF _txt1+1

MOVLW 91

MOVWF _txt1+2

MOVLW 32

MOVWF _txt1+3

MOVLW 32

MOVWF _txt1+4

MOVLW 32

MOVWF _txt1+5

MOVLW 93

MOVWF _txt1+6

MOVLW 115

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,98 :: txt2 := 'V:[ ]s';

MOVLW 86

MOVWF _txt2+0

MOVLW 58

MOVWF _txt2+1

MOVLW 91

MOVWF _txt2+2

MOVLW 32

MOVWF _txt2+3

MOVLW 32

MOVWF _txt2+4

MOVLW 32

MOVWF _txt2+5

MOVLW 93

MOVWF _txt2+6

MOVLW 115

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,99 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,100 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,101 :: ByteToStr(rn, timp1);

MOVF _rn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp1+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,102 :: ByteToStr(vn, timp2);

MOVF _vn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp2+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,103 :: LCD_Out(1,6,timp1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,104 :: LCD_Out(2,6,timp2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,105 :: if PORTD = 4 then goto rapr;

MOVF PORTD+0, 0

XORLW 4

BTFSS STATUS+0, 2

GOTO L__main40

GOTO L__main_rapr

L__main40:

;Semafor.mpas,106 :: if PORTD = 8 then goto rapr;

MOVF PORTD+0, 0

XORLW 8

BTFSS STATUS+0, 2

GOTO L__main43

GOTO L__main_rapr

L__main43:

;Semafor.mpas,107 :: if PORTD = 12 then goto rapr;

MOVF PORTD+0, 0

XORLW 12

BTFSS STATUS+0, 2

GOTO L__main46

GOTO L__main_rapr

L__main46:

;Semafor.mpas,108 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main49

GOTO L__main_atentie

L__main49:

;Semafor.mpas,109 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main52

;Semafor.mpas,111 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main54:

DECFSZ R13+0, 1

GOTO L__main54

DECFSZ R12+0, 1

GOTO L__main54

DECFSZ R11+0, 1

GOTO L__main54

NOP

NOP

;Semafor.mpas,112 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,113 :: end;

L__main52:

;Semafor.mpas,114 :: if rn > 0 then goto normal1;

MOVF _rn+0, 0

SUBLW 0

BTFSC STATUS+0, 0

GOTO L__main56

GOTO L__main_normal1

L__main56:

;Semafor.mpas,115 :: if rn = 0 then goto runv;

MOVF _rn+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main59

GOTO L__main_runv

L__main59:

;Semafor.mpas,117 :: runv:

L__main_runv:

;Semafor.mpas,118 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main61:

DECFSZ R13+0, 1

GOTO L__main61

DECFSZ R12+0, 1

GOTO L__main61

DECFSZ R11+0, 1

GOTO L__main61

NOP

NOP

;Semafor.mpas,119 :: rn := 10; vn := 10;

MOVLW 10

MOVWF _rn+0

MOVLW 10

MOVWF _vn+0

;Semafor.mpas,120 :: if PORTD = 4 then goto rapr;

MOVF PORTD+0, 0

XORLW 4

BTFSS STATUS+0, 2

GOTO L__main63

GOTO L__main_rapr

L__main63:

;Semafor.mpas,121 :: if PORTD = 8 then goto rapr;

MOVF PORTD+0, 0

XORLW 8

BTFSS STATUS+0, 2

GOTO L__main66

GOTO L__main_rapr

L__main66:

;Semafor.mpas,122 :: if PORTD = 12 then goto rapr;

MOVF PORTD+0, 0

XORLW 12

BTFSS STATUS+0, 2

GOTO L__main69

GOTO L__main_rapr

L__main69:

;Semafor.mpas,123 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main72

GOTO L__main_atentie

L__main72:

;Semafor.mpas,124 :: normal2:

L__main_normal2:

;Semafor.mpas,125 :: rn := rn-1;

DECF _rn+0, 1

;Semafor.mpas,126 :: vn := vn-1;

DECF _vn+0, 1

;Semafor.mpas,127 :: i := 130;

MOVLW 130

MOVWF _i+0

;Semafor.mpas,128 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main74:

DECFSZ R13+0, 1

GOTO L__main74

DECFSZ R12+0, 1

GOTO L__main74

NOP

NOP

;Semafor.mpas,129 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,130 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,131 :: PORTE := 4;

MOVLW 4

MOVWF PORTE+0

;Semafor.mpas,132 :: Delay_ms(1000);

MOVLW 6

MOVWF R11+0

MOVLW 19

MOVWF R12+0

MOVLW 173

MOVWF R13+0

L__main75:

DECFSZ R13+0, 1

GOTO L__main75

DECFSZ R12+0, 1

GOTO L__main75

DECFSZ R11+0, 1

GOTO L__main75

NOP

NOP

;Semafor.mpas,134 :: txt1 := 'R:[ ]s';

MOVLW 82

MOVWF _txt1+0

MOVLW 58

MOVWF _txt1+1

MOVLW 91

MOVWF _txt1+2

MOVLW 32

MOVWF _txt1+3

MOVLW 32

MOVWF _txt1+4

MOVLW 32

MOVWF _txt1+5

MOVLW 93

MOVWF _txt1+6

MOVLW 115

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,135 :: txt2 := 'V:[ ]s';

MOVLW 86

MOVWF _txt2+0

MOVLW 58

MOVWF _txt2+1

MOVLW 91

MOVWF _txt2+2

MOVLW 32

MOVWF _txt2+3

MOVLW 32

MOVWF _txt2+4

MOVLW 32

MOVWF _txt2+5

MOVLW 93

MOVWF _txt2+6

MOVLW 115

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,136 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,137 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,138 :: ByteToStr(rn, timp1);

MOVF _rn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp1+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,139 :: ByteToStr(vn, timp2);

MOVF _vn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp2+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,140 :: LCD_Out(1,6,timp1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,141 :: LCD_Out(2,6,timp2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,142 :: if PORTD = 4 then goto rapr;

MOVF PORTD+0, 0

XORLW 4

BTFSS STATUS+0, 2

GOTO L__main77

GOTO L__main_rapr

L__main77:

;Semafor.mpas,143 :: if PORTD = 8 then goto rapr;

MOVF PORTD+0, 0

XORLW 8

BTFSS STATUS+0, 2

GOTO L__main80

GOTO L__main_rapr

L__main80:

;Semafor.mpas,144 :: if PORTD = 12 then goto rapr;

MOVF PORTD+0, 0

XORLW 12

BTFSS STATUS+0, 2

GOTO L__main83

GOTO L__main_rapr

L__main83:

;Semafor.mpas,145 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main86

GOTO L__main_atentie

L__main86:

;Semafor.mpas,146 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main89

;Semafor.mpas,148 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main91:

DECFSZ R13+0, 1

GOTO L__main91

DECFSZ R12+0, 1

GOTO L__main91

DECFSZ R11+0, 1

GOTO L__main91

NOP

NOP

;Semafor.mpas,149 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,150 :: end;

L__main89:

;Semafor.mpas,151 :: if rn > 0 then goto normal2;

MOVF _rn+0, 0

SUBLW 0

BTFSC STATUS+0, 0

GOTO L__main93

GOTO L__main_normal2

L__main93:

;Semafor.mpas,152 :: if rn = 0 then goto rung;

MOVF _rn+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main96

GOTO L__main_rung

L__main96:

;Semafor.mpas,154 :: rung:

L__main_rung:

;Semafor.mpas,155 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main98:

DECFSZ R13+0, 1

GOTO L__main98

DECFSZ R12+0, 1

GOTO L__main98

DECFSZ R11+0, 1

GOTO L__main98

NOP

NOP

;Semafor.mpas,156 :: rn := 3; vn := 3;

MOVLW 3

MOVWF _rn+0

MOVLW 3

MOVWF _vn+0

;Semafor.mpas,157 :: if PORTD = 4 then goto rapr;

MOVF PORTD+0, 0

XORLW 4

BTFSS STATUS+0, 2

GOTO L__main100

GOTO L__main_rapr

L__main100:

;Semafor.mpas,158 :: if PORTD = 8 then goto rapr;

MOVF PORTD+0, 0

XORLW 8

BTFSS STATUS+0, 2

GOTO L__main103

GOTO L__main_rapr

L__main103:

;Semafor.mpas,159 :: if PORTD = 12 then goto rapr;

MOVF PORTD+0, 0

XORLW 12

BTFSS STATUS+0, 2

GOTO L__main106

GOTO L__main_rapr

L__main106:

;Semafor.mpas,160 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main109

GOTO L__main_atentie

L__main109:

;Semafor.mpas,161 :: normal3:

L__main_normal3:

;Semafor.mpas,162 :: rn := rn-1;

DECF _rn+0, 1

;Semafor.mpas,163 :: vn := vn-1;

DECF _vn+0, 1

;Semafor.mpas,164 :: i := 130;

MOVLW 130

MOVWF _i+0

;Semafor.mpas,165 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main111:

DECFSZ R13+0, 1

GOTO L__main111

DECFSZ R12+0, 1

GOTO L__main111

NOP

NOP

;Semafor.mpas,166 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,167 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,168 :: PORTE := 2;

MOVLW 2

MOVWF PORTE+0

;Semafor.mpas,169 :: Delay_ms(1000);

MOVLW 6

MOVWF R11+0

MOVLW 19

MOVWF R12+0

MOVLW 173

MOVWF R13+0

L__main112:

DECFSZ R13+0, 1

GOTO L__main112

DECFSZ R12+0, 1

GOTO L__main112

DECFSZ R11+0, 1

GOTO L__main112

NOP

NOP

;Semafor.mpas,171 :: txt1 := 'R:[ ]s';

MOVLW 82

MOVWF _txt1+0

MOVLW 58

MOVWF _txt1+1

MOVLW 91

MOVWF _txt1+2

MOVLW 32

MOVWF _txt1+3

MOVLW 32

MOVWF _txt1+4

MOVLW 32

MOVWF _txt1+5

MOVLW 93

MOVWF _txt1+6

MOVLW 115

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,172 :: txt2 := 'V:[ ]s';

MOVLW 86

MOVWF _txt2+0

MOVLW 58

MOVWF _txt2+1

MOVLW 91

MOVWF _txt2+2

MOVLW 32

MOVWF _txt2+3

MOVLW 32

MOVWF _txt2+4

MOVLW 32

MOVWF _txt2+5

MOVLW 93

MOVWF _txt2+6

MOVLW 115

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,173 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,174 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,175 :: ByteToStr(rn, timp1);

MOVF _rn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp1+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,176 :: ByteToStr(vn, timp2);

MOVF _vn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp2+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,177 :: LCD_Out(1,6,timp1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,178 :: LCD_Out(2,6,timp2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,179 :: if PORTD = 4 then goto rapr;

MOVF PORTD+0, 0

XORLW 4

BTFSS STATUS+0, 2

GOTO L__main114

GOTO L__main_rapr

L__main114:

;Semafor.mpas,180 :: if PORTD = 8 then goto rapr;

MOVF PORTD+0, 0

XORLW 8

BTFSS STATUS+0, 2

GOTO L__main117

GOTO L__main_rapr

L__main117:

;Semafor.mpas,181 :: if PORTD = 12 then goto rapr;

MOVF PORTD+0, 0

XORLW 12

BTFSS STATUS+0, 2

GOTO L__main120

GOTO L__main_rapr

L__main120:

;Semafor.mpas,182 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main123

GOTO L__main_atentie

L__main123:

;Semafor.mpas,183 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main126

;Semafor.mpas,185 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main128:

DECFSZ R13+0, 1

GOTO L__main128

DECFSZ R12+0, 1

GOTO L__main128

DECFSZ R11+0, 1

GOTO L__main128

NOP

NOP

;Semafor.mpas,186 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,187 :: end;

L__main126:

;Semafor.mpas,188 :: if rn > 0 then goto normal3;

MOVF _rn+0, 0

SUBLW 0

BTFSC STATUS+0, 0

GOTO L__main130

GOTO L__main_normal3

L__main130:

;Semafor.mpas,189 :: if rn = 0 then goto runr;

MOVF _rn+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main133

GOTO L__main_runr

L__main133:

;Semafor.mpas,193 :: rapr:

L__main_rapr:

;Semafor.mpas,194 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main135:

DECFSZ R13+0, 1

GOTO L__main135

DECFSZ R12+0, 1

GOTO L__main135

DECFSZ R11+0, 1

GOTO L__main135

NOP

NOP

;Semafor.mpas,195 :: rn := 5; vn := 5;

MOVLW 5

MOVWF _rn+0

MOVLW 5

MOVWF _vn+0

;Semafor.mpas,196 :: if PORTD = 0 then goto runr;

MOVF PORTD+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main137

GOTO L__main_runr

L__main137:

;Semafor.mpas,197 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main140

GOTO L__main_atentie

L__main140:

;Semafor.mpas,198 :: rapid1:

L__main_rapid1:

;Semafor.mpas,199 :: rn := rn-1;

DECF _rn+0, 1

;Semafor.mpas,200 :: vn := vn-1;

DECF _vn+0, 1

;Semafor.mpas,201 :: i := 130;

MOVLW 130

MOVWF _i+0

;Semafor.mpas,202 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main142:

DECFSZ R13+0, 1

GOTO L__main142

DECFSZ R12+0, 1

GOTO L__main142

NOP

NOP

;Semafor.mpas,203 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,204 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,205 :: PORTE := 1;

MOVLW 1

MOVWF PORTE+0

;Semafor.mpas,206 :: Delay_ms(1000);

MOVLW 6

MOVWF R11+0

MOVLW 19

MOVWF R12+0

MOVLW 173

MOVWF R13+0

L__main143:

DECFSZ R13+0, 1

GOTO L__main143

DECFSZ R12+0, 1

GOTO L__main143

DECFSZ R11+0, 1

GOTO L__main143

NOP

NOP

;Semafor.mpas,208 :: txt1 := 'R:[ ]s';

MOVLW 82

MOVWF _txt1+0

MOVLW 58

MOVWF _txt1+1

MOVLW 91

MOVWF _txt1+2

MOVLW 32

MOVWF _txt1+3

MOVLW 32

MOVWF _txt1+4

MOVLW 32

MOVWF _txt1+5

MOVLW 93

MOVWF _txt1+6

MOVLW 115

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,209 :: txt2 := 'V:[ ]s';

MOVLW 86

MOVWF _txt2+0

MOVLW 58

MOVWF _txt2+1

MOVLW 91

MOVWF _txt2+2

MOVLW 32

MOVWF _txt2+3

MOVLW 32

MOVWF _txt2+4

MOVLW 32

MOVWF _txt2+5

MOVLW 93

MOVWF _txt2+6

MOVLW 115

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,210 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,211 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,212 :: ByteToStr(rn, timp1);

MOVF _rn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp1+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,213 :: ByteToStr(vn, timp2);

MOVF _vn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp2+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,214 :: LCD_Out(1,6,timp1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,215 :: LCD_Out(2,6,timp2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,216 :: if PORTD = 0 then goto runr;

MOVF PORTD+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main145

GOTO L__main_runr

L__main145:

;Semafor.mpas,217 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main148

GOTO L__main_atentie

L__main148:

;Semafor.mpas,218 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main151

;Semafor.mpas,220 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main153:

DECFSZ R13+0, 1

GOTO L__main153

DECFSZ R12+0, 1

GOTO L__main153

DECFSZ R11+0, 1

GOTO L__main153

NOP

NOP

;Semafor.mpas,221 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,222 :: end;

L__main151:

;Semafor.mpas,223 :: if rn > 0 then goto rapid1;

MOVF _rn+0, 0

SUBLW 0

BTFSC STATUS+0, 0

GOTO L__main155

GOTO L__main_rapid1

L__main155:

;Semafor.mpas,224 :: if rn = 0 then goto rapv;

MOVF _rn+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main158

GOTO L__main_rapv

L__main158:

;Semafor.mpas,226 :: rapv:

L__main_rapv:

;Semafor.mpas,227 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main160:

DECFSZ R13+0, 1

GOTO L__main160

DECFSZ R12+0, 1

GOTO L__main160

DECFSZ R11+0, 1

GOTO L__main160

NOP

NOP

;Semafor.mpas,228 :: rn := 5; vn := 5;

MOVLW 5

MOVWF _rn+0

MOVLW 5

MOVWF _vn+0

;Semafor.mpas,229 :: if PORTD = 0 then goto runr;

MOVF PORTD+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main162

GOTO L__main_runr

L__main162:

;Semafor.mpas,230 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main165

GOTO L__main_atentie

L__main165:

;Semafor.mpas,231 :: rapid2:

L__main_rapid2:

;Semafor.mpas,232 :: rn := rn-1;

DECF _rn+0, 1

;Semafor.mpas,233 :: vn := vn-1;

DECF _vn+0, 1

;Semafor.mpas,234 :: i := 130;

MOVLW 130

MOVWF _i+0

;Semafor.mpas,235 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main167:

DECFSZ R13+0, 1

GOTO L__main167

DECFSZ R12+0, 1

GOTO L__main167

NOP

NOP

;Semafor.mpas,236 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,237 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,238 :: PORTE := 4;

MOVLW 4

MOVWF PORTE+0

;Semafor.mpas,239 :: Delay_ms(1000);

MOVLW 6

MOVWF R11+0

MOVLW 19

MOVWF R12+0

MOVLW 173

MOVWF R13+0

L__main168:

DECFSZ R13+0, 1

GOTO L__main168

DECFSZ R12+0, 1

GOTO L__main168

DECFSZ R11+0, 1

GOTO L__main168

NOP

NOP

;Semafor.mpas,241 :: txt1 := 'R:[ ]s';

MOVLW 82

MOVWF _txt1+0

MOVLW 58

MOVWF _txt1+1

MOVLW 91

MOVWF _txt1+2

MOVLW 32

MOVWF _txt1+3

MOVLW 32

MOVWF _txt1+4

MOVLW 32

MOVWF _txt1+5

MOVLW 93

MOVWF _txt1+6

MOVLW 115

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,242 :: txt2 := 'V:[ ]s';

MOVLW 86

MOVWF _txt2+0

MOVLW 58

MOVWF _txt2+1

MOVLW 91

MOVWF _txt2+2

MOVLW 32

MOVWF _txt2+3

MOVLW 32

MOVWF _txt2+4

MOVLW 32

MOVWF _txt2+5

MOVLW 93

MOVWF _txt2+6

MOVLW 115

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,243 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,244 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,245 :: ByteToStr(rn, timp1);

MOVF _rn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp1+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,246 :: ByteToStr(vn, timp2);

MOVF _vn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp2+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,247 :: LCD_Out(1,6,timp1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,248 :: LCD_Out(2,6,timp2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,249 :: if PORTD = 0 then goto runr;

MOVF PORTD+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main170

GOTO L__main_runr

L__main170:

;Semafor.mpas,250 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main173

GOTO L__main_atentie

L__main173:

;Semafor.mpas,251 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main176

;Semafor.mpas,253 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main178:

DECFSZ R13+0, 1

GOTO L__main178

DECFSZ R12+0, 1

GOTO L__main178

DECFSZ R11+0, 1

GOTO L__main178

NOP

NOP

;Semafor.mpas,254 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,255 :: end;

L__main176:

;Semafor.mpas,256 :: if rn > 0 then goto rapid2;

MOVF _rn+0, 0

SUBLW 0

BTFSC STATUS+0, 0

GOTO L__main180

GOTO L__main_rapid2

L__main180:

;Semafor.mpas,257 :: if rn = 0 then goto rapg;

MOVF _rn+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main183

GOTO L__main_rapg

L__main183:

;Semafor.mpas,259 :: rapg:

L__main_rapg:

;Semafor.mpas,260 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main185:

DECFSZ R13+0, 1

GOTO L__main185

DECFSZ R12+0, 1

GOTO L__main185

DECFSZ R11+0, 1

GOTO L__main185

NOP

NOP

;Semafor.mpas,261 :: rn := 2; vn := 2;

MOVLW 2

MOVWF _rn+0

MOVLW 2

MOVWF _vn+0

;Semafor.mpas,262 :: if PORTD = 0 then goto runr;

MOVF PORTD+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main187

GOTO L__main_runr

L__main187:

;Semafor.mpas,263 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main190

GOTO L__main_atentie

L__main190:

;Semafor.mpas,264 :: rapid3:

L__main_rapid3:

;Semafor.mpas,265 :: rn := rn-1;

DECF _rn+0, 1

;Semafor.mpas,266 :: vn := vn-1;

DECF _vn+0, 1

;Semafor.mpas,267 :: i := 130;

MOVLW 130

MOVWF _i+0

;Semafor.mpas,268 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main192:

DECFSZ R13+0, 1

GOTO L__main192

DECFSZ R12+0, 1

GOTO L__main192

NOP

NOP

;Semafor.mpas,269 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,270 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,271 :: PORTE := 2;

MOVLW 2

MOVWF PORTE+0

;Semafor.mpas,272 :: Delay_ms(1000);

MOVLW 6

MOVWF R11+0

MOVLW 19

MOVWF R12+0

MOVLW 173

MOVWF R13+0

L__main193:

DECFSZ R13+0, 1

GOTO L__main193

DECFSZ R12+0, 1

GOTO L__main193

DECFSZ R11+0, 1

GOTO L__main193

NOP

NOP

;Semafor.mpas,274 :: txt1 := 'R:[ ]s';

MOVLW 82

MOVWF _txt1+0

MOVLW 58

MOVWF _txt1+1

MOVLW 91

MOVWF _txt1+2

MOVLW 32

MOVWF _txt1+3

MOVLW 32

MOVWF _txt1+4

MOVLW 32

MOVWF _txt1+5

MOVLW 93

MOVWF _txt1+6

MOVLW 115

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,275 :: txt2 := 'V:[ ]s';

MOVLW 86

MOVWF _txt2+0

MOVLW 58

MOVWF _txt2+1

MOVLW 91

MOVWF _txt2+2

MOVLW 32

MOVWF _txt2+3

MOVLW 32

MOVWF _txt2+4

MOVLW 32

MOVWF _txt2+5

MOVLW 93

MOVWF _txt2+6

MOVLW 115

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,276 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,277 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,278 :: ByteToStr(rn, timp1);

MOVF _rn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp1+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,279 :: ByteToStr(vn, timp2);

MOVF _vn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp2+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,280 :: LCD_Out(1,6,timp1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,281 :: LCD_Out(2,6,timp2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,282 :: if PORTD = 0 then goto runr;

MOVF PORTD+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main195

GOTO L__main_runr

L__main195:

;Semafor.mpas,283 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main198

GOTO L__main_atentie

L__main198:

;Semafor.mpas,284 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main201

;Semafor.mpas,286 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main203:

DECFSZ R13+0, 1

GOTO L__main203

DECFSZ R12+0, 1

GOTO L__main203

DECFSZ R11+0, 1

GOTO L__main203

NOP

NOP

;Semafor.mpas,287 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,288 :: end;

L__main201:

;Semafor.mpas,289 :: if rn > 0 then goto rapid3;

MOVF _rn+0, 0

SUBLW 0

BTFSC STATUS+0, 0

GOTO L__main205

GOTO L__main_rapid3

L__main205:

;Semafor.mpas,290 :: if rn = 0 then goto rapr;

MOVF _rn+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main208

GOTO L__main_rapr

L__main208:

;Semafor.mpas,296 :: atentie:

L__main_atentie:

;Semafor.mpas,297 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main210:

DECFSZ R13+0, 1

GOTO L__main210

DECFSZ R12+0, 1

GOTO L__main210

DECFSZ R11+0, 1

GOTO L__main210

NOP

NOP

;Semafor.mpas,298 :: if PORTD = 2 then goto runr;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main212

GOTO L__main_runr

L__main212:

;Semafor.mpas,299 :: galben:

L__main_galben:

;Semafor.mpas,300 :: i := 0;

CLRF _i+0

;Semafor.mpas,301 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main214:

DECFSZ R13+0, 1

GOTO L__main214

DECFSZ R12+0, 1

GOTO L__main214

NOP

NOP

;Semafor.mpas,302 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,303 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,305 :: PORTE := 2;

MOVLW 2

MOVWF PORTE+0

;Semafor.mpas,306 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main215:

DECFSZ R13+0, 1

GOTO L__main215

DECFSZ R12+0, 1

GOTO L__main215

DECFSZ R11+0, 1

GOTO L__main215

NOP

NOP

;Semafor.mpas,307 :: PORTE := 0;

CLRF PORTE+0

;Semafor.mpas,308 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main216:

DECFSZ R13+0, 1

GOTO L__main216

DECFSZ R12+0, 1

GOTO L__main216

DECFSZ R11+0, 1

GOTO L__main216

NOP

NOP

;Semafor.mpas,310 :: txt1 := 'ATENTIE!';

MOVLW 65

MOVWF _txt1+0

MOVLW 84

MOVWF _txt1+1

MOVLW 69

MOVWF _txt1+2

MOVLW 78

MOVWF _txt1+3

MOVLW 84

MOVWF _txt1+4

MOVLW 73

MOVWF _txt1+5

MOVLW 69

MOVWF _txt1+6

MOVLW 33

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,311 :: txt2 := ' ';

MOVLW 32

MOVWF _txt2+0

MOVLW 32

MOVWF _txt2+1

MOVLW 32

MOVWF _txt2+2

MOVLW 32

MOVWF _txt2+3

MOVLW 32

MOVWF _txt2+4

MOVLW 32

MOVWF _txt2+5

MOVLW 32

MOVWF _txt2+6

MOVLW 32

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,312 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,313 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,315 :: if PORTD = 14 then goto runr;

MOVF PORTD+0, 0

XORLW 14

BTFSS STATUS+0, 2

GOTO L__main218

GOTO L__main_runr

L__main218:

;Semafor.mpas,316 :: if PORTD = 6 then goto runr;

MOVF PORTD+0, 0

XORLW 6

BTFSS STATUS+0, 2

GOTO L__main221

GOTO L__main_runr

L__main221:

;Semafor.mpas,317 :: if PORTD = 10 then goto runr;

MOVF PORTD+0, 0

XORLW 10

BTFSS STATUS+0, 2

GOTO L__main224

GOTO L__main_runr

L__main224:

;Semafor.mpas,318 :: if PORTD = 2 then goto runr;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main227

GOTO L__main_runr

L__main227:

;Semafor.mpas,319 :: if PORTD = 13 then

MOVF PORTD+0, 0

XORLW 13

BTFSS STATUS+0, 2

GOTO L__main230

;Semafor.mpas,321 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main232:

DECFSZ R13+0, 1

GOTO L__main232

DECFSZ R12+0, 1

GOTO L__main232

DECFSZ R11+0, 1

GOTO L__main232

NOP

NOP

;Semafor.mpas,322 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,323 :: end;

L__main230:

;Semafor.mpas,324 :: if PORTD = 5 then

MOVF PORTD+0, 0

XORLW 5

BTFSS STATUS+0, 2

GOTO L__main234

;Semafor.mpas,326 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main236:

DECFSZ R13+0, 1

GOTO L__main236

DECFSZ R12+0, 1

GOTO L__main236

DECFSZ R11+0, 1

GOTO L__main236

NOP

NOP

;Semafor.mpas,327 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,328 :: end;

L__main234:

;Semafor.mpas,329 :: if PORTD = 9 then

MOVF PORTD+0, 0

XORLW 9

BTFSS STATUS+0, 2

GOTO L__main238

;Semafor.mpas,331 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main240:

DECFSZ R13+0, 1

GOTO L__main240

DECFSZ R12+0, 1

GOTO L__main240

DECFSZ R11+0, 1

GOTO L__main240

NOP

NOP

;Semafor.mpas,332 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,333 :: end;

L__main238:

;Semafor.mpas,334 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main242

;Semafor.mpas,336 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main244:

DECFSZ R13+0, 1

GOTO L__main244

DECFSZ R12+0, 1

GOTO L__main244

DECFSZ R11+0, 1

GOTO L__main244

NOP

NOP

;Semafor.mpas,337 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,338 :: end;

L__main242:

;Semafor.mpas,339 :: goto galben;

GOTO L__main_galben

;Semafor.mpas,341 :: end.

L_end_main:

GOTO $+0

; end of _main

Bibliografie

David A.Patterson, John Hennessy "Organizarea și proiectarea calculatoarelor. Interfața hardware/software", Ed. ALL Educational, 2002, traducere Bogdan și Octavian Cărbunar

Andrew Tanenbaum "Organizarea structurata a Calculatoarelor", ed. 4, Ed. Byblos, 2004

Zoltan Francisc Baruch – Sisteme de intare/ieșire ale calculatoarelor, Ed. Albastră, Cluj Napoca, 2000

Bălan Radu, Microcontrolere – Structură și aplicații, Ed. Todesco,

Cluj-Napoca, 2002

F. Stan, E.O. Vîrjoghe, M. Ionel – Tratat de inginerie electrică, Ed. Bibliotheca, Târgoviște,2005

Dragoș Dobrescu, Adrian Rusu, Lidia Dobrescu – Dispozitive și circuite electronice, Ed. PRINTECH, 1999.

Eugenia ISAC – Măsurări electrice și electronice, București, 1993.

P. Cioară, O. Birău, R. Pârvan – Electronică, București 1983.

Bibliografie WEB

www.microchip.com

www.wikipedia.org/ manchester .code

www.audiopractik.go.ro

www.icprog.com

www.eagle.com

ANEXA 1

_main:

;Semafor.mpas,25 :: begin

;Semafor.mpas,26 :: PORTC := $04; // Initialize PORTC

MOVLW 4

MOVWF PORTC+0

;Semafor.mpas,27 :: PWM1_Init(400); // Initialize PWM module, freq = 400Hz.

BCF T2CON+0, 0

BCF T2CON+0, 1

BSF T2CON+0, 0

BSF T2CON+0, 1

MOVLW 156

MOVWF PR2+0

CALL _PWM1_Init+0

;Semafor.mpas,28 :: PWM1_Start(); // Start PWM

CALL _PWM1_Start+0

;Semafor.mpas,30 :: TRISC := 0;

CLRF TRISC+0

;Semafor.mpas,31 :: TRISD := $FF;

MOVLW 255

MOVWF TRISD+0

;Semafor.mpas,32 :: TRISE := 0;

CLRF TRISE+0

;Semafor.mpas,33 :: PORTB := 0xFF;

MOVLW 255

MOVWF PORTB+0

;Semafor.mpas,34 :: TRISB := 0xFF;

MOVLW 255

MOVWF TRISB+0

;Semafor.mpas,35 :: PORTD := $FF;

MOVLW 255

MOVWF PORTD+0

;Semafor.mpas,36 :: PORTE := 0;

CLRF PORTE+0

;Semafor.mpas,37 :: ANSEL := 0; // Configure AN pins as digital I/O

CLRF ANSEL+0

;Semafor.mpas,38 :: ANSELH := 0;

CLRF ANSELH+0

;Semafor.mpas,39 :: rn := 10; vn := 10; i := 0; j:= 0;

MOVLW 10

MOVWF _rn+0

MOVLW 10

MOVWF _vn+0

CLRF _i+0

CLRF _j+0

;Semafor.mpas,42 :: Lcd_Init(); // Initialize LCD

CALL _Lcd_Init+0

;Semafor.mpas,43 :: Lcd_Cmd(_LCD_CLEAR); // Clear display

MOVLW 1

MOVWF FARG_Lcd_Cmd_out_char+0

CALL _Lcd_Cmd+0

;Semafor.mpas,44 :: Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

MOVLW 12

MOVWF FARG_Lcd_Cmd_out_char+0

CALL _Lcd_Cmd+0

;Semafor.mpas,45 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,46 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,47 :: Delay_ms(2000);

MOVLW 11

MOVWF R11+0

MOVLW 38

MOVWF R12+0

MOVLW 93

MOVWF R13+0

L__main17:

DECFSZ R13+0, 1

GOTO L__main17

DECFSZ R12+0, 1

GOTO L__main17

DECFSZ R11+0, 1

GOTO L__main17

NOP

NOP

;Semafor.mpas,48 :: Lcd_Init(); // Initialize LCD

CALL _Lcd_Init+0

;Semafor.mpas,49 :: Lcd_Cmd(_LCD_CLEAR); // Clear display

MOVLW 1

MOVWF FARG_Lcd_Cmd_out_char+0

CALL _Lcd_Cmd+0

;Semafor.mpas,50 :: Lcd_Cmd(_LCD_CURSOR_OFF); // Cursor off

MOVLW 12

MOVWF FARG_Lcd_Cmd_out_char+0

CALL _Lcd_Cmd+0

;Semafor.mpas,51 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,52 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,53 :: stby:

L__main_stby:

;Semafor.mpas,54 :: i := 0;

CLRF _i+0

;Semafor.mpas,55 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main18:

DECFSZ R13+0, 1

GOTO L__main18

DECFSZ R12+0, 1

GOTO L__main18

NOP

NOP

;Semafor.mpas,56 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,57 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,59 :: txt1 := ' Power ';

MOVLW 32

MOVWF _txt1+0

MOVLW 80

MOVWF _txt1+1

MOVLW 111

MOVWF _txt1+2

MOVLW 119

MOVWF _txt1+3

MOVLW 101

MOVWF _txt1+4

MOVLW 114

MOVWF _txt1+5

MOVLW 32

MOVWF _txt1+6

MOVLW 32

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,60 :: txt2 := 'offline ';

MOVLW 111

MOVWF _txt2+0

MOVLW 102

MOVWF _txt2+1

MOVLW 102

MOVWF _txt2+2

MOVLW 108

MOVWF _txt2+3

MOVLW 105

MOVWF _txt2+4

MOVLW 110

MOVWF _txt2+5

MOVLW 101

MOVWF _txt2+6

MOVLW 32

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,61 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,62 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,63 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main20

;Semafor.mpas,65 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main22:

DECFSZ R13+0, 1

GOTO L__main22

DECFSZ R12+0, 1

GOTO L__main22

DECFSZ R11+0, 1

GOTO L__main22

NOP

NOP

;Semafor.mpas,66 :: goto pwr;

GOTO L__main_pwr

;Semafor.mpas,67 :: end;

L__main20:

;Semafor.mpas,68 :: PORTE := 0;

CLRF PORTE+0

;Semafor.mpas,69 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,71 :: pwr:

L__main_pwr:

;Semafor.mpas,72 :: txt1 := ' Power ';

MOVLW 32

MOVWF _txt1+0

MOVLW 80

MOVWF _txt1+1

MOVLW 111

MOVWF _txt1+2

MOVLW 119

MOVWF _txt1+3

MOVLW 101

MOVWF _txt1+4

MOVLW 114

MOVWF _txt1+5

MOVLW 32

MOVWF _txt1+6

MOVLW 32

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,73 :: txt2 := ' online ';

MOVLW 32

MOVWF _txt2+0

MOVLW 111

MOVWF _txt2+1

MOVLW 110

MOVWF _txt2+2

MOVLW 108

MOVWF _txt2+3

MOVLW 105

MOVWF _txt2+4

MOVLW 110

MOVWF _txt2+5

MOVLW 101

MOVWF _txt2+6

MOVLW 32

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,74 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,75 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,76 :: Delay_ms(1000);

MOVLW 6

MOVWF R11+0

MOVLW 19

MOVWF R12+0

MOVLW 173

MOVWF R13+0

L__main23:

DECFSZ R13+0, 1

GOTO L__main23

DECFSZ R12+0, 1

GOTO L__main23

DECFSZ R11+0, 1

GOTO L__main23

NOP

NOP

;Semafor.mpas,80 :: runr:

L__main_runr:

;Semafor.mpas,81 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main24:

DECFSZ R13+0, 1

GOTO L__main24

DECFSZ R12+0, 1

GOTO L__main24

DECFSZ R11+0, 1

GOTO L__main24

NOP

NOP

;Semafor.mpas,82 :: rn := 10; vn := 10;

MOVLW 10

MOVWF _rn+0

MOVLW 10

MOVWF _vn+0

;Semafor.mpas,83 :: if PORTD = 4 then goto rapr;

MOVF PORTD+0, 0

XORLW 4

BTFSS STATUS+0, 2

GOTO L__main26

GOTO L__main_rapr

L__main26:

;Semafor.mpas,84 :: if PORTD = 8 then goto rapr;

MOVF PORTD+0, 0

XORLW 8

BTFSS STATUS+0, 2

GOTO L__main29

GOTO L__main_rapr

L__main29:

;Semafor.mpas,85 :: if PORTD = 12 then goto rapr;

MOVF PORTD+0, 0

XORLW 12

BTFSS STATUS+0, 2

GOTO L__main32

GOTO L__main_rapr

L__main32:

;Semafor.mpas,86 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main35

GOTO L__main_atentie

L__main35:

;Semafor.mpas,87 :: normal1:

L__main_normal1:

;Semafor.mpas,88 :: rn := rn-1;

DECF _rn+0, 1

;Semafor.mpas,89 :: vn := vn-1;

DECF _vn+0, 1

;Semafor.mpas,90 :: i := 130;

MOVLW 130

MOVWF _i+0

;Semafor.mpas,91 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main37:

DECFSZ R13+0, 1

GOTO L__main37

DECFSZ R12+0, 1

GOTO L__main37

NOP

NOP

;Semafor.mpas,92 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,93 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,94 :: PORTE := 1;

MOVLW 1

MOVWF PORTE+0

;Semafor.mpas,95 :: Delay_ms(1000);

MOVLW 6

MOVWF R11+0

MOVLW 19

MOVWF R12+0

MOVLW 173

MOVWF R13+0

L__main38:

DECFSZ R13+0, 1

GOTO L__main38

DECFSZ R12+0, 1

GOTO L__main38

DECFSZ R11+0, 1

GOTO L__main38

NOP

NOP

;Semafor.mpas,97 :: txt1 := 'R:[ ]s';

MOVLW 82

MOVWF _txt1+0

MOVLW 58

MOVWF _txt1+1

MOVLW 91

MOVWF _txt1+2

MOVLW 32

MOVWF _txt1+3

MOVLW 32

MOVWF _txt1+4

MOVLW 32

MOVWF _txt1+5

MOVLW 93

MOVWF _txt1+6

MOVLW 115

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,98 :: txt2 := 'V:[ ]s';

MOVLW 86

MOVWF _txt2+0

MOVLW 58

MOVWF _txt2+1

MOVLW 91

MOVWF _txt2+2

MOVLW 32

MOVWF _txt2+3

MOVLW 32

MOVWF _txt2+4

MOVLW 32

MOVWF _txt2+5

MOVLW 93

MOVWF _txt2+6

MOVLW 115

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,99 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,100 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,101 :: ByteToStr(rn, timp1);

MOVF _rn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp1+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,102 :: ByteToStr(vn, timp2);

MOVF _vn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp2+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,103 :: LCD_Out(1,6,timp1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,104 :: LCD_Out(2,6,timp2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,105 :: if PORTD = 4 then goto rapr;

MOVF PORTD+0, 0

XORLW 4

BTFSS STATUS+0, 2

GOTO L__main40

GOTO L__main_rapr

L__main40:

;Semafor.mpas,106 :: if PORTD = 8 then goto rapr;

MOVF PORTD+0, 0

XORLW 8

BTFSS STATUS+0, 2

GOTO L__main43

GOTO L__main_rapr

L__main43:

;Semafor.mpas,107 :: if PORTD = 12 then goto rapr;

MOVF PORTD+0, 0

XORLW 12

BTFSS STATUS+0, 2

GOTO L__main46

GOTO L__main_rapr

L__main46:

;Semafor.mpas,108 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main49

GOTO L__main_atentie

L__main49:

;Semafor.mpas,109 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main52

;Semafor.mpas,111 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main54:

DECFSZ R13+0, 1

GOTO L__main54

DECFSZ R12+0, 1

GOTO L__main54

DECFSZ R11+0, 1

GOTO L__main54

NOP

NOP

;Semafor.mpas,112 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,113 :: end;

L__main52:

;Semafor.mpas,114 :: if rn > 0 then goto normal1;

MOVF _rn+0, 0

SUBLW 0

BTFSC STATUS+0, 0

GOTO L__main56

GOTO L__main_normal1

L__main56:

;Semafor.mpas,115 :: if rn = 0 then goto runv;

MOVF _rn+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main59

GOTO L__main_runv

L__main59:

;Semafor.mpas,117 :: runv:

L__main_runv:

;Semafor.mpas,118 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main61:

DECFSZ R13+0, 1

GOTO L__main61

DECFSZ R12+0, 1

GOTO L__main61

DECFSZ R11+0, 1

GOTO L__main61

NOP

NOP

;Semafor.mpas,119 :: rn := 10; vn := 10;

MOVLW 10

MOVWF _rn+0

MOVLW 10

MOVWF _vn+0

;Semafor.mpas,120 :: if PORTD = 4 then goto rapr;

MOVF PORTD+0, 0

XORLW 4

BTFSS STATUS+0, 2

GOTO L__main63

GOTO L__main_rapr

L__main63:

;Semafor.mpas,121 :: if PORTD = 8 then goto rapr;

MOVF PORTD+0, 0

XORLW 8

BTFSS STATUS+0, 2

GOTO L__main66

GOTO L__main_rapr

L__main66:

;Semafor.mpas,122 :: if PORTD = 12 then goto rapr;

MOVF PORTD+0, 0

XORLW 12

BTFSS STATUS+0, 2

GOTO L__main69

GOTO L__main_rapr

L__main69:

;Semafor.mpas,123 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main72

GOTO L__main_atentie

L__main72:

;Semafor.mpas,124 :: normal2:

L__main_normal2:

;Semafor.mpas,125 :: rn := rn-1;

DECF _rn+0, 1

;Semafor.mpas,126 :: vn := vn-1;

DECF _vn+0, 1

;Semafor.mpas,127 :: i := 130;

MOVLW 130

MOVWF _i+0

;Semafor.mpas,128 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main74:

DECFSZ R13+0, 1

GOTO L__main74

DECFSZ R12+0, 1

GOTO L__main74

NOP

NOP

;Semafor.mpas,129 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,130 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,131 :: PORTE := 4;

MOVLW 4

MOVWF PORTE+0

;Semafor.mpas,132 :: Delay_ms(1000);

MOVLW 6

MOVWF R11+0

MOVLW 19

MOVWF R12+0

MOVLW 173

MOVWF R13+0

L__main75:

DECFSZ R13+0, 1

GOTO L__main75

DECFSZ R12+0, 1

GOTO L__main75

DECFSZ R11+0, 1

GOTO L__main75

NOP

NOP

;Semafor.mpas,134 :: txt1 := 'R:[ ]s';

MOVLW 82

MOVWF _txt1+0

MOVLW 58

MOVWF _txt1+1

MOVLW 91

MOVWF _txt1+2

MOVLW 32

MOVWF _txt1+3

MOVLW 32

MOVWF _txt1+4

MOVLW 32

MOVWF _txt1+5

MOVLW 93

MOVWF _txt1+6

MOVLW 115

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,135 :: txt2 := 'V:[ ]s';

MOVLW 86

MOVWF _txt2+0

MOVLW 58

MOVWF _txt2+1

MOVLW 91

MOVWF _txt2+2

MOVLW 32

MOVWF _txt2+3

MOVLW 32

MOVWF _txt2+4

MOVLW 32

MOVWF _txt2+5

MOVLW 93

MOVWF _txt2+6

MOVLW 115

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,136 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,137 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,138 :: ByteToStr(rn, timp1);

MOVF _rn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp1+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,139 :: ByteToStr(vn, timp2);

MOVF _vn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp2+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,140 :: LCD_Out(1,6,timp1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,141 :: LCD_Out(2,6,timp2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,142 :: if PORTD = 4 then goto rapr;

MOVF PORTD+0, 0

XORLW 4

BTFSS STATUS+0, 2

GOTO L__main77

GOTO L__main_rapr

L__main77:

;Semafor.mpas,143 :: if PORTD = 8 then goto rapr;

MOVF PORTD+0, 0

XORLW 8

BTFSS STATUS+0, 2

GOTO L__main80

GOTO L__main_rapr

L__main80:

;Semafor.mpas,144 :: if PORTD = 12 then goto rapr;

MOVF PORTD+0, 0

XORLW 12

BTFSS STATUS+0, 2

GOTO L__main83

GOTO L__main_rapr

L__main83:

;Semafor.mpas,145 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main86

GOTO L__main_atentie

L__main86:

;Semafor.mpas,146 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main89

;Semafor.mpas,148 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main91:

DECFSZ R13+0, 1

GOTO L__main91

DECFSZ R12+0, 1

GOTO L__main91

DECFSZ R11+0, 1

GOTO L__main91

NOP

NOP

;Semafor.mpas,149 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,150 :: end;

L__main89:

;Semafor.mpas,151 :: if rn > 0 then goto normal2;

MOVF _rn+0, 0

SUBLW 0

BTFSC STATUS+0, 0

GOTO L__main93

GOTO L__main_normal2

L__main93:

;Semafor.mpas,152 :: if rn = 0 then goto rung;

MOVF _rn+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main96

GOTO L__main_rung

L__main96:

;Semafor.mpas,154 :: rung:

L__main_rung:

;Semafor.mpas,155 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main98:

DECFSZ R13+0, 1

GOTO L__main98

DECFSZ R12+0, 1

GOTO L__main98

DECFSZ R11+0, 1

GOTO L__main98

NOP

NOP

;Semafor.mpas,156 :: rn := 3; vn := 3;

MOVLW 3

MOVWF _rn+0

MOVLW 3

MOVWF _vn+0

;Semafor.mpas,157 :: if PORTD = 4 then goto rapr;

MOVF PORTD+0, 0

XORLW 4

BTFSS STATUS+0, 2

GOTO L__main100

GOTO L__main_rapr

L__main100:

;Semafor.mpas,158 :: if PORTD = 8 then goto rapr;

MOVF PORTD+0, 0

XORLW 8

BTFSS STATUS+0, 2

GOTO L__main103

GOTO L__main_rapr

L__main103:

;Semafor.mpas,159 :: if PORTD = 12 then goto rapr;

MOVF PORTD+0, 0

XORLW 12

BTFSS STATUS+0, 2

GOTO L__main106

GOTO L__main_rapr

L__main106:

;Semafor.mpas,160 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main109

GOTO L__main_atentie

L__main109:

;Semafor.mpas,161 :: normal3:

L__main_normal3:

;Semafor.mpas,162 :: rn := rn-1;

DECF _rn+0, 1

;Semafor.mpas,163 :: vn := vn-1;

DECF _vn+0, 1

;Semafor.mpas,164 :: i := 130;

MOVLW 130

MOVWF _i+0

;Semafor.mpas,165 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main111:

DECFSZ R13+0, 1

GOTO L__main111

DECFSZ R12+0, 1

GOTO L__main111

NOP

NOP

;Semafor.mpas,166 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,167 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,168 :: PORTE := 2;

MOVLW 2

MOVWF PORTE+0

;Semafor.mpas,169 :: Delay_ms(1000);

MOVLW 6

MOVWF R11+0

MOVLW 19

MOVWF R12+0

MOVLW 173

MOVWF R13+0

L__main112:

DECFSZ R13+0, 1

GOTO L__main112

DECFSZ R12+0, 1

GOTO L__main112

DECFSZ R11+0, 1

GOTO L__main112

NOP

NOP

;Semafor.mpas,171 :: txt1 := 'R:[ ]s';

MOVLW 82

MOVWF _txt1+0

MOVLW 58

MOVWF _txt1+1

MOVLW 91

MOVWF _txt1+2

MOVLW 32

MOVWF _txt1+3

MOVLW 32

MOVWF _txt1+4

MOVLW 32

MOVWF _txt1+5

MOVLW 93

MOVWF _txt1+6

MOVLW 115

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,172 :: txt2 := 'V:[ ]s';

MOVLW 86

MOVWF _txt2+0

MOVLW 58

MOVWF _txt2+1

MOVLW 91

MOVWF _txt2+2

MOVLW 32

MOVWF _txt2+3

MOVLW 32

MOVWF _txt2+4

MOVLW 32

MOVWF _txt2+5

MOVLW 93

MOVWF _txt2+6

MOVLW 115

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,173 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,174 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,175 :: ByteToStr(rn, timp1);

MOVF _rn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp1+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,176 :: ByteToStr(vn, timp2);

MOVF _vn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp2+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,177 :: LCD_Out(1,6,timp1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,178 :: LCD_Out(2,6,timp2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,179 :: if PORTD = 4 then goto rapr;

MOVF PORTD+0, 0

XORLW 4

BTFSS STATUS+0, 2

GOTO L__main114

GOTO L__main_rapr

L__main114:

;Semafor.mpas,180 :: if PORTD = 8 then goto rapr;

MOVF PORTD+0, 0

XORLW 8

BTFSS STATUS+0, 2

GOTO L__main117

GOTO L__main_rapr

L__main117:

;Semafor.mpas,181 :: if PORTD = 12 then goto rapr;

MOVF PORTD+0, 0

XORLW 12

BTFSS STATUS+0, 2

GOTO L__main120

GOTO L__main_rapr

L__main120:

;Semafor.mpas,182 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main123

GOTO L__main_atentie

L__main123:

;Semafor.mpas,183 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main126

;Semafor.mpas,185 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main128:

DECFSZ R13+0, 1

GOTO L__main128

DECFSZ R12+0, 1

GOTO L__main128

DECFSZ R11+0, 1

GOTO L__main128

NOP

NOP

;Semafor.mpas,186 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,187 :: end;

L__main126:

;Semafor.mpas,188 :: if rn > 0 then goto normal3;

MOVF _rn+0, 0

SUBLW 0

BTFSC STATUS+0, 0

GOTO L__main130

GOTO L__main_normal3

L__main130:

;Semafor.mpas,189 :: if rn = 0 then goto runr;

MOVF _rn+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main133

GOTO L__main_runr

L__main133:

;Semafor.mpas,193 :: rapr:

L__main_rapr:

;Semafor.mpas,194 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main135:

DECFSZ R13+0, 1

GOTO L__main135

DECFSZ R12+0, 1

GOTO L__main135

DECFSZ R11+0, 1

GOTO L__main135

NOP

NOP

;Semafor.mpas,195 :: rn := 5; vn := 5;

MOVLW 5

MOVWF _rn+0

MOVLW 5

MOVWF _vn+0

;Semafor.mpas,196 :: if PORTD = 0 then goto runr;

MOVF PORTD+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main137

GOTO L__main_runr

L__main137:

;Semafor.mpas,197 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main140

GOTO L__main_atentie

L__main140:

;Semafor.mpas,198 :: rapid1:

L__main_rapid1:

;Semafor.mpas,199 :: rn := rn-1;

DECF _rn+0, 1

;Semafor.mpas,200 :: vn := vn-1;

DECF _vn+0, 1

;Semafor.mpas,201 :: i := 130;

MOVLW 130

MOVWF _i+0

;Semafor.mpas,202 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main142:

DECFSZ R13+0, 1

GOTO L__main142

DECFSZ R12+0, 1

GOTO L__main142

NOP

NOP

;Semafor.mpas,203 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,204 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,205 :: PORTE := 1;

MOVLW 1

MOVWF PORTE+0

;Semafor.mpas,206 :: Delay_ms(1000);

MOVLW 6

MOVWF R11+0

MOVLW 19

MOVWF R12+0

MOVLW 173

MOVWF R13+0

L__main143:

DECFSZ R13+0, 1

GOTO L__main143

DECFSZ R12+0, 1

GOTO L__main143

DECFSZ R11+0, 1

GOTO L__main143

NOP

NOP

;Semafor.mpas,208 :: txt1 := 'R:[ ]s';

MOVLW 82

MOVWF _txt1+0

MOVLW 58

MOVWF _txt1+1

MOVLW 91

MOVWF _txt1+2

MOVLW 32

MOVWF _txt1+3

MOVLW 32

MOVWF _txt1+4

MOVLW 32

MOVWF _txt1+5

MOVLW 93

MOVWF _txt1+6

MOVLW 115

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,209 :: txt2 := 'V:[ ]s';

MOVLW 86

MOVWF _txt2+0

MOVLW 58

MOVWF _txt2+1

MOVLW 91

MOVWF _txt2+2

MOVLW 32

MOVWF _txt2+3

MOVLW 32

MOVWF _txt2+4

MOVLW 32

MOVWF _txt2+5

MOVLW 93

MOVWF _txt2+6

MOVLW 115

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,210 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,211 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,212 :: ByteToStr(rn, timp1);

MOVF _rn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp1+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,213 :: ByteToStr(vn, timp2);

MOVF _vn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp2+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,214 :: LCD_Out(1,6,timp1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,215 :: LCD_Out(2,6,timp2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,216 :: if PORTD = 0 then goto runr;

MOVF PORTD+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main145

GOTO L__main_runr

L__main145:

;Semafor.mpas,217 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main148

GOTO L__main_atentie

L__main148:

;Semafor.mpas,218 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main151

;Semafor.mpas,220 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main153:

DECFSZ R13+0, 1

GOTO L__main153

DECFSZ R12+0, 1

GOTO L__main153

DECFSZ R11+0, 1

GOTO L__main153

NOP

NOP

;Semafor.mpas,221 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,222 :: end;

L__main151:

;Semafor.mpas,223 :: if rn > 0 then goto rapid1;

MOVF _rn+0, 0

SUBLW 0

BTFSC STATUS+0, 0

GOTO L__main155

GOTO L__main_rapid1

L__main155:

;Semafor.mpas,224 :: if rn = 0 then goto rapv;

MOVF _rn+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main158

GOTO L__main_rapv

L__main158:

;Semafor.mpas,226 :: rapv:

L__main_rapv:

;Semafor.mpas,227 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main160:

DECFSZ R13+0, 1

GOTO L__main160

DECFSZ R12+0, 1

GOTO L__main160

DECFSZ R11+0, 1

GOTO L__main160

NOP

NOP

;Semafor.mpas,228 :: rn := 5; vn := 5;

MOVLW 5

MOVWF _rn+0

MOVLW 5

MOVWF _vn+0

;Semafor.mpas,229 :: if PORTD = 0 then goto runr;

MOVF PORTD+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main162

GOTO L__main_runr

L__main162:

;Semafor.mpas,230 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main165

GOTO L__main_atentie

L__main165:

;Semafor.mpas,231 :: rapid2:

L__main_rapid2:

;Semafor.mpas,232 :: rn := rn-1;

DECF _rn+0, 1

;Semafor.mpas,233 :: vn := vn-1;

DECF _vn+0, 1

;Semafor.mpas,234 :: i := 130;

MOVLW 130

MOVWF _i+0

;Semafor.mpas,235 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main167:

DECFSZ R13+0, 1

GOTO L__main167

DECFSZ R12+0, 1

GOTO L__main167

NOP

NOP

;Semafor.mpas,236 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,237 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,238 :: PORTE := 4;

MOVLW 4

MOVWF PORTE+0

;Semafor.mpas,239 :: Delay_ms(1000);

MOVLW 6

MOVWF R11+0

MOVLW 19

MOVWF R12+0

MOVLW 173

MOVWF R13+0

L__main168:

DECFSZ R13+0, 1

GOTO L__main168

DECFSZ R12+0, 1

GOTO L__main168

DECFSZ R11+0, 1

GOTO L__main168

NOP

NOP

;Semafor.mpas,241 :: txt1 := 'R:[ ]s';

MOVLW 82

MOVWF _txt1+0

MOVLW 58

MOVWF _txt1+1

MOVLW 91

MOVWF _txt1+2

MOVLW 32

MOVWF _txt1+3

MOVLW 32

MOVWF _txt1+4

MOVLW 32

MOVWF _txt1+5

MOVLW 93

MOVWF _txt1+6

MOVLW 115

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,242 :: txt2 := 'V:[ ]s';

MOVLW 86

MOVWF _txt2+0

MOVLW 58

MOVWF _txt2+1

MOVLW 91

MOVWF _txt2+2

MOVLW 32

MOVWF _txt2+3

MOVLW 32

MOVWF _txt2+4

MOVLW 32

MOVWF _txt2+5

MOVLW 93

MOVWF _txt2+6

MOVLW 115

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,243 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,244 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,245 :: ByteToStr(rn, timp1);

MOVF _rn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp1+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,246 :: ByteToStr(vn, timp2);

MOVF _vn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp2+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,247 :: LCD_Out(1,6,timp1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,248 :: LCD_Out(2,6,timp2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,249 :: if PORTD = 0 then goto runr;

MOVF PORTD+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main170

GOTO L__main_runr

L__main170:

;Semafor.mpas,250 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main173

GOTO L__main_atentie

L__main173:

;Semafor.mpas,251 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main176

;Semafor.mpas,253 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main178:

DECFSZ R13+0, 1

GOTO L__main178

DECFSZ R12+0, 1

GOTO L__main178

DECFSZ R11+0, 1

GOTO L__main178

NOP

NOP

;Semafor.mpas,254 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,255 :: end;

L__main176:

;Semafor.mpas,256 :: if rn > 0 then goto rapid2;

MOVF _rn+0, 0

SUBLW 0

BTFSC STATUS+0, 0

GOTO L__main180

GOTO L__main_rapid2

L__main180:

;Semafor.mpas,257 :: if rn = 0 then goto rapg;

MOVF _rn+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main183

GOTO L__main_rapg

L__main183:

;Semafor.mpas,259 :: rapg:

L__main_rapg:

;Semafor.mpas,260 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main185:

DECFSZ R13+0, 1

GOTO L__main185

DECFSZ R12+0, 1

GOTO L__main185

DECFSZ R11+0, 1

GOTO L__main185

NOP

NOP

;Semafor.mpas,261 :: rn := 2; vn := 2;

MOVLW 2

MOVWF _rn+0

MOVLW 2

MOVWF _vn+0

;Semafor.mpas,262 :: if PORTD = 0 then goto runr;

MOVF PORTD+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main187

GOTO L__main_runr

L__main187:

;Semafor.mpas,263 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main190

GOTO L__main_atentie

L__main190:

;Semafor.mpas,264 :: rapid3:

L__main_rapid3:

;Semafor.mpas,265 :: rn := rn-1;

DECF _rn+0, 1

;Semafor.mpas,266 :: vn := vn-1;

DECF _vn+0, 1

;Semafor.mpas,267 :: i := 130;

MOVLW 130

MOVWF _i+0

;Semafor.mpas,268 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main192:

DECFSZ R13+0, 1

GOTO L__main192

DECFSZ R12+0, 1

GOTO L__main192

NOP

NOP

;Semafor.mpas,269 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,270 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,271 :: PORTE := 2;

MOVLW 2

MOVWF PORTE+0

;Semafor.mpas,272 :: Delay_ms(1000);

MOVLW 6

MOVWF R11+0

MOVLW 19

MOVWF R12+0

MOVLW 173

MOVWF R13+0

L__main193:

DECFSZ R13+0, 1

GOTO L__main193

DECFSZ R12+0, 1

GOTO L__main193

DECFSZ R11+0, 1

GOTO L__main193

NOP

NOP

;Semafor.mpas,274 :: txt1 := 'R:[ ]s';

MOVLW 82

MOVWF _txt1+0

MOVLW 58

MOVWF _txt1+1

MOVLW 91

MOVWF _txt1+2

MOVLW 32

MOVWF _txt1+3

MOVLW 32

MOVWF _txt1+4

MOVLW 32

MOVWF _txt1+5

MOVLW 93

MOVWF _txt1+6

MOVLW 115

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,275 :: txt2 := 'V:[ ]s';

MOVLW 86

MOVWF _txt2+0

MOVLW 58

MOVWF _txt2+1

MOVLW 91

MOVWF _txt2+2

MOVLW 32

MOVWF _txt2+3

MOVLW 32

MOVWF _txt2+4

MOVLW 32

MOVWF _txt2+5

MOVLW 93

MOVWF _txt2+6

MOVLW 115

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,276 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,277 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,278 :: ByteToStr(rn, timp1);

MOVF _rn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp1+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,279 :: ByteToStr(vn, timp2);

MOVF _vn+0, 0

MOVWF FARG_ByteToStr_input+0

MOVLW _timp2+0

MOVWF FARG_ByteToStr_output+0

CALL _ByteToStr+0

;Semafor.mpas,280 :: LCD_Out(1,6,timp1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,281 :: LCD_Out(2,6,timp2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 6

MOVWF FARG_Lcd_Out_column+0

MOVLW _timp2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,282 :: if PORTD = 0 then goto runr;

MOVF PORTD+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main195

GOTO L__main_runr

L__main195:

;Semafor.mpas,283 :: if PORTD = 2 then goto atentie;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main198

GOTO L__main_atentie

L__main198:

;Semafor.mpas,284 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main201

;Semafor.mpas,286 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main203:

DECFSZ R13+0, 1

GOTO L__main203

DECFSZ R12+0, 1

GOTO L__main203

DECFSZ R11+0, 1

GOTO L__main203

NOP

NOP

;Semafor.mpas,287 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,288 :: end;

L__main201:

;Semafor.mpas,289 :: if rn > 0 then goto rapid3;

MOVF _rn+0, 0

SUBLW 0

BTFSC STATUS+0, 0

GOTO L__main205

GOTO L__main_rapid3

L__main205:

;Semafor.mpas,290 :: if rn = 0 then goto rapr;

MOVF _rn+0, 0

XORLW 0

BTFSS STATUS+0, 2

GOTO L__main208

GOTO L__main_rapr

L__main208:

;Semafor.mpas,296 :: atentie:

L__main_atentie:

;Semafor.mpas,297 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main210:

DECFSZ R13+0, 1

GOTO L__main210

DECFSZ R12+0, 1

GOTO L__main210

DECFSZ R11+0, 1

GOTO L__main210

NOP

NOP

;Semafor.mpas,298 :: if PORTD = 2 then goto runr;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main212

GOTO L__main_runr

L__main212:

;Semafor.mpas,299 :: galben:

L__main_galben:

;Semafor.mpas,300 :: i := 0;

CLRF _i+0

;Semafor.mpas,301 :: Delay_us(2500);

MOVLW 4

MOVWF R12+0

MOVLW 61

MOVWF R13+0

L__main214:

DECFSZ R13+0, 1

GOTO L__main214

DECFSZ R12+0, 1

GOTO L__main214

NOP

NOP

;Semafor.mpas,302 :: Inc(j);

INCF _j+0, 1

;Semafor.mpas,303 :: PWM1_Set_Duty(j); // Change duty ratio

MOVF _j+0, 0

MOVWF FARG_PWM1_Set_Duty_new_duty+0

CALL _PWM1_Set_Duty+0

;Semafor.mpas,305 :: PORTE := 2;

MOVLW 2

MOVWF PORTE+0

;Semafor.mpas,306 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main215:

DECFSZ R13+0, 1

GOTO L__main215

DECFSZ R12+0, 1

GOTO L__main215

DECFSZ R11+0, 1

GOTO L__main215

NOP

NOP

;Semafor.mpas,307 :: PORTE := 0;

CLRF PORTE+0

;Semafor.mpas,308 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main216:

DECFSZ R13+0, 1

GOTO L__main216

DECFSZ R12+0, 1

GOTO L__main216

DECFSZ R11+0, 1

GOTO L__main216

NOP

NOP

;Semafor.mpas,310 :: txt1 := 'ATENTIE!';

MOVLW 65

MOVWF _txt1+0

MOVLW 84

MOVWF _txt1+1

MOVLW 69

MOVWF _txt1+2

MOVLW 78

MOVWF _txt1+3

MOVLW 84

MOVWF _txt1+4

MOVLW 73

MOVWF _txt1+5

MOVLW 69

MOVWF _txt1+6

MOVLW 33

MOVWF _txt1+7

CLRF _txt1+8

;Semafor.mpas,311 :: txt2 := ' ';

MOVLW 32

MOVWF _txt2+0

MOVLW 32

MOVWF _txt2+1

MOVLW 32

MOVWF _txt2+2

MOVLW 32

MOVWF _txt2+3

MOVLW 32

MOVWF _txt2+4

MOVLW 32

MOVWF _txt2+5

MOVLW 32

MOVWF _txt2+6

MOVLW 32

MOVWF _txt2+7

CLRF _txt2+8

;Semafor.mpas,312 :: LCD_Out(1,1,txt1); // Write text in first row

MOVLW 1

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt1+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,313 :: LCD_Out(2,1,txt2); // Write text in second row

MOVLW 2

MOVWF FARG_Lcd_Out_row+0

MOVLW 1

MOVWF FARG_Lcd_Out_column+0

MOVLW _txt2+0

MOVWF FARG_Lcd_Out_text+0

CALL _Lcd_Out+0

;Semafor.mpas,315 :: if PORTD = 14 then goto runr;

MOVF PORTD+0, 0

XORLW 14

BTFSS STATUS+0, 2

GOTO L__main218

GOTO L__main_runr

L__main218:

;Semafor.mpas,316 :: if PORTD = 6 then goto runr;

MOVF PORTD+0, 0

XORLW 6

BTFSS STATUS+0, 2

GOTO L__main221

GOTO L__main_runr

L__main221:

;Semafor.mpas,317 :: if PORTD = 10 then goto runr;

MOVF PORTD+0, 0

XORLW 10

BTFSS STATUS+0, 2

GOTO L__main224

GOTO L__main_runr

L__main224:

;Semafor.mpas,318 :: if PORTD = 2 then goto runr;

MOVF PORTD+0, 0

XORLW 2

BTFSS STATUS+0, 2

GOTO L__main227

GOTO L__main_runr

L__main227:

;Semafor.mpas,319 :: if PORTD = 13 then

MOVF PORTD+0, 0

XORLW 13

BTFSS STATUS+0, 2

GOTO L__main230

;Semafor.mpas,321 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main232:

DECFSZ R13+0, 1

GOTO L__main232

DECFSZ R12+0, 1

GOTO L__main232

DECFSZ R11+0, 1

GOTO L__main232

NOP

NOP

;Semafor.mpas,322 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,323 :: end;

L__main230:

;Semafor.mpas,324 :: if PORTD = 5 then

MOVF PORTD+0, 0

XORLW 5

BTFSS STATUS+0, 2

GOTO L__main234

;Semafor.mpas,326 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main236:

DECFSZ R13+0, 1

GOTO L__main236

DECFSZ R12+0, 1

GOTO L__main236

DECFSZ R11+0, 1

GOTO L__main236

NOP

NOP

;Semafor.mpas,327 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,328 :: end;

L__main234:

;Semafor.mpas,329 :: if PORTD = 9 then

MOVF PORTD+0, 0

XORLW 9

BTFSS STATUS+0, 2

GOTO L__main238

;Semafor.mpas,331 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main240:

DECFSZ R13+0, 1

GOTO L__main240

DECFSZ R12+0, 1

GOTO L__main240

DECFSZ R11+0, 1

GOTO L__main240

NOP

NOP

;Semafor.mpas,332 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,333 :: end;

L__main238:

;Semafor.mpas,334 :: if PORTD = 1 then

MOVF PORTD+0, 0

XORLW 1

BTFSS STATUS+0, 2

GOTO L__main242

;Semafor.mpas,336 :: Delay_ms(500);

MOVLW 3

MOVWF R11+0

MOVLW 138

MOVWF R12+0

MOVLW 85

MOVWF R13+0

L__main244:

DECFSZ R13+0, 1

GOTO L__main244

DECFSZ R12+0, 1

GOTO L__main244

DECFSZ R11+0, 1

GOTO L__main244

NOP

NOP

;Semafor.mpas,337 :: goto stby;

GOTO L__main_stby

;Semafor.mpas,338 :: end;

L__main242:

;Semafor.mpas,339 :: goto galben;

GOTO L__main_galben

;Semafor.mpas,341 :: end.

L_end_main:

GOTO $+0

; end of _main

Similar Posts

  • Apelul Curtea de Apel

    C u p r i n s Competenta Curtii de Apel Regulamentul Curtii de Apel (extras) Sesizarea instantei in dreptul penal Plangerea Denuntul Plangerea prealabila Cauze care inlatura actiunea penala Cazuri in care este necesara plangerea prealabila pentru exercitarea actiunii penale. Caile de atac Caile de atac ordinare Persoanele care pot actiona prin caile de…

  • Formarea Contractului de Asigurare

    CUPRINS Introducere CAPITOLUL I Aspecte generale privind contractul de asigurare Secțiunea 1.1 Noțiunea de asigurare și definirea contractului de asigurare Secțiunea 1.2 Caracterele juridice ale contractului de asigurare CAPITOLUL II Formarea contractului de asigurare Secțiunea 1.1 Capacitatea Secțiunea 1.2 Consimțământul Secțiunea 1.3 Obiectul Secțiunea 1.4 Cauza Secțiunea 1.5 Clasificarea asigurărilor CAPITOLUL III Obligațiile părților Secțiunea…

  • Geneza Ideologiei Conservatoare

    Spre deosebire de doctrinele politice, ideologiile politice sunt mult mai suple și adaptabile realității. Ideologiile preiau din doctrinele politice corpusul de idei și valori propuse de acestea și încearcă adaptarea lor la realitățile societății. Ideologiile depășesc, astfel, cadrul didactic, încercând o transgresare a realului asupra idealului. De aceea ideologiile se impun asupra mentalităților colective devenind…

  • Insolventa Profesionittilor

    Capitolul I: Aspecte fundamentale referitoare la conceptul de profesionist si procedura insolvenței Capitolul II: Răspunderea civilă a administratorului și organelor de conducere ale debitorului aflat in insolvență Capitolul III : Elemente de noutate aduse prin Legea nr. 85/2014 privind procedurile de prevenire a insolvenței și de insolvență Capitolul IV : Studiu practic pe exemplul județului…

  • Consecinte ale Traficului de Fiinte Umane

    LUCRARE DE LICENȚĂ ANALIZA LOVERBOY VÂNĂTORUL DE SUFLETE Cuprins Capitolul 1. Aspecte introductive privind traficul de ființe umane 1.1 Concepte introductive privind traficul de ființe umane 1.2 Cadrul legislativ internațional 1.3 Cadrul legislativ în România Capitolul 2. Metoda de recrutare Loverboy 2.1 Etapele fenomenului traficului de ființe umane 2.2 Contextul bio-social pentru metoda Loverboy 2.3…

  • Cauzele Coruptiei

    Cauzele economice ale corupției constă în costul ridicat al vieții cu tendință de creștere continuă, degradarea economiei, pauperizarea populației, salarii joase ale funcționarilor publici. Lipsa încrederii în ziua de mâine generează necesitatea în realizarea acumulărilor care, prin combinarea cu nivelul scăzut de remunerare a muncii funcționarilor de stat, conduc la faptul că persoanele cu posturi…