Introducere

Proiectul isi propune realizarea unui decodificator de cod morse. Decodificatorul preiea date (litere si cifre) codificate in cod Morse si le afiseaza in cod ASCII pe un ecran LCD.

Codul Morse foloseste o reprezentare prin puncte si linii a caracterelor. Alfabetul morse este prezentat in imaginea urmatoare:

Descriere generală

Schema bloc a proiectului: schema-bloc-pm.jpg

Caracterele in cod Morse sunt reprezentate ca insiruiri de linii si puncte. Astfel, vrem ca programul nostru sa primeasca la intrare un sir de linii si puncte, sa decodifice sirul si sa afiseze pe ecran caracterele rezultate.

Am decis sa folosesc 2 butoane: PUNCT si LINIE. Apasarea butonului PUNCT semnifica introducerea unui punct in codificarea caracterului curent iar apasarea butonului LINIE - introducerea unei linii.

Butonul ENTER a fost introdus din necesitatea de separare a caracterelor intre ele. Atunci cand utilizatorul termina de introdus un caracter, acesta va apasa ENTER pentru a semnala acest lucru si a declansa decodificarea caracterului respectiv.

Practic, decodificatorul functioneaza in felul urmator:

  • Utilizatorul introduce o secventa de linii si puncte care reprezinta codificarea unui singur caracter, apasand pe butoanele LINIE si PUNCT.
  • Pe masura ce sunt introduse, punctele si liniile sunt afisate pe ecranul LCD-ului astfel incat utilizatorul sa stie ce configuratie a introdus.
  • Cand a terminat de introdus un caracter codificat, utilizatorul apasa tasta ENTER.
  • In cazul in care secventa introdusa este valida (exista un caracter cu codul Morse introdus), acesta este afisat pe ecran. Caracterele valide introduse sunt concatenate, facand astfel usoara decodificarea unui mesaj mai lung (utilizatorul nu este nevoit sa-si noteze la fiecare pas caracterul decodificat).
  • In cazul in care secventa introdusa nu este valida (NU exista un caracter cu codul Morse introdus) pe LCD se afiseaza mesajul “Code not found.”

Hardware Design

Componentele adaugate la placuta sunt:

  • LCD 16×2 - conectat ca la laborator
  • 3 butoane:
    • un buton pentru PUNCT conectat la PC0
    • un buton pentru LINIE conectat la PC1
    • un buton de ENTER conectat la PC2

Schemele electrice ale placutei imprimate standard:

La acestea se adauga LCD-ul 16×2 si cele 3 butoane:

Pentru simularea proiectului am folosit urmatoarea schema realizata cu ISIS din pachetul Proteus 6 Professional:

poza-sim.jpg

Software Design

Aplicatia a fost realizata in AVR Studio.

Pentru realizarea functionalitatilor proiectului am plecat de la functiile de lucru cu LCD-ul din laboratorul 1.

Structuri de date folosite:

Programul tine minte codificarea in cod Morse a tuturor caracterelor in vectorul de stringuri v:

  • v[0] - v[25] : codificarea literelor 'A'-'Z'
  • v[26] - v[35] : codificarea cifrelor 0-9

Codul morse introdus de la butoane pentru fiecare caracter este retinut in bufferul letter.

Textul decofificat este retinut in bufferul save_text.

Textul care este afisat pe ecran este retinut in bufferul print_me.

Functii implementate:

  • init_v: initializeaza bufferele de caractere si completeaza vectorul v cu codificarile caracterelor in alfabetul Morse. Este apelata la inceputul executiei.
  • morse_decoder:
    • Seteaza cele 3 butoane ca input (pe pinii PC0, PC1, PC2).
    • Intr-o bucla infinita, preia inputul de la cele 3 butoane:
      • Daca a fost apasat unul din butoanele PUNCT sau LINIE este concatenat un punct('.') sau o linie('-') la bufferul letter care apoi este afisat pe ecran.
      • Daca a fost apasat butonul ENTER se parcurge vectorul v in cautarea unei codificari identice cu cea memorata in letter.
        • Daca este gasit un match este adaugat caracterul respectiv la bufferul save_text, textul fiind afisat apoi pe ecran. Caracterul adaugat va fi:
          • 65 + index pentru litere (index < 26) Obs. 65 este codul ASCII al lui 'A'
          • 48 + (index - 26) pentru cifre (index >= 26) Obs. 48 este codul ASCII al lui '0'
        • Daca nu este gasit un match pentru codificarea respevtiva este afisat pe ecran textul “Code not found.” Obs. Introducerea unui caracter nevalid nu provoaca stergerea bufferului save_text. rationamentul din spatele acestei decizii este ca utilizatorul nu va dori sa piarda intreg mesajul decodificat din cauza strecurarii unei greseli sau din neatentie.

Probleme intampinate:

Dupa introducerea unui caracter nevalid si afisarii mesajului “Code not found.” pe ecran, la introducerea urmatorului caracter valid nu se mai afisa nimic, chiar daca se scria in continuare in bufferul save_text. (Am verificat asta printand la fiecare pas pozitia la care s-a ajuns in buffer. Chiar daca nu se mai afisa nimic, pe masura ce se introduceau caractere, pozitia crestea.)

Am ajuns la concluzia ca trimiterea ca parametru functiei LCD_print direct a bufferului save_text ii modifica acestuia uneori continutul. Am rezolvat problema introducand un al doilea buffer - print_me - in care se copiaza la fiecare afisare continutul lui save_text si care este apoi transmis ca paramentru functiei LCD_print.

Rezultate Obţinute

Partea hardware a proiectului a fost realizata, fiind montate LCD-ul si cele 3 butoane ca in schemele de mai sus.

Partea software a fost terminata si testata in simularea ISIS.

Concluzii

Proiectul a fost terminat, ramanand de testat pe placuta la laborator.

Download

Arhiva proiectului poate fi descarcata aici: proiect_pm.zip.

Arhiva contine atat codul sursa cat si simularea, schemele electrice suplimentare realizate in EAGLE CAD (atat in formatul initial cat si exportate ca imagine) si schema bloc in format jpeg.

Bibliografie/Resurse

Ca bibliografie am folosit doar resursele puse la dispozitie pe site-ul de curs si pe wiki.

pm/prj2010/dtudose/morsedecoder.txt · Last modified: 2021/04/14 17:07 (external edit)
CC Attribution-Share Alike 3.0 Unported
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0