Decodor Morse cu Pic

Introducere

Din cele mai vechi timpuri omenirea a fost interesată în transmiterea știrilor la distanță . Dar, în diferitele epoci, acest lucru s-a realizat în funcție de gradul de cunoștințe științifice ale vremii și de dezvoltarea forțelor de producție. De pildă în antichitate veștile erau transmise cu ajutorul focurilor care , aprinse pe locuri înalte , puteau fi văzute de la distanță.

Transmiterea informațiilor constituie un domeniu aflat în continuă evoluție datorită nevoilor tot mai mari de comunicație ale oamenilor, nevoie ce este cu greu satisfăcută chiar cu apariția internetului și a altor servicii de comunicare.

Aflându-ne în secolul vitezei cel mai important domeniu de activitate este cel al informației și al celor ce se întrepătrund cu acesta: colectarea, prelucrarea și distribuirea informațiilor de orice tip. Datorită progresului tehnologic rapid, aceste domenii converg în ritm alert, iar diferențele între colectarea, transportul, stocarea și prelucrarea informației dispar pe zi ce trece. Astfel, pe măsură ce posibilitățile noastre de a colecta, prelucra și distribui informația cresc tot mai, cererea pentru o prelucrare mai sofisticată a informației crește și mai rapid.

Pe măsură ce omenirea a urcat pe treptele istoriei, sistemele de transmitere a informației s-au perfecționat, ajungându-se la cele cunoscute astăzi. Dintre ele , cel mai răspândit este radioul, istoria acestuia reprezintă o înlănțuire de cercetări și descoperiri pasionale, ea a început cu aproximativ trei secole în urmă. Aparent multe din descoperirile și invențiile făcute în acest interval de timp n-au nici o legătură cu ce numim azi radio , în realitate însă ,ele se asamblează ca un joc de cuburi, contribuind la apariția și perfecționarea continua a radioului și implicit și a celorlalte forme de transmitere a informației la distanță cum ar fi:

telefonia

televiziunea

internetul

radioul.

O dată cu apariția și dezvoltarea acestora au apărut și noi tehnologii legate de cele veghi ca de exemplu telefonia celulară, televiziunea in culori și apoi cea prin sateliți , transmiterea informațiilor mai întâi prin foc, apoi prin cablu telefonic și în prezent prin fibră optică.

Deși acest domeniu are un înțeles mult mai larg , ne vom opri asupra unei anumite tehnici de transmitere a informației. Una dintre primele modalității utilizate în transmiterea informației a fost limbajul Morse, actualmente fiind utilizat de radioamatori în special.

În lucrarea de față am implementat un dispozitiv care realizează recepția unui mesaj în limbajul Morse ,decodificarea și afișarea mesajului transmis pe un display cu cristale lichide.

Limbajul Morse a fost inventat de către Samuel F. B. Morse. S. Morse a devenit cunoscut prin invențiile sale ,cele mai importante fiind telegraful si codul care îi poartă numele, folosit în telegrafie.

La începutul secolului al XIX–lea, înțelegerea fenomenului elecromagnetic a evoluat, astfel încât a devenit posibilă comunicarea între două stații separate.

*1819 Hans Oersted de Olanda a descoperit că un fir parcurs un curent electric radiază un câmp magnetic, direcția câmpului fiind în sens opus deplasării curentului electric.

* 1825 William Stergeon a inventat electromagnetul;

* cercetările lui M . Faraday și J. Henry asupra fenomenului electromagnetic în 1831 au ajutat studiile lui S. Morse la crearea receptorului telegrafic. Faraday a descoperit legile inducției magnetice. Curând S. Morse a reușit să îmbunătățească calitatea semnalului, utilizând etaje de amplificare și inventând dispozitive prin care transmitea semnale în ambele sensuri pe aceeași linie.

* în 1837 Morse împreună cu .Henry au încercat să găsească sprijin financiar pentru construirea unei linii de telegraf în SUA și mai târziu în Europa, dar fără succes;

* rămas fără partener, în 1843 a găsit suportul financiar pentru construirea unei linii de 41 de mile în SUA

*1844 Morse a transmis primul mesaj telegrafic dinBaltimore spre Washintong . Acest mesaj conținea textul :

„ What hath God wrought! ”

Primii pași în telecomunicații, folosind curentul electric, au fost făcuți prin transmiterea de impulsuri electrice într-un cod anumit sau astfel în cât la corespondent să fie indicate literele sau cifrele transmise. Cel mai cunoscut cod folosit pentru transmiterea de mesaje la distanță este codul Morse, format din linii și puncte.

Capitolul 1

Decodor Morse cu PIC – Prezentare Generală

În acest proiect am implementat un sistem care realizează decodarea simbolurilor Morse recepționate cu ajutorul unui microfon în miniatură.

Principiile care au stat la baza realizării acestui proiect sunt descrise în următoarele subcapitole.

Codul Morse – Prezentare Generală

Radiocomunicațiile pot fi realizate în două feluri : fie în telegrafie, folosind coduri și prescurtări și transmițând semne ale alfabetului Morse, fie în telefonie, transmițând direct vocea omenească sau alte sunete cu ajutorul microfonului.

Transmisia telegrafică este cea mai des folosită, având o serie de avantaje.

Astfel aparatura de radioemisie și radiorecepție este mai simplă și mai ușor de construit:

– banda de frecvență ocupată de o emisie radiotelegrafică este foarte îngustă, în general

– câteva sute de Hz, spre deosebire de emisiunile telefonice, care ocupă o bandă de frecvențe mult mai mare. Aceasta ne permite să îngustăm banda de frecvențe radioreceptorului până la câteva sute de Hz și deci să mărim considerabil selectivitatea lui, ceea ce asigură o recepție mult mai bună, lipsită de interferențe și paraziți.

Ca rezultat, distanța la care același semnal poate fi recepționat este de două, trei ori mai mare în telegrafie decât în telefonie. Folosirea prescurtărilor și a codurilor internaționale în telegrafie permite legături rapide între stații diferite. Inventat cu peste un secol înainte de Samuel Morse, acest cod, care îi poartă numele, exprimă literele alfabetului, cifrele arabe și semnele de punctuație prin combinații de linii (semnale lungi ) și puncte (semnale scurte).

Elementul fundamental îl constituie punctul. Punctul este un semnal de o anumită durată, modulat audio. Unitatea fundamentală de timp este durata unui punct.

Acesta este timpul în care se transmite punctul, neincluzând un spațiu înainte sau după transmisie. Duratele tuturor celorlalte elemente sunt derivate din unitatea fundamentală, utilizând următoarele reguli:

1. durata unei linii este de trei puncte;

2. intervalul de timp dintre fiecare simbol sau element (punct sau linie ) este durata a unui punct;

spațiul dintre caractere are durata a trei puncte;

spațiul dintre cuvinte are durata a șapte puncte.

Durata unui punct se calculează după relația:

Durata punct [ms] = (1.1)

(WPM = Words Per Minute)

Această formulă reiese din utilizarea cuvântului PARIS, cuvânt standard folosit la calibrarea vitezei codului Morse. PARIS are 50 de unități lungime când este transmis în cod Morse.

Tabelul 1.1 prezintă setul de caractere ASCII și echivalentul lor în cod Morse:

Tabelul 1.2: Alfabetul Morse

Alfabetul Morse se poate învăța auditiv, adică după sunet, pentru aceasta avem nevoie de un aparat care să ne dea o frecvență muzicală pe care să-o putem întrerupe cu ajutorul manipulatorului (dispozitivul folosit pentru obținerea duratelor liniilor și punctelor la transmisia Morse), în vederea obținerii semnalelor Morse, acest aparat poartă denumirea de „Generator de ton ”. De obicei semnalele Morse sunt recepționate după auz în cască sau difuzor, punctul fiind redat printr-un sunet scurt iar linia după cum am precizat, printr-un sunet lung.

Decodarea se face de către un operator uman calificat, caz în care pot apare unele limitări datorită vitezei cu care acesta poate recepționa și decodifica semnalul transmis.

Cu ajutorul acestui Decodor Morse cu PIC se poate crește foarte mult viteza de

recepționare și decodare a semnalelor recepționate cu dezavantajul măririi complexității montajului în schimb operatorul nu trebuie să fie specializat în limbajul Morse.

1.2 Schema bloc – prezentare generală

Decodorul este proiectat să funcționeze de la 6 [WPM] până la viteze mai mari de 36 [WPM] . Algoritmul folosit realizează o adaptare rapidă la schimbarea de viteză, cu condiția păstrării raporturilor între simboluri.

Se disting 4 blocuri funcționale:

Circuitul de recepție cu microfon

Decodorul de ton

Sursă de alimentare

Etajul cu microcontroler

Display – ul LCD

Schema bloc este prezentată în figura următoare: 4

3

1 2

6 5.

1. Microfon + Preamplificator

2. Decodor de Ton ( LM567 )

3. Blocul cu MCU (PIC16F84)

4. Display LCD (M1641)

5. Interfața cu PC-ul (RS232)

6. Sursa de alimentare (A 78XX )

1.2.1 Circuitul de recepție cu microfon

Microfoanele sunt traductoare mecanoelectrice (mai exact acustoelectrice) care transformă undele sonore în tensiune electrică variabilă. Eficiența transformării se măsoară prin sensibilitatea microfoanelor, adică prin valoarea tensiunii electrice furnizate pentru unitatea de presiune acustică.

Valoarea tensiunii electrice furnizate de un microfon este determinată de sensibilitatea lui și de valoarea presiunii acustice, fiind egală cu produsul lor. Se precizează că presiunea acustică la pragul de audibilitate este de 20 Pa (la frecvența de 1 kHz ), iar pragul de durere, 20 Pa, raportul dintre ele fiind de 1 : 106. Unei discuții puternice îi corespunde o presiune de 20 mPa. La această presiune microfonul cu o sensibilitate de 1 m V/ Pa dă o tensiune de 1 (mV / Pa ) * 20 mPa = 20V.

Deoarece acest semnal are o valoare foarte mică se folosește un preamplificator

înainte de Decodorul de Ton.

Preamplificatoarele sunt montaje destinate în general realizării unei amplificări

cât mai mari a semnalelor de audiofrecvență slabe, rezultate de la o sursă: detector, picup magnetofon iar în cazul nostru microfon.

Uneori aceste semnale nu au intensitatea necesară pentru a fi preluate de un amplificator obișnuit.

Cerințele principale care trebuie îndeplinite de preamplificatoarele de microfon

sunt adaptarea impedanței sursei de semnal și asigurarea unei amplificări de tensiune ridicate, în condiții de zgomot propriu și distorsiuni mici, într-o gamă dinamică suficient de extinsă.

Întrucât nu este necesară modificarea spectrului semnalului furnizat de microfon în scopul corectării unor neajunsuri ale caracteristicii de frecvență a acestuia, preamplificatoarele de microfon au scheme mai simple decât cele pentru doze de picup și pentru capete magnetice ( care conțin în plus circuite speciale de corecție ).

Etajul format din microfon și preamplificator este realizat astfel:

– microfonul cu condensator ( în miniatură )

– etajul preamplificator realizat cu un tranzistor în conexiune emitor comun, schema clasică cu performanțe bune.

Decodorul de ton

Al doilea etaj este constituit dintr-un decodor de ton cu buclă PLL implementat cu circuitul integrat LM567 (decodor de ton PLL ). Acest bloc funcțional filtrează semnalul captat de microfon într-o anumită bandă , frecvența fundamentală putând lua valori între 600 și 1780 [Hz] cu valorile componentelor din schema electrică.

Ieșirea decodorului de ton realizează o replică a semnalului de intrare în nivele TTL, permițând interfațarea cu microcontrolerul ( etajul următor).

1.2.3 Etajul cu microcontroler (PIC16F84)

Cel de-al treilea bloc funcțional constă în microcontrolerul pe 8 biți PIC16F84

produs de firma Microcip. Funcția lui este de a măsura durata unui „0” logic de la ieșirea decodorului de ton. Acest „0” logic indică recepția unui ton de către microfon.

Această durată este convertită în linii , puncte , spații între litere , spații între cuvinte. De asemenea , procesorul realizează și o corecție a semnalelor recepționate în situația în care decodorul de ton omite un semnal. Această facilitate am considerat-o esențială pentru or obișnuit.

Cerințele principale care trebuie îndeplinite de preamplificatoarele de microfon

sunt adaptarea impedanței sursei de semnal și asigurarea unei amplificări de tensiune ridicate, în condiții de zgomot propriu și distorsiuni mici, într-o gamă dinamică suficient de extinsă.

Întrucât nu este necesară modificarea spectrului semnalului furnizat de microfon în scopul corectării unor neajunsuri ale caracteristicii de frecvență a acestuia, preamplificatoarele de microfon au scheme mai simple decât cele pentru doze de picup și pentru capete magnetice ( care conțin în plus circuite speciale de corecție ).

Etajul format din microfon și preamplificator este realizat astfel:

– microfonul cu condensator ( în miniatură )

– etajul preamplificator realizat cu un tranzistor în conexiune emitor comun, schema clasică cu performanțe bune.

Decodorul de ton

Al doilea etaj este constituit dintr-un decodor de ton cu buclă PLL implementat cu circuitul integrat LM567 (decodor de ton PLL ). Acest bloc funcțional filtrează semnalul captat de microfon într-o anumită bandă , frecvența fundamentală putând lua valori între 600 și 1780 [Hz] cu valorile componentelor din schema electrică.

Ieșirea decodorului de ton realizează o replică a semnalului de intrare în nivele TTL, permițând interfațarea cu microcontrolerul ( etajul următor).

1.2.3 Etajul cu microcontroler (PIC16F84)

Cel de-al treilea bloc funcțional constă în microcontrolerul pe 8 biți PIC16F84

produs de firma Microcip. Funcția lui este de a măsura durata unui „0” logic de la ieșirea decodorului de ton. Acest „0” logic indică recepția unui ton de către microfon.

Această durată este convertită în linii , puncte , spații între litere , spații între cuvinte. De asemenea , procesorul realizează și o corecție a semnalelor recepționate în situația în care decodorul de ton omite un semnal. Această facilitate am considerat-o esențială pentru o funcționare robustă în condiții de variație a semnalului.

O altă funcție importantă realizată de MCU constă în adaptarea la variațiile de viteză ale codului, adaptare posibilă prin calcularea unei medii a componentei semnalelor în timp real. Această medie este folosită în calculul nivelului de prag, pentru interpretarea corectă a simbolului.

Cu alte cuvinte, orice semnal recepționat care are o durată mai mică decât un anumit interval ( 16 [ms] ) este considerat zgomot, fiind ignorat. Fiecare simbol recepționat este memorat, iar atunci când se ajunge la un anumit număr de simboluri , acestea sunt asamblate pentru conversia lui în caracter ASCII echivalent ce urmează a fi afișat . De asemenea , procesorul comandă un led sincron cu intrarea. Inițial, LED-ul a fost introdus pentru depanarea programului , devenind mai apoi util în verificarea că procesorul primește ceea ce decodorul de ton transmite.

În sfârșit, procesorul realizează atât interfațarea cu un display cu cristale lichide ( LCD ) pe care afișează caracterele ASCII, cât și controlul display-ului. De asemenea, întregul montaj prezintă interfață cu portul serial al unui PC ( RS232C ), acest lucru conferind două facilități:

1. posibilitatea reprogramării microcontrolerului în circuit, modelul implementat fiind compatibil cu programatoarele serial de tip LUDIPIPO sau PROG84;

2. vizualizarea caracterelor ASCII recepționate pe PC prin utilizarea unui program terminal de comunicație gen Kermit sau Minicom setat la 8N1 și rată 2400 bps .

1.2.4 Display-ul LCD

Al cincilea boc îl reprezintă display-ul LCD. Am utilizat un modul LCD alfanumeric 1×16 ( 16 caractere 1singură linie ), produs de Seiko Instruments. Acest display are încorporat un controler compatibil HD44780 (standard industrial ), un generator de caractere și o memorie de date pentru stocarea caracterelor afișate. Funcțiile display-ului sunt controlate prin instrucțiuni, modulul putând fi astfel interfațat cu microcontrolerul.

1.2.5 Sursa de alimentare

Alimentarea cu energie a montajelor electronice reprezintă o cerință esențială în orice sistem în scopul conversiei parametrilor tensiune curent conform scopului urmărit.

Pentru orice schemă electronică este prevăzut un regim energetic care trebuie realizat de către blocul de alimentare.

Bateriile și acumulatoarele reprezintă pentru montajele electronice surse de energie aproape ideale, deoarece nu introduc, pe întreaga perioadă a funcționării lor, distorsiuni sau paraziți de natură electrică. Inconvenientul surselor chimice constă în durata de viață limitată pentru baterii și faptul că acumulatoarele trebuie reîncărcate periodic.

Rețeaua de curent alternativ reprezintă o sursă constantă de energie, care trebuie, printr-o serie de transformări, adaptată necesităților energetice ale montajului electronic. Alimentarea curent alternativ-curent continuu se face ținând cont de următorii factori:

– valoarea curentului continuu maxim

– valoarea tensiunii continue

– factor de stabilitate al tensiunii continue.

De obicei acest sistem, numit redresor, include următoarele componente:

– transformatorul de rețea, care realizează conversia energiei din rețea la parametrii apropiați de cei necesari alimentării montajului în curent continuu- tensiune continuă

– redresorul propriu-zis, care transformă tensiunea alternativă în tensiune continuă pulsatorie.

– blocul de filtraj al tensiunii continue pulsatorii, format dintr-un grup de condensatoare electrolitice și neelectrolitice

– stabilizator de tensiune, funcție de tipul alimentării cu energie a blocului electronic ( preamplificator, corector de ton, etc. )

În acest proiect nu am pus mare accent pe calculul alimentatorului deoarece componentele acestuia se găsesc în comerț, reprezentativ pentru acest decodor este partea formată din decodorul de ton și etajul cu microcontroler .

Ca stabilizator de tensiune am folosi circuite din familia:A78xx produse de firma BĂNEASA S.A . Aceste circuite sunt produse în două variante: cu capsule tip TO-220 (78XXA / 78XXC ) și capsulă tip TO-3 ( 78XXAK și 78XXCK ).

Cei mai semnificativi parametrii sunt prezentați în continuare:

Capitolul 2

Implementarea Hardware a Decodorului Morse

Cele patru blocuri funcționale ale sistemului sunt descrise pe larg în acest capitol.

2.1 Microfonul și Preamplificatorul de microfon

Acest etaj este alcătuit dintr-un microfon cu condensator și un amplificator realizat cu un tranzistor în conexiune emitor comun. O observație importantă ar fi modificarea rezistenței de 15 [K] în serie cu microfonul, valoarea acesteia depinzând de tipul microfonului cu condensator utilizat.

Preamplificatorul utilizează un tranzistor bipolar tip BC 173 , de zgomot mic, pentru obținerea unor performanțe cât mai bune. Acest preamplificator realizează amplificarea semnalului de la microfon precum și o primă filtrare cu ajutorul condensatorului de 100 [pF].

La ieșire semnalul este suficient de puternic pentru a ataca etajul următor.

2.2 Decodorul de ton

Este realizat cu un circuit integrat specializat LM567 produs de National Semiconductors. Circuitul integrat LM567 este un integrat utilizat în scară largă pentru decodoarele de ton. La ieșire are un tranzistor care lucrează în comutație ,(regim saturat-blocat), astfel încât prezența unui semnal la intrarea decodorului, cu frecvența în banda de trecere a filtrului determină saturarea tranzistorului , rezultând la ieșire un nivel corespunzător lui “0” logic.

Componentele externe sunt utilizate pentru setarea frecvenței fundamentale

(F0) a benzii și pentru întârzierea ieșirii.

În principiu , este vorba despre un filtru trece bandă (FTB) , realizat cu buclă

PLL . Componenta alternativă a semnalului de la ieșirea preamplificatorului de microfon ajunge la intrarea decodorului (pinul 3) prin intermediul unui condensator fix.

Capacitatea din pinul 2 ( Input Filter) stabilește banda de trecere a filtrului conform următoarei relații aproximative de calcul.:

B=1070 , unde (2.1)

Vi= tensiunea de intrare [volți rms] VI<=200 mV

C2=capacitatea condensatorului din pinul 2 [F]

Frecvența fundamentală a decodorului de ton este egală cu frecvența liberă de

oscilație a oscilatorului comandat în tensiune (VCO) . Această frecvență este aproxi-mată de următoarea relație de calcul:

F0, unde (2.2)

R1 = rezistența din pinul 5 (Rvco);

C1 = condensatorul din pinul 6.

În cazul nostru e necesar ca fundamentala filtrului trece bandă să fiecuprinsă

în intervalul 600[Hz]-1800[Hz], aceasta fiind gama tipică de frecvențe utilizate în

transmisiunile Morse. Așadar , s-a impus ca pentru C1 să se folosească un condensator

fix cu capacitatea de 0.1 [F] și conform relației 2.2 avem:

fmin= 600[Hz]

=> R1=

C1=0.1 [ F]

Fmax=1780[Hz]

=> R1=

C1=0.1 [F]

La implementare s-a ales pentru R1 un rezistor fix de 5.1[k] ]n serie cu un semireglabil liniar de 10[k] .

Ieșirea decodorului de ton este compatibilă TTL , fiind capabilă să debiteze un curent de maxim 100[mA] . Dintre caracteristicile acestui decodor de ton (LM567) se

evidențiază:

– o puternică rejectare a semnalelor care nu se află în banda de trecere a filtrului;

– imunitate la semnale false;

– o foarte bună stabilitate pe frecvența centrală (F0) ;

– alegerea frecvenței centrale într-un domeniu suficient de larg : 0.01[Hz]-500[KHz];

– reglajul lățimii benzii de la 0-14[%] din F0;

– timp de calare a buclei PLL mic.

La ieșirea decodorului de ton s-a montat un led indicator printr-o rezistență de

limitare a curentului pentru urmărirea funcționarii etajului.

2.3 Etajul cu MCU

Elementul principal al decodorului Morse îl constituie microcontrolerul PIC16F84, produs de firma Microcip descris în paragraful următor.

Jumperi sunt folosiți pentru setarea modului de programare; practic deconectează semnalele RB6, RB7 și MCLR, semnale utilizate pentru programare; și conectarea acestora la portul serial al PC.ului.

Alimentarea montajului se face de la o sursă stabilizată de +5[V] de curent continuu consumul total fiind de sub 100[mA].

Acest integrat face parte din familia PIC16XXX , caracterizată prin:

-preț redus

-performante foarte bune

-tehnologie CMOS a procesoarelor pe 8 biți.

Această familie este formată din următoarele tipuri de integrate:

– PIC16F83

– PIC16F84

– PIC16CR83

– PIC16CR84

Din punct de vedere al setului de instrucțiuni aceste microcontrolere sunt compatibile, diferențele dintre ele constând în capacitatea memoriei program (512 bytes pentru PIC16X83, respectiv 1024 bytes pentru PIC16X84 ), tipul de memorie program ( CMOS sau FLASH ), memoria de tip ROM prezentă la PIC16CR83, respectiv PIC16CR84 și capacitatea memoriei de date (36 , respectiv 68 bytes ).

Aceste microcontrolere au implementată arhitectura RISC (Reduce Instruction Set Code ) astfel au disponibil 35 de instrucțiuni ( un set redus față de alte micro-controlere). Construit pe o arhitectură de tip Harvard, procesorul folosește bus-uri separate pentru instrucțiuni și pentru date, ceea ce permite utilizarea unor instrucțiuni de 14 biți lungime și o magistrală de date pe 8 biți.

Tipic microcontrolerul PIC16F84 are pînă la 64 bytes memoria RAM, 64 bytes memoria de date EEPROM și 13 porturi de intrare-ieșire. Un prescaler (T M R0) este de asemenea disponibil.

Există patru opțiuni în ceea ce privește configurația oscilatorului extern. Utilizatorul poate programa 2 biți de configurare (FOSC1 și FOSC2 ) pentru selecția unuia dintre cele patru moduri:

– LP (Lower-Power Crystal)

– XT (Crystal / Resonator )

– HS ( Hoght Speed-Crystal-Resonator )

– RC ( Resistor / Capacitor )

În situația decodorului Morse , am utilizat pentru oscilatorul extern un cristal de cuarț de 4.9152 [MHz], împreună cu două condensatoare de 33 [pF] pentru asigurarea stabilității. Alocarea porturilor de intrare/ieșire (I/O) este descrisă în capitolul 3.

2.3.1 Arhitectura internă a procesorului PIC16F84

Înalta performanță a familiei PIC16XXX este caracteristică tuturor procesoarelor Risc. În primul rând , PIC16XXX folosește o arhitectură de tip Harvard.

Figura 2.1 prezintă o diagramă bloc simplificată a structurii interne a PIC1684

În această arhitectură programul și datele sunt accesate din memorii separate. Deci dispozitivul are magistrala pentru memoria program și separat magistrala pentru memoria de date.

Acest lucru face posibilă atingerea unor viteze mai mari decât în arhitecturile tradiționale von Newmann, unde atât programul cât și datele sunt accesate din aceeași memorie și folosind aceeași magistrală.

Instrucțiunile pentru PIC16XXX sunt de 14 biți lungime. Bus-ul de 14 biți atașat memoriei program permite execuția instrucțiunii de 14 biți într-un singur ciclu

2.3.2 Diagrama de tact/ciclul unei instrucțiuni

Intrarea de clock (OSC1) este divizată intern cu 4, generând patru semnale de tact interne : Q1, Q2 ,Q3, Q4. Numărătorul de program (Program Counter ) este incrementat la fiecare Q1, instrucțiunea fiind preluată din memoria programului și încărcată în registrul de instrucțiuni în ciclul Q2, iar după aceea decodată și executată în intervalul de la Q3 la Q4. Diagrama care cuprinde tactul și execuția unei instrucțiuni este prezentată în figura 2.2

2.3.3 Execuția unei instrucțiuni

Un ciclu mașină constă în patru cicluri Q1, Q2, Q3, Q4. Execuția unei instrucțiuni este realizată efectiv într-un singur ciclu complet. Dacă instrucțiunea determină modificarea numărătorului de program (PC), de exemplu utilizând instrucțiunea Goto, atunci două cicluri sunt necesare pentru completarea execuției.

Un ciclu începe cu incrementarea numărătorului de program în intervalul Q1. În continuare instrucțiunea este copiată în registrul de instrucțiuni. Această instrucțiune este apoi decodată și executată în intervalele Q2, Q3 și Q4.

Memoria de date este citită în timpul Q2 și scrisă în intervalul Q4. Un exemplu al execuției unei instrucțiuni este prezentat in figura 2.3 :

Figura 2.3 : Exemplul de execuție a unei instrucțiuni de către procesorul PIC16F84

2.3.4 Organizarea memoriei

PIC16F84 are două blocuri de memorie : memoria program și memoria de date. Fiecare bloc are propriul bus ,deci accesul în fiecare dintre ele este posibil în timpul acelea-și perioade de tact . Memoria de date este împărțită în :

– memoria RAM cu caracter general (general purpose RAM)

– regiștri cu funcție specială (special function register SFR).

Zona memoriei de date conține și secțiunea EEPROM. Această memorie este mapată indirect în memoria de date. Cei 64 bytes ai memoriei de date EEPROM sunt adresabili în intervalul 0H- 3fH.

2.3.5 Porturile de intrare – ieșire

PIC16F84 are două porturi, PORTA și PORTB . Unii pini ai acestor porturi sânt

multiplexați , având mai multe funcții , după cum urmează:

PORTA

1. RA0-port bidirecțional de intrare- ieșire de tip TTL

2. RA1-port bidirecțional de intrare- ieșire de tip TTL

3. RA2-port bidirecțional de intrare- ieșire de tip TTL

4. RA3-port bidirecțional de intrare- ieșire de tip TTL

5. RA4/TOCKI poate fi selectat ca port bidirecțional de intrare-ieșire intrarea fiind de tip Triger-Schmith, respectiv ieșire cu colectorul în gol (open drain). De asemenea, poate fi selectat ca intrare de clock pentru numărătorul TM R0.

PORTB

PORTB este un port bidirecțional. Registrul PORTB poate fi programat Software.

1.RB0/INT poate fi selectat și ca pin de întrerupere externă. Ieșirea este TTL, intrarea Trigerr-Schmitt;

2. RB1-port bidirecțional de intrare-ieșire de tip TTL

3. RB2- port bidirecțional de intrare-ieșire de tip TTL

4. RB3- port bidirecțional de intrare-ieșire de tip TTL

5. RB4- port bidirecțional de intrare-ieșire de tip TTL

6. RB5- port bidirecțional de intrare-ieșire de tip TTL

7.RB6- port bidirecțional de intrare-ieșire de tip TTL, cu intrare de tip Triger-Schmitt cînd este utilizat în modul de programare serială. Pe aceasta se aplică semnalul de tact (CLOCK) în timpul programării.

8. RB7– port bidirecțional de intrare-ieșire de tip TTL sau intrare dedate (DATA) în modul de programare serială.

2.3.6 Caracteristici tipice ale microcontrolerului PIC16F84

Microcontrolerul PIC16F84 a fost proiectat astfel încât să se obțină fiabilitate maximă minimizînd costurile de producție prin eliminarea componentelor exterioare, oferind facilități de consum redus (power saving ) și de protecție a codului (locații ID).

Caracteristici ale PIC16F84 :

1. Selectarea tipului de oscilator;

2. Resetul:

-la pornire POR (Power on reset);

-resetul numărătorului la pornire PWRT (Power up timer);

-OST (Oscillator start up timer):

3. Sistemul de întreruperi (în număr de patru);

4. Counter-ul WDT (Watchdog) ;

5. Modul SLEEP de operare cu consum redus (Stand By);

6. Locații speciale de memorie pentru coduri de acces la program (ID );

7. Programarea serială în circuit.

PIC16F84 este dotat cu un oscillator WDT (Watchdog ), care poate fi dezactivat Numai prin biții de configurare. Acesta folosește propriul oscilator de tip RC, fiind independent de oscilatorul extern din pinii OSC1 și OSC2. În timpul unei funcționări Normale , trecerea prin ”0” a numărătorului WDT generează un reset al procesorului; dacă acesta este în modul SLEEP, aceeași situație determină revenirea procesorului în starea normală de funcționare (Wake-up) și continuarea execuție programului.

WDT poate fi dezactivat permanent prin programarea bitului de configurare WDTE cu ”0”.

Există două numărătoare care realizează o întârziere la pornire. Primul este OST-ul (Oscillator start up timer ) ; acesta menține procesorul în stare de reset pînă Când oscilatorul pilotat cu cuarț devine stabil. Cel de-al doilea numărător este PWRT (Power up timer ) și realizează o întîrziere fixă de 72[ms] numai la pornire.

Această structură menține procesorul în stare de reset pînă în momentul stabilirii alimentării. Datorită acestor două numărătoare integrate în cip , cele mai multe dintre aplicații nu necesită circuit extern pentru reset.

Modul SLEEP este un mod de consum redus în care procesorul este inactiv (Stand by). Utilizatorul poate readuce procesorul în starea normală , din modul SLEEP

printr-un reset extern ,trecerea prin ”0” a numărătorului WDT (Watchdog) sau prin generarea unei întreruperi (IRQ).

Există mai multe opțiuni pentru tipul de oscilator extern folosit. Oscilatorul RC este utilizat pentru reducerea costurilor , în timp ce modul LP cu cristal de cuarț reduce consumul. Există un set de biți care permit configurarea și selecția modului folosit.

2.3.7 Setul de instrucțiuni

Fiecare instrucțiune este reprezentată printr-un cuvânt de 14 biți lungime pentru

Microcontrolerele PIC16FXXX. Setul de instrucțiuni este grupat în trei categorii după cum urmează:

1. Operații orientate pe byte (Byte oriented);

2. Operații orientate pe bit (Bit oriented);

3. Operații orientate de control (Literal and control).

Figura 2.4 Formatul general al unei instrucțiuni

Toate aceste instrucțiuni sunt executate într-un singur ciclu mașină, cu excepția

instrucțiunilor de condiționare, sau când numărătorul de program (PC) se modifică în urma execuției unei instrucțiuni. În acest caz execuția durează două cicluri mașină în cel de-al doilea ciclu executându-se instrucțiunea nop (No operation).

Figura 2.5: Setul de instrucțiuni pentru PIC16F84

Un ciclu mașină constă în patru perioade de tact. De aceea, pentru un oscilator

extern cu frecvența de 4 [MHz] timpul în care se execută în mod normal o instrucțiune este de 1 [s]. În cazul în care se testează îndeplinirea unor condiții sau schimbarea numărătorului de program ca rezultat al unei operații, timpul de execuție devine 2 [s].

În figura 2.4 este prezentat formatul general al unei instrucțiuni:

Figura 2.5 prezintă settul de instrucțiuni recunoscut de assembler–ul PICASM descrierea completă a instrucțiunilor se află în manualul de utilizare a microcontrolorului, disponibil în format PDF pe pagina de Internet a firmei Microchip.

2.4 Modulul LCD M1641

Afișarea caracteristicelor ASCII decodate de microcontroler se realizează pe un display alfanumeric 1×16 (o linie și 16 caractere ) de tip M1641, produs de Seiko Instruments. Acest modul conține o matrice de cristale lichide (LCD) de consum redus, contrast ridicat și vizibil dintr-un unghi larg (TN LCD) și un controler CMOS-LCD integrat.

Controlerul este realizat după standardul industrial al firmei Hitachi, HD44780.Generatorulde caractere este integrat în controler și cuprinde setul complet de caractere ASCII, plus altele. Toate funcțiile display-ului sunt controlabile prin intermediul unui set de instrucțiuni, astfel încât modulul poate fi ușor interfațat cu un microcontroler (MCU). Această caracteristică îl face apicabil într-un domeniu larg, incluzând sistemele de afișare pentru computere sau în aparatură de măsură.

Caracteristicile acestui modul sunt:

16 caractere pe o singură linie, fiecare caracter fiind reprezentat folosind o matrice 5×7 puncte și cursorul;

generatorul de caractere ROM conține 192 de tipuri de caractere, fontul folosit fiind 5×7;

generatorul de caractere RAM pentru 8 tipuri de caractere definite de utilizator (font 5×7);

memoria RAM pentru date 80×8 bit ,ceea cepermite memorarea a până la 80 de caractere;

posibilitatea interfațării cu MCU, folosind 4 sau 8 biți pentru date;

oscilator integrat;

alimentare la 5[V ;

circuit de reset automat la punereasub tensiune;

domeniul de temperatură 0 – 50 C.

Funcțiile pinilor sunt descrise în Tabelul 2.1:

Tabelul 2.1: Semnificația pinilor modulului LCD M1641

2.4.1.Regiștri

Modulul LCD prezintă doi regiștri de 8 biți cu următoarea semnificație:

Registrul de instrucțiuni (IR);

Registrul de date (DR).

Aceștia sunt selectați de pinul RS conform Tabelulu2.1.Registru(IR)memorează

codul instrucțiunii, cum ar fi: Display Clear sau Cursor Shift, adresa (DD RAM) poziției în care urmează să afișeze și adresa caracterului de afișat.

Registrul (DR) memorează temporar datele ce urmează a fi scrise în (DR RAM) sau (CG RAM), sau citite din (DD RAM) sau (CG RAM).

2.4.2 Flagul Busy ( BF )

Acest flag indică dacă modulul este gata să accepte următoarea instrucțiune. Starea acestui bit trebuie să fie verificată de fiecare dată înaintea execuției unei instrucțiuni. Dacă o instrucțiune este executată fără verificarea prealabilă a acestui bit, apare o întârziere în execuția instrucțiunii respective.

2.4.3 Numărătorul de adresă ( AC )

Numărătorul de adresă (Address Counter ) specifică adresa la care datele sunt scrise sau citite în DD RAM sau CG RAM. Când datele sunt scrise sau citite din ( DD RAM ) / ( CG RAM ), registrul AC este în mod automat incrementat, respectiv decrementat, conform cu modul de operare selectat de Entry Mode Set. Conținutul numărătorului de adresă ( AC ) este copiat în ieșirile DB0 – DB6 ,conform tabelului anterior, dacă RS=0 și R/W=1.

2.4.4 Memoria RAM de date a display-ului ( DD RAM )

( DD RAM ) este o capacitate de până la 80×8 biți și memorează datele afișate a80 de caractere a câte 8 biți fiecare.

2.4.5 Generatorul de caractere ROM ( CG ROM )

Generatorul are predefinite 192de tipuri de caractere cu font de 5×7 puncte, fiecare fiind reprezentat pe 8 biți. Tabelul 2.6 prezintă corespondența dintre codurile caracterelor și tipurilor acestora.

2.4.6 Generatorul de caractere RAM ( CG RAM )

( CG RAM ) este folosit pentru definirea de către programator a caracterelor. opt tipuri de caractere pot fi astfel programate.

2.4.7 Setul de instrucțiuni

Modulul LCD M1641 are un set de 11 instrucțiuni utilizate la inițierea și funcționarea în bune condiții. Acestea sunt: Display Clear, Cursor Home, Entry Mode Set, Display ON/OFF Control, Function Set, CG RAM Address Set, BF/ Address Read, Data Write to CG RAM, Data Read from CG RAM or DD RAM.

Descrierea instrucțiunilor disponibile pentru adresarea modulului LCD sunt prezentate în manualul de utilizare, disponibil pe Internet la site-ul firmei Seiko Instruments.

2.4.8 Inițializarea modulului LCD M1641

Tabelul 2.2 prezintă etapele care realizează inițializarea și afișarea unor caractere. Pentru exemplificare s-a ales varianta de adresare pe 4 biți folosită și la implimarea decodorului Morse (listing-ul din Adresa 1 ).

Tabelul 2.2: Inițializarea modului M1641

Capitolul 3

Implementarea Software a decorului

Partea soft a proiectului constă în programul scrisîn limbajul nativ de asamblare al micropocesorului PIC16F84.

Elementul principal îl constituie utilizarea a două buffere care memorează întru-un registru din memoria RAM lungimea simbolului anterior ( punct/linie ). Datorită acestora adaptarea la schimbările de viteză apare practic instantaneu.

3.1 Definirea constantelor și atribuirea porturilor

În această etapă este definit vectorul noise. Această constantă este utilizată pentru eliminarea zgomotului, fiind comparată cu durata tonului recepțioonat. Valoarea lui noise se scade din vectorul care dă durata tonului recepționat. Dacă rezultatul este negativ, rezultă că durata tonului recepționat este mai mică sau egală cu valoarea vectorului noise. Se concluzionează că tonul recepționat este zgomot (noise=0x02 ),ceea ce înseamnă că a fost de durata mai mică sau egală cu 16[ms] .

Tot în această etapă se face asigurarea porturilor astfel:

Registrul PORTA:

– bitul 0( RA0 ), bitul ( RA1 ) și bitul 2( RA2 ) nu sunt utilizați;

– bitul 3( RA3 ) este folosit la transmiterea caracterului ASCII decodificat către portul serial al PC-ului;

– bitul 4(RA4 ) programat ca ieșire cu colector în gol ( open drain ) conectează un LED care funcționează sincron cu intrarea pentru verificare, fiind inițial conectat pentru depanarea soft-ului. Acesta indică faptul ca procesorul recepționează ceea ce decorul de ton transmite la ieșire;

Registrul PORTB:

– bitul 0( RB0 )-bitul 2( RB1 ) și bitul 3( RB3 ) sunt programați ca ieșiri și conectați la magistrala de date (biții D4 – D7 ) a modulului LCD;

– bitul 4(RB4), bitul 6(RB6) generează semnalele de control pentru adresarea corectă a display-ului LCD, după cum urmează:

– bitul 4(RB4 ) generează semnalul E (Enable);

– bitul 5(RB5 ) generează semnalul R/W (Read/Write);

– bitul 6(RB6 ) generează semnalul RS (Register Select);

– bitul 7(RB7) programat ca intrare conectează ieșirea decodorului de ton și reprezintă intrarea în etajul cu MCU.

3.2 Alocarea memoriei RAM. Pointeri. Variabile

Începând de la adresa 0x0c se găsește memoria de date a MCU. Aici sunt definite ca variabile regiștrii virtuali folosiți în program. De exemplu:

registrul codeword conține caractere ASCII decodat;

registrul timecnt este variabila care memorează durata unui ton recepționat;

registrul flags conține biții: bitul 7(variabila DitDah ) cu semnificația setat ( DitDah=1)pentru punct,resetat (DitDah=0) pentru linie; bitul 6(variabila Overflow) semnalizează supradepășirea counter-ului la o rată de trasmisie prea mare acodului.

3.3 Programul principal

Acesta începe cu adresarea vectorului de RESET (locația 0x0000) care realizează un reset soft al procesorului. După aceasta urmează o divizare cu32 a frecvenței oscilatorului exterior pilotat cu cristal de cuarț, apoi cu 4 pentru ase obține perioada de tact de 4[ms . Se inițializează regiștrii corespunzători porturilot A și B. În această secvență se inițializează modulul LCD și este apelată rutina de afișare a mesajului de întâmpinare precum și o rutină de întârziere.

Inițial bitul 4 din portul A (LED-ul) este setat ,ceea ce face ca LED-ul să fie stins.Urmează o bluclă în care se citește bitul 7 din portul B (intrarea) la fiecare 4[ms]. Dacă acest bit este setat (”1” logic) se reia bucla, dacă este resetat (”0” logic ), ceea ce înseamnă prezența unui ton, se execută următoarea etapă. Această nouă etapă constă în aprinderea LED-ului (RA4 în ”0” logic), resetarea contorului pentru intervalul de timp al tonului recepționat, se testează lungimea tonului recepționat prin comparație cu vectorul noise până când timpul cât s-a recepționat tonul devine mai mare decât 16[ms] ;se testează din nou prezența tonului încă un ciclu. Ajunși în acest stadiu, tonul nu mai este prezent, simbolul este recepționat, însă nu cunoaștem dacă este punc sau linie. Se presupune că primul simbol recepționat este linie. Urmează resetarea timer-ului, setarea bitului 4 din registru PORTA (LED-ul stins) și incrementarea primului simbol.

Se așteaptă apariția unui nou ton pentru a vedea ce fel de spațiu a fost (spațiu sau punct). Operațiile se repetă în mod analog pentru determinarea timpului de spațiu (între simboluri, între caractere sau între cuvinte),ținându-se cont de starea bitului RA4(”1” logic în lipsa tonului,”0” logic în prezența tonului) și de variabila codeword.

La apariția spațiilor între cuvinte , se realizează și tipărirea registrului codeword ce conține un număr de ordine care apelând tabela de simboluri (rutina ditab sau dahtab), returnează în registrul acumulator (W) simbolul ASCII corespunzător. Acesta este trimis în mod serial pe portul RA4 și afișat pe display-ul LCD prin apelul subrutinei.

3.4 Rutina de întreruperi

Această rutină este executată în fiecare ciclu, o dată la 4[ms]. Aici se citește starea portului de intrare (RB7),se memorează durata tonului și se incrementează timer-ul.

3.5 Interfața PIC-PC

Această rutină realizează conectarea portului RA3 la semnalul RXD al portului serial al unui PC, conform standardului RS232. În această secțiune se realizează codificarea caracterului ASCII decodificat pentru transmiterea lui în mod serial utilizând o rată de 2400[bps] cu 8 biți ,fără bit de paritate și un bit de stop.

Această rutină se află deocamdată în faza de testare, nefiind funcțională în versiunea 1.0 a MDECODER-uli

3.6 Rutina de interfațare cu modulul LCD

Cele șase rutine de la sfârșitul codului sursă realizează interfațarea cu modulul LCD, utilizînd 3 biți pentru semnalele de control (RS.R W, E) și 4 biți pentru date (D4, D5, D7).

Concluzii

Scopul acestui proiect este realizarea unei aplicații cu microcontrolerul PIC16F84 și interfațarea acestuia cu dispozitive periferice (modulul LCD și PC-ul).

Microcontrolerele reprezintă un domeniu de actualitate în electronică, permițând realizarea de aplicații diverse cu costuri minime, utilizând un număr redus de componente externe și caracterizate de consum foarte mic. Un alt avantaj deosebit al acestei familii îl reprezintă posibilitatea programării seriale în circuit, acest lucru făcând posibilă îmbunătățirea performanțelor aplicației sau realizarea altora noi utilizînd același suport hardware prin reprogramarea microcontrolerului (upgrade soft), fără a fi necesară utilizarea unui sistem de dezvoltare /programare auxiliar și totodată costisitor .Utilizarea lui PIC16F84 produs de firma Microchip permite o implementare de înaltă performanță, aceste micocontrolere fiind folosite de numeroase firme în aplicațiile comercializate. În plus, PIC16X84 se află la îndemâna oricui datorită Ușurinței cu care poate fi realizat un program, chiar la nivelul de amator.

În concluzie aplicația MDECODER își găsește utilitatea în domeniul transmisiunilor de mesaje decodificate More, permițând decodarea mesajelor transmise la viteze mari (până la 60WPM), acest lucru nefiind pasibil de realizat de către un operator uman.

De asemenea , posibilitatea recepției semnalelor Morse decodate prin portul serial al unui PC permite memorarea și stocarea unui volum mare de mesaje recepționate. O altă caracteristică este imunitatea la zgomotele adiacente datorată caracteristicii de transfer a filtrului trece bandă(FTB) acordat pe frecvența fundamentală F0. Adaptibilitatea la schimbarea ratei simbolurilor recepționate reprezintă o altă caracteristică definitorie.

Referitor la portabilitatea lui MDECODER,în sensul de upgrade software pe același suport hardware, se pot realiza noi aplicații cum ar fi Decodor pentru Transmisiuni Radio-Packet utilizând protocolul AX.25 (cu extensia DAMA), dat fiind că circuitul folosit în decorul de ton (LM567) poate lucra și ca demodulator FSK (ASK) .

În acest caz , transmisiunile de date radio-pachet modulate AFSK sunt demodulate în blocul decodor (se exclude partea de intrare : microfon și preamplificator de microfon ) și prelucrate de către microprocesor astfel încît pe display și în portul conectat la computer vom putea urmări conținuturile frame-urilor de AX.25 din pachetul radio.

ANEXA 1

Acesta este listing-ul fișierului header pic16f84.h ce conține definițiile regiștrilor.

PIC-ului precum și unii din biții acestora.

;

; pic16f84.h

;

; definiții pentru regiștrii PIC16F84

;

if ~defined(_ 16F84) & ~defined(_ _16C84)

error ”acest fișier header este pentru PIC16F84/PIC16C84”

endif

;

; Bancul 0

;

INDO equ 00h

TMRO equ 01h

RTCC equ TMR0

PCL equ 02h

STATUS equ 03h

FSR equ 04h

PORTA equ 05h

PORTB equ 06h

EEDATA equ 08h

EEADR equ 09h

PCLATH equ 0ah

INTCON equ 0bh

;

; Bancul 1

;

OPTIO equ 0h

TRISA equ 05h

TRISB equ 06h

EECON1 equ 08h

EECON2 equ 09h

;

; biții registrului STATUS

;

IRP equ 07h

RP1 equ 06h

RP0 equ 05h

T0 equ 04h

PD equ 03h

Z equ 02h

DC equ 01h

C equ 00h

;

; biții registrului INTCON

;

GIE equ 7

EEIE equ 6

RTIE equ 5

INTE equ 4

RBIE equ 3

RTIF equ 2

INTF equ 1

RBIF equ 0

;

;biții registrului OPTION

;

RBPU equ 7

INTEDG equ 6

RTS equ 5

RTE equ 4

PSA equ 3

PS2 equ 2

PS1 equ 1

PS0 equ 0

;

; biții registrului EECON1

;

EEIF equ 4

WRERR equ 3

WREN equ 2

EWR equ 1

ERD equ 0

;

; regiștrii de direcție

;

W equ 0

F equ 1

Acesta este listing-ul fișierului sursă mdecoder.asm scris în limbaj de asamblare

pentru aplicația DECODOR MORSE CU PIC. Sursa a fost scrisă și compilată pe o

platformă RedHat Linux 6.1 (Cartman )- kernel v.2.3.99-pre6, asamblorul folosit fiind picasm v.1.06

;

device pic16f84

include ”asm/pic16f84.h”

config CP=off , WDT=off , PWRT=off , OSC=hs

;

; Constante , Variabile , Definitie porturi.

;

RESET_V equ 0x00 ;adresa vectorului pentru RESET

ISR_V equ 0x04 ;adresa vectorului de întreruperi

LED equ 4 ;PORTA bit 4 (RA4)

E equ 4 ;PORTB bit 4 (RB4)

R_W equ 5 ;PORTB bit 5 (RB5)

RS equ 6 ;PORTB bit 6 (RB6)

IN equ 7 ;PORTB bit 7 (RB7)

Busy equ b`00000011`

FuncSet equ b`00101000` ;setează modul de operare (4biți)

DisplayOn equ b`00001111` ;display ON/OFF, cursor , blink

EntryMode equ b`00000110` ;direcția de deplasare a cursorului

ReadCntrl equ b`10100000`

Ddra4Input equ b`00001111`

Ddrb4Input equ b`10001111`

Ddrb4Output equ b`10000000`

Pad1 equ 0x68

Noise equ 0x02 ;orice ton < 16[ms] e considerat zgomot

Ithres equ 0x80

Tabsize equ 0x04

Tmrdelay equ d’256’-d’132’+d’3’ ;104uSec intervalul TMRO

Bitlen equ d’4’ ;(1/baud)/TMRO (interval)

Txbitcnt equ d’40’ ;(TX Bits +2)* bitlen

Txmod equ bitlen-1 ;bitlen-1

;

; alocarea memoriei RAM – definire regiștri virtuali

;

org 0x0c

temp_w ds 1

temp_status ds 1

flags ds 1 ;registrul de flag-uri

DitDah equ 7 ;set (1) pentru ” . ” clear ( 0 ) pentru ” – ”

Overflow equ 6 ;supradepasire… ”slow code ”

PortaImage ds 1

PortbImage ds 1

Timecnt ds 1

Period ds 1

Thres ds 1

Codeword de 1

Ditptr ds 1

Ditsum ds 1

Ditave ds 1

Ditvals ds tabsize

Dahptr ds 1

Dahsum ds 1

Dahave ds 1

Dahvals ds tabsize

DELAY ds 1

DELAY1 ds 1

DELAY2 ds 1

Count ds 1

Lcd_temp1 ds 1

Lcd_temp2 ds 1

Txreg ds 1 ;registrul Tx

Txbuf ds 1 ;buferul Tx

Txcnt ds 1 ;counterul Tx

Txflg ds 1

;

;de aici incepe executia programului

;

org RESET_V

boot goto init

;

;aceasta IRQ este citita la fiecare 4ms

;

org ISR_V

isr movwf temp_w

movf STATUS,0

movwf temp_status

incf timecnt , 1

btfss STATUS , Z

goto isrjmp

bsf flags , overflow

decf timecnt ,1

isrjmp movlw 0x74 ;116

movwf TMRO

bcf INTCON , RTIF

exit1 movf temp_status , 0

movwf STATUS

swapf temp_w ,1

swapf temp_w ,0

retfie

;

;Tabela morse

;

diteb clrf PCLATH

movf codeword , 0

andlw B’00111111’

addwf PCL, 1

retlw ” ”

;

retlw ” e ”

retlw ” a ”

retlw ” I ”

retlw ” w ”

retlw ” r ”

retlw ” u ”

retlw ” s ”

retlw ” j ”

retlw ” p ”

retlw 0x5f

retlw ” l ”

retlw 0x5f

retlw ” f ”

retlw ” v ”

retlw ” h ”

retlw ” 1 ”

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x7c

retlw 0x5f

retlw 0x5f

retlw ” 2 ”

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw ” 3 ”

retlw ” ! ”

retlw ” 4 ”

;

retlw ” 5 ”

retlw 0x5f

retlw ” , ”

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw ” . ”

retlw 0x5f

retlw 0x5f

retlw 0x22

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw ” – ”

retlw ” ? ”

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw ” < ”

retlw 0x5f

retlw 0x5f

;

retlw 0x5f

retlw 0x5f

retlw 0x5f

dahtab clrcf PCLATH

movf codeword , 0

andlw B’00111111’

addwf PCL ,1

retlw ” ”

retlw ” t ”

retlw ” n ”

retlw ” m ”

retlw ” d ”

retlw ” k ”

retlw ” g ”

retlw ” o ”

retlw ” b ”

retlw ” x ”

retlw ” c ”

retlw ” y ”

retlw ” z ”

retlw ” q ”

retlw 0x5f

retlw 0x5f

retlw ” 6 ”

retlw ” = ”

retlw ” / ”

retlw 0x5f

retlw 0x5f

retlw ” > ”

retlw ” ( ”

retlw 0x5f

retlw ” 7 ”

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw ” 8 ”

retlw 0x5f

retlw ” 9 ”

retlw ” 0 ”

retlw 0x5f

retlw ” – ”

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw ” ; ”

retlw 0x5f

retlw 0x5f

retlw ” ) ”

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw ” , ”

;

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw ” : ”

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

retlw 0x5f

;

;Initializarea registrilor …. Inceputul propriuzis al programului

;

init

clrf STATUS

clrf INTCON

clrf PCLATH

clrf PORTA

clrf PORTB

clrf PortbImage

clrf PortaImage

bsf STATUS , RPO

movlw 0x04 ;divizez frecventa XTAL-ului cu 4 apoi cu 32

movwf OPTIO ;penru a obtine tactul necesar

movlw Ddra4Input

movwf TRISA

movlw Ddrb4Input

movwf TRISB

bcg STATUS, RP0

call ChkBusy

call LCD_Init

call Welcome_Note

call Delay

bcf PORTA , LED

movlw 0x13

movwf ditptr

movlw ditptr

movwf FSR

ilp1 incf FSR , 1

clrf IND0

decfsz ditptr , 1

goto ilp1

movlw 0x18

movwf thres

clrf TMR0

clrf flags

clrf INTCON

bsf INTCON , RTIE

bsf INTCON , GIE

;

; core

;

call ChkBusy

call LCD_Init

bsf PORTA , LED

start btfss PORTB , IN

goto start

; receptia primului simbol

bcf PORTA , LED ; led-ul aprins

clrf timecnt ; resetarea timer-ului

db1 movlw noise ;detectia nivelului de zgomot

subwf timecnt , 0 ;timecnt – noise

btfss STATUS , C

goto db1

w84spc1 btfss PORTB , IN

goto w84spc1 ; tonul este inca prezent

;tonul s-a sfirsit, dar fiind primul caracter receptionat

; nu stiu daca e linie sau punct , presupun ca e linie!!

movf timecnt , 0

movwf period

clrf timecnt

bsf PORTA , LED

movlw 0x01

movwf codeword ; avem primul simbol

movf thres , 0

subwf period , 0

btfsc STATUS , C

goto isadah

;

isadit bsf flags , DitDah

call avedit

goto mainlp

isadah bcf flags , DitDah

call

; acum se asteapta ca un ton sa apara pentru a vedea

; ce fel de spatiu a fost pentru a putea stii daca mai

; inainta a fost spatiu sau punct.

Mainlp btfsc PORTB , IN

Goto mainlp ;spatiu can IN setat

Movf timecnt , 0

Movwf period

Clrf timecnt

;contorizam acum perioada tonului curent , deci LED-ul e aprins

bcf PORTA , LED

; deci cat de mare a fost spatiul ? simbol sau caracter ?

mov f thres , 0

subwf period , 0

btfss STATUS , C

goto symbolspc

goto longspc

longspc rlf thres , 0

subwf period , 0

btfss STATUS , C

goto charspc

goto wordspc

;

symbolspc movlw noise

db3 subwf timecnt , 0

btfss STATUS , C

goto db3

db4 btfss PORTB , IN

goto db4 ; asteptam sfirsitul tonului

movf timecnt , 0

movwf period

clrf timecnt

bsf PORTA , LED

movf thres , 0

sunwf period , 0

btfsc STATUS , C

goto itsadah

goto itsadit

itsadit call avedit

btfsc flags , DitDah

bsf STATUS , C

btfss flags , DitDah

bcf STATUS , C

rlf codeword , 1

goto mainlp

itsadah call avedah

btfss flags , DitDah

bsf STATUS , C

btfsc flags , DitDah

bcf STATUS , C

rlf codeword , 1

goto mainlp

;

charspc btfsc flags , DitDah

goto ditstart1

call dahtab

goto printit

ditstart1 call ditab

printit movwf txbuf

call SendText ;tiparirea carecterului la LCD

call rs232

goto db1

wordspc btfsc flags , DitDah

goto ditstart2

call dahtab

doit call SendText

movlw 0x80

call SendText

goto db1

ditstart2 call ditab

goto doit

avedit movf ditptr , 0

addlw ditvals

movwf FSR

movf IND0 , 0

subwf ditsum , 1

movf period , 0

movwf IND0

addwf ditsum , 1

;

rrf ditsum , 0

movwf ditave

rrf ditave , 1

movlw 0x3f

andwf ditave , 1

incf ditptr , 1

movlw 0x03

andwf ditptr , 1

goto makethres

avedah movf dahptr , 0

addlw dahvals

movwf FSR

movf IND0 , 0

subwf dahsum , 1

movf period , 0

movwf IND0

addwf dahsum , 1

rrf dahsum , 0

movwf dahave

rrf dahave , 1

movlw 0x3f

andwf dahave , 1

incf dahptr , 1

movlw 0x03

andwf dahptr , 1

makethres movf ditave , 0

subwf dahave , 0

movwf thres

bcf STATUS , C

;

rrf thres , 1

movf ditave , 0

addwf thres , 1

return

;

; rutina de interfatare cu portul serial al pc-ului (RS232C )

;

rs232

bsf txflg , 0

return

;

; mesajul de la inceput ( Mdecoder v 1.0 )

;

Welcome_note

movlw 0x01

call LCD_SDDa

movlw 0x0d

call SendCmmd

movlw ’ M ’

call Print

movlw ’ D ’

call Print

movlw ’ E ’

call Print

movlw ’ C ’

call Print

movlw ’ O ’

call Print

;

movlw ’ D ’

call Print

movlw ’ E ’

call Print

movlw ’ R ’

call Print

movlw ’ ’

call Print

movlw ’ v ’

call Print

movlw ’ ’

call Print

movlw ’ 1 ’

call Print

movlw ’ . ’

call Print

movlw ’ 0 ’

call Print

movlw 0x0c

call SendCmmd

return

Print call SendText

call Delay2

return

;

; initializarea LCD-ului

;

;

Lcd_Init

clrf count

clrf lcd_temp1

clrf lcd_temp2

call Delay2

call LCD_Clear

movlw FuncSet

movwf PORTB

call SendCmmd

movlw EntryMode

call SendCmmd

return

;

; rutina de afisare a caracterului ASCII

;

SendText

movwf lcd_temp1

incfsz count

movlw 0x08

subwf count , 0

btfsc STATUS , Z

call char8

movlw 0x10

subwf count , 0

btfsc STATUS , Z

call char16

movlw 0x00

;

movwf PORTE

bsf PORTB , RS

movf lcd_templ , 0

goto Sendl

SendCmmd

movwf lcd_tenmp2

movlw 0x00

movwf PORTB

movf lcd_temp2 , 0

Send1

movwf PortbImage

swapf PortbImage , 0

andlw 0x0f

iorwf PORTB , 1

bsf PORTB , E

bcf PORTB , E

movlw 0xf 0
andwf PORTB , 1
movf PortbImage , 0
andlw 0x0f
iorwf PORTB , 1

bsf PORTB , E

bcf PORTB ,E

;

ChkBusy

movlw Ddrb4Input

bsf STATUS , PR0

movwf TRISB

bcf STATUS , RP0

;

SampleAgain

movlw ReadCntrl

movwf PORTB

bsf PORTB , E

movf PORTB , 0

bcf PORTB , E

bsf PORTB , E

bcf PORTB , E

btfsc PortbImage , Busy

goto SampleAgain

movlw Ddrb4Output

bsf STATUS , PR0

movwf TRISB

bcf STATUS , RP0

return

;

; stergerea display-ului

;

LCD_Clear

movlw 0x01

call SendCmmd

return

;

; Pozitionarea cursorului

;

LCD_SDDa

Iorlw 0x80

;

call Sendcmmd

return

;

; rutine pentru adresarea corecta a LCD-ului

;

char8 call LCD_SDDa

movlw b ’11000000’

call SendCmmd

return

char16 clrf count

call LCD_Clear

movlw 0x00

call LCD_SDDa

return

;

; Rutinenele de intarziere utilizate in program

;

Delay1 movlw d ’ 255 ’

movwf DELAY1

Delay1_Loop decfsz DELAY1, 1

goto Delay1_Loop

return

Delay2 movlw d’165 ’

Movwf DELAY2

DELAY2_Loop call Delay1

decfsz DELAY2, 1

goto Delay2_Loop

return

Delay movlw d ’ 25 ’

movwf DELAY

Delay_Loop call Delay2

decfsz DELAY, 1

goto Delay_Loop

return

;

end ; Sfirsitul programului

Acesta este listing-ul fisierului hexa mdecoder.hex, rezultat in urma compilării cu assembler-ul picasm, fișier al cărui conținut se va programa in microcontroler:

:020000009C283A

:100008008C0003088D00910A031D0C280E1791031C

:10001800743081000B110D0883008C0E0C0E090042

:100028008A0114083F398207203465346134693401

:1000380077347234753473346A3470345F346C34A2

:100048005F3466347634683431345F345F345F3417

:100058005F3470345F345F3432345F345F345F3410

:1000680033342134343435345F3427345F345F34E7

:100078005F345F345F345F345F345F342E345F3411

:100088005F3422345F345F345F345F345F343F342D

:100098005F345F345F345F345F345F343C345F34E3

:1000A8005F345F345F345F348A0114083F39820754

:10003800203474346E346D3464346B3467346F3484

:1000080062347834633479347A3471345F345F3429

:1000D80036343D342F345F345F343E3428345F3453

:1000E80037345F345F345F3438345F343934303414

:1000F8005F342D345F345F345F345F345F345F3492

:100 108005F345F343B345F345F3429345F345F34A9

:100 118005F345F345F342C345F345F345F345F3472

:100 128003A345F345F345F345F345F345F345F3454

:100 138008301830 18A0 1850 1860 1900 18F0 183 1655

:100 1480004308 1000F3085008F30860083 1296219D

:100 15800692 1452 1C32 10512 13309500 153084000B

:100 16800840A800 195033428 1830930081018E0110

:100 17800830 183168317962 1692 105 1686 1F0228BD

:100 1880005129 10 10230110203 1CC62886 1FCA28DS

:10019800110892009 10 105160 1309400 1308120203

:1001A000318D9288E171A2 1D3288E13232186133A

:1001B800DB28110892009101051213081202031C92

:1001C800EB28E628130D1202031C08291129023016

:1001D8001102031CEC28861FEF28110892009101DB

:1001E8000S161308120203180129FA281A218E1B72

:1001F80003148E1FO310940DDB282B218E1F03145C

:10020B008E1B0310940DDB288E1B0C295B200D29FA

:100218001420AA0076214321C6288E1B18295820AD

:100228007C2180307621C628142014291508183E16

:10023800840000089602120880009607160C9700A2

:10024800970C3F309705950A033095053B291C0804

:00258001F3E840000089D02120880009D071D0CA7

:100268009E009E0C3F309E059C0A03309C0S170893

:100278001E0293000310930C1708930708002C1410

:1002880008000130AC210D3085214D306621443008

:10029800662148306621433066214F30662144305F

:1002A800662145306621523066212030662176303D

:1002BB006621313066212E306621303066210C30BF

:1002C800852108007621BD210800A601A701A80103

:1002D800BD21A9212830860085210F3085210C30CF

:1002E80085210800A700A60F083026020319AF20B0

:1002F800103026020319B32100308600061727089C

:100308008929A8000030860028089000100E0F39AF

:10031800860406160612F030860510080F39860482

:10032800061606128F30831686008312A0308600C8

:1003380006160608900006120616061290199A2943

:10034800803083168600831208000130852108005A

:10035800803885210800AC21C03085210800A6011D

:10036800A9210030AC210800FF30A400A40BBA2951 :100378000800A530A500B821A50BBF290800193031

:0A038800A300BD21A30BC529080046

:02400E00FA3F77

:00000001FF

Bibliografie

Microchip Tehnology Inc- Tehnical Library & Microchip Web site

Seiko Instruments Inc- Seiko Web site

National Semiconductors Inc- National Web site

Interfațarea PC-ului – http:// www.beyondlogic.net

I . Bănică- Rețele de comunicații- ed. Teora, București, 1998

Gh. Stănciulescu- Cartea Radioamatorului, ed. Sport-Turism, 1981

L. Feștilă- Amplificatoare audio și sisteme muzicale, ed. Dacia, 1990

Emil Marian- Montaje electronice de vacanță, ed. Albatros, 1988

Similar Posts