MICPRG opdracht 4b.

© Harry Broeders.

Deze pagina is bestemd voor studenten van de Haagse Hogeschool - Academie voor Technology, Innovation & Society Delft groep EQ1.2.

Morse-generator.

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 ATmega32. Dit kan worden bereikt door gebruik te maken van het Output Compare A systeem van de Timer/Counter1 in de CTC mode.

Uitleg en tips.

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.

Aanpak.

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.