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
Copyright Notice
© Licențiada.org respectă drepturile de proprietate intelectuală și așteaptă ca toți utilizatorii să facă același lucru. Dacă consideri că un conținut de pe site încalcă drepturile tale de autor, te rugăm să trimiți o notificare DMCA.
Acest articol: Decodor Morse cu Pic (ID: 161467)
Dacă considerați că acest conținut vă încalcă drepturile de autor, vă rugăm să depuneți o cerere pe pagina noastră Copyright Takedown.
