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