Die sechs taktilen Sensoren - genannt "Taster" - werden raffiniert über Widerstände über einen Analog-Digital-Konverter (ADC4) ausgewertet. Hierbei muss man unbedingt die Werte 1,2,4,8,16,32 erhalten, wenn der entsprechende Taster gedrückt wird.

Folgendes ist hierbei zu beachten, damit das richtig funktioniert:

1) Kalibration in myasuro.h vornehmen:

Code:
/* Tastaturabfrage */
/*! Faktor zur Berechnung der gedrueckten Tasten.\n
      Der Originalwert ist \b 61L und koennten im Bereich zwischen ca. 58L und
      65L schwanken. Dieser Wert gleicht Toleranzen der Widerstaende an den
      Tastern aus.
*/
#define MY_SWITCH_VALUE           61L   /*!< Multiplikator fuer Tasterwerte */
Beginnen Sie mit 61 und testen Sie entsprechend dem unter 3) angehängten Programm.

2) Der Wert aus myasuro.h wird in Pollswitch(...) in der Datei switches.c verwendet:

Code:
unsigned char PollSwitch (void)
{
  unsigned int i;
  int ec_bak = autoencode;              // Sichert aktuellen Zustand

  /*
     Autoencode-Betrieb vom ADC-Wandler unterbinden.
  */
  autoencode = FALSE;

  DDRD |= SWITCHES;                     // Port-Bit SWITCHES als Output
  SWITCH_ON;                            // Port-Bit auf HIGH zur Messung
  ADMUX = (1 << REFS0) | SWITCH;        // AVCC reference with external capacitor
  Sleep (10);

  ADCSRA |= (1 << ADSC);                // Starte AD-Wandlung
  while (!(ADCSRA & (1 << ADIF)))       // Ende der AD-Wandlung abwarten
    ;
  ADCSRA |= (1 << ADIF);                // AD-Interupt-Flag zuruecksetzen

  i = ADCL + (ADCH << 8);               // Ergebnis als 16-Bit-Wert

  SWITCH_OFF;                           // Port-Bit auf LOW
  Sleep (5);

  /*
     Autoencode-Betrieb vom ADC-Wandler wiederherstellen.
  */
  autoencode = ec_bak;

  /*
    Die Original Umrechenfunktion von Jan Grewe - DLR wurder ersetzt durch
    eine Rechnung ohne FLOAT-Berechnungen.
  return  ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5));

    Wert 61L evtl. anpasssen, falls fuer K1 falsche Werte zurueckgegebn werden.
  */
  return ((10240000L / (long)i - 10000L) * MY_SWITCH_VALUE + 5000L) / 10000;
}
3) Mit folgendem Programm kann getestet werden:
Code:
#include "asuro.h"

int main(void)
{
  int radix = 10;
  int poll  =  0;
  char wert[3];

  Init();

  while(1)
  {

    poll = PollSwitch();
    int i;
    for(i=0;i<3;++i)
        wert[i]=' ';
    itoa (poll, wert, radix);
    SerWrite (wert, 3);
    SerWrite ("\n\r", 2);
  }
}
4) Einzeltaster 1,2,4,8,16,32 - alles o.k.?

5) Jetzt mehrere Taster drücken. Summe muss stimmen. Nein? Go to 1)