Tasten Kalibrierung C

Programmcode

Das Kalibrier Programm für die Tastsensoren benötigt eine eigene PollSwitch Funktion, da wir zur Errechnung der MY_SWITCH_VALUE Konstante die reinen A/D Wandler Werte brauchen. Deshalb wird hier die MyPollSwitch Funktion verwendet.

Die SwitchTest Funktion wird in der Hauptscheife der Main Funktion endlos ausgeführt und prüft nacheinander alle Taster durch, die der Anwender nach Aufforderung des Programmes drücken muß. Der Test beginnt mit dem Taster K6 (von vorne auf den ASURO gesehen, links außen beim Ein Schalter) und endet bei K1 (rechts außen am IR Receiver). Der gemessene Wert wird in die Formel aus der Original PollSwitch Funktion zur Berechnung eingesetzt und mit dem Wertebereich 65..74 überprüft ob der geforderte Wert dabei herauskommt. Stimmt der Wert, wird dieser zum Terminalprogramm gesendet. Stimmt der Wert nicht, so werden statt dessen Leerzeichen gesendet. So sollte bei einem korrekt aufgebauten Asuro nach Drücken von K1 der Wert (eventuell auch 2 Werte) für die MY_SWITCH_VALUE Konstante gefunden sein.

#include <stdlib.h>
#include "asuro.h"


uint16_t MyPollSwitch(void)
{
  uint16_t i;

  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);

  return ADC;
}


void SwitchTest(void)
{
  uint8_t i, j, mval;
  uint16_t adval;

  for(i=0; i<6; i++)
  {
    SerPrint("\r\nPress Key ");
    PrintInt(6-i);
    SerPrint("\r\n");
    while (MyPollSwitch() == 1023)
    adval = MyPollSwitch();
    adval = MyPollSwitch();
    adval = MyPollSwitch();
    adval = MyPollSwitch();
    // testet den Wertebereich von 55..74 mit dem gemessenen A/D Wert
    for(j=50; j<75;j++)
    {
      mval = ((10240000L / (long)adval - 10000L) * (long)(j) + 5000L) / 10000;
      if (mval == (1<<i))   // Wert passt
        PrintInt(j);
      else                  // Wert passt nicht
        SerPrint("  ");
      SerPrint(" ");
    }
    Msleep(2000);
  }   
}


int main(void)
{

  Init();
  SerPrint("\r\nTastsensor Kalibration\r\n");
  while (1)
  {
    SwitchTest();
  }
}

TasterKalibration.zip

Auswertung

So sieht dann die Ausgabe des Programmes im Terminalprogramm aus:

 Tastsensor Kalibration

 Press Key 6
 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 
 Press Key 5
 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 
 Press Key 4
                      57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72       
 Press Key 3
                               60 61 62 63 64 65 66 67                      
 Press Key 2
                                  61 62 63 64                               
 Press Key 1
                                     62 63                                  
 Press Key 6

Wie man leicht sieht ist, hat die Taste K1 den engsten Spielraum. Der ermittelte Wert für die MY_SWITCH_VALUE Konstante für diesen Asuro liegt hier bei 62 oder 63. Da mein anderer Asuro hier 61 und 62 als mögliche Werte errechnet, entschließe ich mich spontan für den Wert 62. Sollte eine Taste aus dem Schema abweichen, bzw. der gefundene Wert nicht bei allen Tastern gefunden werden, liegt wahrscheinlich ein Fehler bei den Widerstandswerten vor. Eventuell wiederholt man erst den Test. Vielleicht hat man ja nur die Taste nicht fest genug gedrückt. Bleibt das Kalibrierprogramm bei einer Taste hängen, liegt eine Unterbrechung im Signalweg vor. Läuft das Testprogramm durch, ohne das eine Taste gedrückt wurde, liegt ein Kurzschluß vor.