00001 /****************************************************************************/ 00023 /***************************************************************************** 00024 * * 00025 * This program is free software; you can redistribute it and/or modify * 00026 * it under the terms of the GNU General Public License as published by * 00027 * the Free Software Foundation; either version 2 of the License, or * 00028 * any later version. * 00029 * * 00030 *****************************************************************************/ 00031 #include "asuro.h" 00032 00033 00034 00035 /****************************************************************************/ 00077 unsigned char PollSwitch (void) 00078 { 00079 unsigned int i; 00080 int ec_bak = autoencode; // Sichert aktuellen Zustand 00081 00082 /* 00083 Autoencode-Betrieb vom ADC-Wandler unterbinden. 00084 */ 00085 autoencode = FALSE; 00086 00087 DDRD |= SWITCHES; // Port-Bit SWITCHES als Output 00088 SWITCH_ON; // Port-Bit auf HIGH zur Messung 00089 ADMUX = (1 << REFS0) | SWITCH; // AVCC reference with external capacitor 00090 Sleep (10); 00091 00092 ADCSRA |= (1 << ADSC); // Starte AD-Wandlung 00093 while (!(ADCSRA & (1 << ADIF))) // Ende der AD-Wandlung abwarten 00094 ; 00095 ADCSRA |= (1 << ADIF); // AD-Interupt-Flag zuruecksetzen 00096 00097 i = ADCL + (ADCH << 8); // Ergebnis als 16-Bit-Wert 00098 00099 SWITCH_OFF; // Port-Bit auf LOW 00100 Sleep (5); 00101 00102 /* 00103 Autoencode-Betrieb vom ADC-Wandler wiederherstellen. 00104 */ 00105 autoencode = ec_bak; 00106 00107 /* 00108 Die Original Umrechenfunktion von Jan Grewe - DLR wurder ersetzt durch 00109 eine Rechnung ohne FLOAT-Berechnungen. 00110 return ((unsigned char) ((( 1024.0/(float)i - 1.0)) * 61.0 + 0.5)); 00111 00112 Wert 61L evtl. anpasssen, falls fuer K1 falsche Werte zurueckgegebn werden. 00113 */ 00114 return ((10240000L / (long)i - 10000L) * 61L + 5000L) / 10000; 00115 } 00116 00117 00118 00119 /****************************************************************************/ 00150 void StartSwitch (void) 00151 { 00152 SWITCH_OFF; // Port-Bit auf LOW 00153 DDRD &= ~SWITCHES; // Port-Bit SWITCHES als INPUT 00154 MCUCR &= ~((1 << ISC11) | (1 << ISC10)); // Low level erzeugt Interrupt 00155 GICR |= (1 << INT1); // Externen Interrupt 1 zulassen 00156 } 00157 00158 00159 00160 00161 /****************************************************************************/ 00179 void StopSwitch (void) 00180 { 00181 GICR &= ~(1 << INT1); // Externen Interrupt 1 sperren 00182 }