© Harry Broeders.
Deze pagina is bestemd voor studenten van de Haagse Hogeschool - TH Rijswijk/Academie voor Engineering groep EP2.1.
Ontwerp en realiseer een machine die in staat is een string ASCII-karakters
om te zetten naar de bijbehorende
MORSE-code die via een amateur radiozender kan worden verstuurd.
Het MORSE-signaal (1000 Hz) moet hoorbaar worden gemaakt via de luidspreker
die is aangesloten op pin PD5 = OC1A van de ATmega16. Dit kan worden bereikt
door gebruik te maken van het Output Compare A systeem van de Timer/Counter1
in de CTC mode.
MORSE code
bestaat uit een signaal met een vaste frequentie (1000 Hz) dat aan en uit
wordt geschakeld. MORSE code bestaat, zoals je vast wel weet, uit punten
en strepen. De tijdsduur van een punt bedraagt ca.100 ms bij een snelheid
van 12 woorden per minuut (een woord bevat gemiddeld 5 karakters). Neem een
punt als standaardtijdsduur en leidt daarvan andere tijden af:
Om de werking goed te kunnen testen kun je het beste alle op te wekken pulsen afleiden van een standaard "tijdgenerator". Als de ingestelde tijd hiervan wordt vergroot, kan alles in "slow motion" worden afgewikkeld. Je kunt Timer/Counter0 prima als "tijdgenerator" gebruiken.
Je mag ervan uitgaan dat de ASCII string alleen letters en cijfers bevat.
Je kunt een morsecode coderen in 8 bits. De laagste 3 bits bit2, bit1 en
bit0 geven het totaal aantal strepen en punten aan. De morsecode is opgeslagen
vanaf bit7 naar rechts. Een punt wordt aangegeven met een 0 en een streep
met een 1. De waarde van bits die niet gebruikt worden maakt natuurlijk niet
uit (don't care = d). De code voor A
is dus 01ddd010
= 0x42 (als voor de d's een 0 wordt ingevuld). De code van B
is 1000d100
= 0x84.
Hieronder zijn twee arrays gegeven waar de morse codes (in de bovenstaande codering) voor alle letters en alle cijfers zijn opgeslagen.
uint8_t morseLetters[] = {
/* Morse codes van A t/m Z */0x42,0x84,
0xA4,0x83,0x01,0x24,0xC3,0x04,0x02,0x74,0xA3,0x44,0xC2, 0x82,0xE3,0x64,0xD4,0x43,0x03,0x81,0x23,0x14,0x63,0x94,0xB4,0xC4};
uint8_t morseCijfers[] = {
/* Morse codes van 0 t/m 9 */0xFD,0x7D
,0x3D,0x1D,0x0D,0x05,0x85,0xC5,0xE5,0xF5};
Met behulp van deze twee tabellen kun je ASCII karakters omzetten naar MORSE code.
De volgende functies uit ctype.h kunnen daarbij van pas komen:
int isalnum(int c); /* geeft 0 terug als meegegeven ASCII code geen letter of een cijfer is */
int isalpha(int c); /* geeft 0 terug als meegegeven ASCII code geen letter is */
int isdigit(int c); /* geeft 0 terug als meegegeven ASCII code geen cijfer is */
int toupper(int c); /* geeft ASCII code terug van de hoofdletter van de meegegeven ASCII code (moet een letter zijn) */
Je kunt een ASCII code voor een cijfer als volgt omzetten naar de MORSE code van dit cijfer:
uint8_t ascii='3'; /* testwaarde */ uint8_t morse=0; if (isdigit(ascii)) { /* better save than sorry */ morse=morseCijfers[ascii-'0']; }
/* morse is nu 0x1D */
Bedenk zelf hoe je letters kunt omzetten. In de string die omgezet moet worden
kunnen zowel hoofd- als kleineletters voorkomen. De MORSE code voor
'A'
en 'a'
is hetzelfde (0x42).
Een C string wordt altijd afgesloten met een NUL karakter '\0'
;
Tijdens de ruimte rust kun je PD5 het beste hoog maken omdat anders (als je PD5 tijdens een rust laag maakt) aan het einde van de rust een vervelende tik uit de luidspreker komt.
Maak een stappenplan en maak voordat je een (deel)programma gaat coderen eerst een ontwerp op papier. De practicumdocent zal naar dit stappenplan en ontwerp vragen bij het aftekenen van je opdracht.
Dit programma is helaas niet te simuleren.
Dit programma kan prima op het EPRO1 AVR bord getest worden. Je moet wel rekening houden met het verschil in klokfrequentie. De timing van de "tijdgenerator" van 100 ms zal aangepast moeten worden.