Codul Morse sau alfabetul Morse este o metodă de transmitere a informației folosind secvențe standardizate de semne sau pulsații scurte și lungi - cunoscute în mod comun ca „puncte” și „linii” - pentru litere, cifre și caracterele speciale specifice oricărui mesaj.
Dispozitivul creat afiseaza in modul DEMO alfabetul Morse, pe un dispozitiv dotat cu un ecran LCD text, un LED si un buzzer:
Scopul proiectului este de a simula alfabetul Morse si de a fi un instrument de invatare a acestuia.
Regulile Codului Morse
Lista componente:
Schema de functionare este foarte simpla, intrucat toate perifericile sunt conectate direct la pinii ATMega16. Iata schema electrica (desenata manual):
LCD-ul se conecteaza prin 4 pini de date si 3 pini (RS, RW, E) conform datasheet-ului DEM16101 SYH. DataSheet Pinii de date se conecteaza direct la ATMega16 la pinii 36-40.
Buzzerul se conecteaza cu ajutorul unei Rezistente de 1Kohm si un tranzistor in serie. Acesta este conectat la pinul 20 al microcontroller-ului.
Ledul se conecteaza in serie cu o rezistenta si se conecteaza direct la pinul 33 al microcontrolerului.
Dispozitivul:
Varianta initiala de la care am plecat (si de la care am luat componentele - un proiect PM foarte vechi) Placuta de PM 2012
Codul pentru dispozitiv a fost scris in C, si cu compilat cu AVR-GCC. Fisierul .hex generat in urma compilarii a fost scris pe placuta cu ajutorul Bootloader-ului pus la dispozitie de echipa de PM.
Structura codului Am definit mai multe functii (dot, dash, space) care au corespondent direct in codul morse si care interactioneaza cu functiile perifericelor (buzzer, led, lcd). Fiecare litera are definita o secventa dot(), space(), dash().
Buzzer-ul si LED-ul se pot controla foarte facil. Pentru LCD am utilizat o librarie eXtreme Electronics xAPI, care se poate configura pe mai multe tipuri de LCD si care are functiile de scriere pe LCD built-in.
Am pus la dispozitie si arhiva codului utilizat (lcd.c, lab1.c).
Exemplu de functie care genereaza echivalentul unui punct si dash pe LED:
void dot()
{
PORTA |= 1«PA7; LED on
_delay_ms(DOT);
PORTA &= !(1«PA7); LED off
}
void dash()
{
PORTA |= 1«PA7; LED on
_delay_ms(3*DOT);
PORTA &= !(1«PA7); LED off
}
DOT este o varibila prin care am definit durata unui punct la 500ms. Conform conventiei Morse, un dash are 3 x DOT = 1500ms
Exemplu de rulare a LCD
LCDClear();
LCDWriteString(“SOS”);
Functia care afiseaza codul Morse
Aceasta scrie pe LCD mesajul. Ia litera cu litera si simuleaza pe LED si pe Buzzer rezultatul.
void view_MORSE(char* msg, char* msg2)
{
int i;
LCDClear();
LCDWriteString(msg2);
for (i=0;i<strlen(msg);i++) {
if (msg[i]=='s') S();
else if (msg[i]=='o') O();
}
}
Dispozitivul Hardware functioneaza foarte bine. In timpul dezvoltarii codului am reusit sa utilizez buzzer-ul cat si LED-ul pentru a simula codul Morse.
Din pacate am reusit sa suprascriu bootloader-ul in timp ce ma jucam cu diverse configuratii ale LCD-ului. Codul software nu este complet.
De asemenea as fi dorit sa implementez si o varianta interactiva de invatare:
Proiectul este unul interesant. Partea hardware poate fi un pic greoaie, dar in timp te familiarizezi cu lipiturile si cu circuitele.
Atentie la dimensiunea codului scris pentru a incapea in memoria ATMega16.
LCD Datasheet http://www.soselectronic.hu/a_info/resource/d/dem/dem16101syh.pdf
LCD library http://extremeelectronics.co.in/avr-tutorials/using-lcd-module-with-avrs/
Codul Morse http://en.wikipedia.org/wiki/Morse_code
Surse de invatare (laboratoarele PM) http://cs.curs.pub.ro/wiki/pm/
Sursa software davidalexandruemil_codmorse2.zip