ArSid - Arduino Sid Synthesizer

Thu 28-Mar-24
21:55:39


Lib: Basis Funkties.

Datum: Sat 23 February 2019
Samenvatting: Enkele Basis Funkties.
Soort Artikel: Software
Status: Bezig


[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]
[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]

Deze Library bevat enkele Basis Funkties voor het afhandelen van enkele hele algemene software zaken. Hierbij is te denken aan getal-controles of eenvoudige getal-omzettingen.

Het nut van zo'n library bewijst zich wanneer iemand voor de zoveelste keer een getal op eindwaardes moet controleren en zich dan realiseert dat het herhaaldelijk intikken van zo een (of twee) IF-statements niet alleen stom vervelend wordt, maar dat het ook de code een stuk onleesbaarder maakt - zo bleek bij mij althans in mijn vele Pascal-projecten.

Wat men bij het opzetten van zo'n library goed moet blijven realiseren is het volgende: De library moet zo in te passen zijn in andere projekten, er mogen dus geen funkties in komen die afhankelijk zijn van een specifiek stukje hardware.

Array's: Getal omzettingen.

Er worden enkele array's gebruikt om eenvoudige getal-omzettingen te realiseren.

  • const char hexchar[16]: Dit array bevat (zoals de naam al zegt) alleen de ASCII-tekens '0' tot en met '9' en 'A' tot en met 'F'. Zonder ingewikkelde berekeningen is zo snel een 4-bits nummer om te zetten in een hexadecimale teken (inclusief de ASCII-conversie), wat weer eenvoudig verder gebruikt kan worden om op schermen, of displays te tonen.

  • const byte bitje[8]: Dit array bevat de decimale waardes van afzonderlijke bitjes 0 tot en met 7.Hiermee zijn bijvoorbeeld eenvoudig aparte bitjes uit een getal te bepalen met een eenvoudige AND-bewerking, zonder dat er tijdrovende schuif bewerkingen nodig zijn. Eventueel is zo'n array nog verder uit te breiden tot 16-bits of 32-bits.

Funkties: Getal controles.

Op zich zijn dit geen spectaculaire funkties, maar ze vereenvoudigen wel wat programmeer-werk.

  • char byte2hexchar(byte bb): Deze funktie bepaalt een Hexadecimaal teken uit de laagste 4 bits van een byte BB. Na een AND-berwerking (met $0F) op de laagste 4 bits van het getal, wordt het teken uit de array hexchar[] gehaald.

  • byte minmax (byte vv, byte minimum, byte maximum): Deze funktie controleert (in bytes, dus vanaf 0 t/m 255) of een getal VV binnen een minimum en een maximum ligt. Is het getal kleiner dan het minimum, dan wordt het getal gelijk aan het minimum. Is het getal groter dan het maximum, dan wordt het getal gelijk aan het maximum.

    Deze funktie heeft zijn nut in heel veel programma's bewezen. Want, wat doe je wanneer een getal buiten het bereik komt te liggen van een vereistte? Breek je het programma af? Of laat je het programma ermee doorgaan om foute resultaten te bepalen (of om het programma te laten vastlopen (?))? Mijn eigen ervaring is dat het (bijna) altijd het beste is om zo'n getal bij te stellen naar het minimum (c.q het maximum) en het getal ook deze (minimum, c.q. maximum) waarde te laten behouden en er dan veilig mee verder te werken. Vooral in programma's die maar door moeten blijven gaan, is gebleken dat dit altijd de beste methode is.

    Twee losse IF-statement controleren het getal op het minimum en op het maximum. Bij het overschijden van deze grens, wordt het getal ook daadwerkelijk gezet op deze minimum, c.q. maximum, waarde gezet.

  • int minmax_i (int vv, int minimum, int maximum): Deze funktie controleert (in integers, dus vanaf -32768 t/m +32767) of een getal VV binnen een minimum en een maximum ligt. Is het getal kleiner dan het minimum, dan wordt het getal gelijk aan het minimum. Is het getal groter dan het maximum, dan wordt het getal gelijk aan het maximum.

    Zie verder de byte-versie van deze funktie.

  • byte cycle (byte vv, byte minimum, byte maximum): Deze funktie controleert (in bytes, dus vanaf 0 t/m 255) of een getal VV binnen een minimum en een maximum ligt. MAAR Is het getal nu kleiner dan het minimum, dan wordt het getal gelijk aan het maximum. Is het getal groter dan het maximum, dan wordt het getal nu gelijk aan het minimum.

    Op deze manier zijn heel eenvoudig rondgaande tellers te cre-eren. Bereikt de teller zijn eind-waarde, dan gaat deze in de volgende stand door vanaf de begin waarde.

Was dit het dan?

Voorlopig wel, zo'n algemene library moet groeien met de loop der projekten.


[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]
Broncode: [1: Lib: Basis Funkties (.cpp)] [2: Lib: Basis Funkties (.h)]

1: De broncode van Lib: Basis Funkties (.cpp)

(Sat 23 February 2019) ArSid_Basic.cpp: Enkele Basis Funkties.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
//=======================================================================================
//
// Basic_Funk - The Basic Functions Library
//
// Some Basic Functions, Which Don't Belong In Other Libraries.
//
//=======================================================================================

#ifndef BASIC_FUNK_CPP
#define BASIC_FUNK_CPP

#include "Arduino.h"
#include "Basic_Funk.h"

//=====================================================================================

char byte2hexchar(byte bb)
{ // Calc the lowest Nibble To a Hex-Char
  return  hexchar[bb & 0x0F];
}

byte minmax (byte vv, byte minimum, byte maximum)
{ // Check if VV is in the boudaries of MINIMUM and MAXIMUM.
  // If not, then make VV either MINIMUM or MAXIMUM.
  if ( vv < minimum )     { return minimum; }
  if ( vv > maximum )     { return maximum; }
  return vv;
}

int minmax_i (int vv, int minimum, int maximum)
{ // Check if integer VV is in the boudaries of MINIMUM and MAXIMUM.
  // If not, then make VV either MINIMUM or MAXIMUM.
  if ( vv < minimum )     { return minimum; }
  if ( vv > maximum )     { return maximum; }
  return vv;
}

byte cycle (byte vv, byte minimum, byte maximum)
{ // Cycle VV thru the boudaries of MINIMUM and MAXIMUM.
  // If not, then make VV either MAXIMUM or MINIMUM.
  if ( vv < minimum )     { return maximum; }
  if ( vv > maximum )     { return minimum; }
  return vv;
}

//=====================================================================================

#endif // BASIC_FUNK_CPP

Broncode: [1: Lib: Basis Funkties (.cpp)] [2: Lib: Basis Funkties (.h)]

2: De broncode van Lib: Basis Funkties (.h)

(Sat 23 February 2019) ArSid_Basic.h: Enkele Basis Funkties.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
//=======================================================================================
//
// Basic_Funk - The Basic Functions Library
//
// Some Basic Functions, Which Don't Belong In Other Libraries.
//
//=======================================================================================

#ifndef BASIC_FUNK_H
#define BASIC_FUNK_H

#include "Arduino.h"

//=====================================================================================

const char hexchar[16] = {'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};
const byte bitje[8] = {1,2,4,8,16,32,64,128};

char byte2hexchar(byte bb);
  // Calc the lowest Nibble To a Hex-Char

byte minmax (byte vv, byte minimum, byte maximum);
  // Check if VV is in the boudaries of MINIMUM and MAXIMUM.

int minmax_i (int vv, int minimum, int maximum);
  // Check if integer VV is in the boudaries of MINIMUM and MAXIMUM.

byte cycle (byte vv, byte minimum, byte maximum);
  // Cycle VV thru the boudaries of MINIMUM and MAXIMUM.

//=====================================================================================

#endif // BASIC_FUNK_H


Broncode: [1: Lib: Basis Funkties (.cpp)] [2: Lib: Basis Funkties (.h)]
[Tekst] [Afbeeldingen] [Aansluitingen] [Broncodes]