stats

Non blocking Morse

Al eerder had ik een morse generator gebouwd, maar daarin werd de timing met delay() gedaan. Bij gebruik voor een Vosje (zie vossenjacht) had ik een non blocking versie nodig, dus timing via millis(). De nieuwe morse generator is opgebouwd als een 'state machine' en daarmee heel compact geschreven.

De dit's en dah's staan per teken binair als 0 en 1 in een morse 'byte' en worden daar bit voor bit 'uitgeschoven'. Een extra 1 geeft het einde van het morse teken aan en de timing voor de pause tussen de morse tekens.

De pauses tussen de tekens zijn iets (100mS = 1 unit) langer dan standaard, maar komt zo de 'leesbaarheid' ten goede voor ongeoefende jagers...

Een Vosje heeft natuurlijk een (herkennigs) geluidje nodig en daar dient character '*' voor; het vosnummer in piepjes (dit's).

struct morsetab {
  char Chr;
  byte Pat;
} mtab[] = {
  {'*', 0x80},  // .......
  {'A', 0x06},  // .-
  . . . .
  {'Z', 0x13},  // --..
}

char Text[25] = "***** demo *****";

mtab[0].Pat = 1 << vosNr;  // 1 t/m 7

  // 0=char, 1=spatie, 2=upper, 3=find, 4=morse, 
  // 5=dit/dah, 6=toon, 7=tijd, 8=pause, 9=loop
  // dit=1+1, dah=3+1, pause=+3=4, space=+4=8

  switch (s) {
    case  0 : c = Text[p++]; if(!c) { p = 0; break; }
    case  1 : if (c == 32) { w = 4; s = 7; break; }
    case  2 : n = sizeof(mtab); c = toupper(c);
    case  3 : while (n--) if (c == mtab[n].Chr) break;
    case  4 : t = mtab[n].Pat; if (!t) { s = 0;  break; }
    case  5 : w = (t & 1) ? 3 : 1; t >>= 1;
    case  6 : if (t) tone(cwePin, freq, w++ * Dot);
    case  7 : wtyd = millis() + w * Dot; s = 8;
    case  8 : if (millis() < wtyd) break;
    case  9 : s = (t) ? 5 : 0;
  } 

Heb je vragen of opmerkingen? Stuur me een berichtje en je krijgt alle gewenste informatie!

HOME