00001 /****************************************************************************/ 00025 /***************************************************************************** 00026 * * 00027 * This program is free software; you can redistribute it and/or modify * 00028 * it under the terms of the GNU General Public License as published by * 00029 * the Free Software Foundation; either version 2 of the License, or * 00030 * any later version. * 00031 * * 00032 *****************************************************************************/ 00033 #include "asuro.h" 00034 00035 00036 00037 /****************************************************************************/ 00080 int Batterie ( 00081 void) 00082 { 00083 ADMUX = (1 << REFS0) | (1 << REFS1) | BATTERIE; // interne 2.56V Referenz 00084 // Ref. mit ext. Kapazitaet 00085 ADCSRA |= (1 << ADSC); // Starte AD-Wandlung 00086 while (!(ADCSRA & (1 << ADIF))) // Ende der AD-Wandlung abwarten 00087 ; 00088 ADCSRA |= (1 << ADIF); // AD-Interupt-Flag zuruecksetzen 00089 return ADCL + (ADCH << 8); // Ergebnis als 16-Bit-Wert 00090 } 00091 00092 00093 00094 /****************************************************************************/ 00128 void LineData ( 00129 unsigned int *data) 00130 { 00131 int ec_bak = autoencode; // Sichert aktuellen Zustand 00132 00133 /* 00134 Autoencode-Betrieb vom ADC-Wandler unterbinden. 00135 */ 00136 autoencode = FALSE; 00137 00138 /* 00139 Linken Linien-Sensor lesen 00140 */ 00141 ADMUX = (1 << REFS0) | IR_LEFT; // Referenz mit externer Kapazitaet 00142 Sleep (10); 00143 ADCSRA |= (1 << ADSC); // Starte AD-Wandlung 00144 while (!(ADCSRA & (1 << ADIF))) // Ende der AD-Wandlung abwarten 00145 ; 00146 ADCSRA |= (1 << ADIF); // AD-Interupt-Flag zuruecksetzen 00147 data [0] = ADCL + (ADCH << 8); // Ergebnis als 16-Bit-Wert 00148 00149 /* 00150 Rechten Linien-Sensor lesen 00151 */ 00152 ADMUX = (1 << REFS0) | IR_RIGHT; // Referenz mit externer Kapazitaet 00153 Sleep (10); 00154 ADCSRA |= (1 << ADSC); // Starte AD-Wandlung 00155 while (!(ADCSRA & (1 << ADIF))) // Ende der AD-Wandlung abwarten 00156 ; 00157 ADCSRA |= (1 << ADIF); // AD-Interupt-Flag zuruecksetzen 00158 data [1] = ADCL + (ADCH << 8); // Ergebnis als 16-Bit-Wert 00159 00160 /* 00161 Autoencode-Betrieb vom ADC-Wandler wiederherstellen. 00162 */ 00163 autoencode = ec_bak; 00164 } 00165 00166 00167 00168 /****************************************************************************/ 00208 void OdometrieData ( 00209 unsigned int *data) 00210 { 00211 /* 00212 Vorbereitung zum lesen der Odometrie-Sensoren. 00213 */ 00214 DDRC &= ~((1 << PC0) | (1 << PC1)); // Port auf Input=>Back-LEDs gehen aus 00215 ODOMETRIE_LED_ON; // Odometrie-LED's einschalten 00216 00217 /* 00218 Linken Odometrie-Sensor lesen 00219 */ 00220 ADMUX = (1 << REFS0) | WHEEL_LEFT; // Referenz mit externer Kapazitaet 00221 ADCSRA |= (1 << ADSC); // Starte AD-Wandlung 00222 while (!(ADCSRA & (1 << ADIF))) // Ende der AD-Wandlung abwarten 00223 ; 00224 ADCSRA |= (1 << ADIF); // AD-Interupt-Flag zuruecksetzen 00225 data [0] = ADCL + (ADCH << 8); // Ergebnis als 16-Bit-Wert 00226 00227 /* 00228 Rechten Odometrie-Sensor lesen 00229 */ 00230 ADMUX = (1 << REFS0) | WHEEL_RIGHT; // Referenz mit externer Kapazitaet 00231 ADCSRA |= (1 << ADSC); // Starte AD-Wandlung 00232 while (!(ADCSRA & (1 << ADIF))) // Ende der AD-Wandlung abwarten 00233 ; 00234 ADCSRA |= (1 << ADIF); // AD-Interupt-Flag zuruecksetzen 00235 data [1] = ADCL + (ADCH << 8); // Ergebnis als 16-Bit-Wert 00236 }