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:
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:
Componentele adaugate la placuta sunt:
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:
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:
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:
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.
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.
Proiectul a fost terminat, ramanand de testat pe placuta la laborator.
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.
Ca bibliografie am folosit doar resursele puse la dispozitie pe site-ul de curs si pe wiki.