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:
Beginnen Sie mit 61 und testen Sie entsprechend dem unter 3) angehängten Programm.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 */
2) Der Wert aus myasuro.h wird in Pollswitch(...) in der Datei switches.c verwendet:
3) Mit folgendem Programm kann getestet werden: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; }
4) Einzeltaster 1,2,4,8,16,32 - alles o.k.?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); } }
5) Jetzt mehrere Taster drücken. Summe muss stimmen. Nein? Go to 1)![]()







Zitieren
Lesezeichen