habe die Pullups rausgenommen und
lese das Register wie folgt aus: i = (4<<ADCH)|ADCL;
Beim aufruf von get_adc setze ich i auf 0.
Das funktioniert aber auch nicht.
Habe jetzt folgenden Quellcode:
Code:
#include <avr/io.h>
#define SYSCLK 16000000
void init(void);
unsigned char get_adc(void);
// Hauptprogramm
int main(void)
{
unsigned char i;
init();
while(1)
{
// Ergebnis auslesen und anzeigen
i = get_adc();
if (i != 0xff)
PORTC = ~(1<<i) & 0x7f;
else
PORTC = 0x7f;
}
return 0;
}
// Initialisierung des µC
void init(void)
{
DDRA = 0x00; // Port als Eingang deklarieren ( A/D-Wandleer Eingänge )
PORTA = 0x80;
DDRB = 0xff; // Port als Ausgang deklarieren
PORTB = 0x00;
DDRC = 0xff; // Port als Ausgang deklarieren
PORTC = 0x00;
DDRD = 0xff; // Port als Ausgang deklarieren
PORTD = 0x00;
// Analog zu Digital Wandler aktivieren ( Prescaler = 128, interne +5V Referenz, "8-Bit" Ergebnis )
ADMUX = (1<<REFS0)|(1<<ADLAR);
ADCSRA = (1<<ADEN)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
}
unsigned char get_adc(void)
{
unsigned char i, taste = 0xff;
// ADC7 mit Vcc als Referenzspannung
ADMUX = (1<<REFS0)|(1<<ADLAR)|0x07;
// AD Wandler starten *
ADCSRA |= (1<<ADSC);
// Warten bis das Ergebniss zur Verfügung steht
while(!(ADCSRA & (1<<ADIF)));
// Ergebnis auslesen und anzeigen
i = ADCH;
if (i < 36)
taste = 4;
else if (i < 57)
taste = 3;
else if (i < 76)
taste = 2;
else if (i < 94)
taste = 1;
else if (i < 150)
taste = 0;
return taste;
}
Wenn ich jetzt verschiedene Spannungen zwischen 0 und 2,3 Volt anlege, dann leuchtet auch die entsprechende LED. Schließe ich aber den GP2D12 an, dann passiert da nichts. Wieso denn dass? Ich messe aber mit einem Multimeter am gelben Kabel des Senors Spannungen zw. 0,3 und 2,5 V.
Jens
Lesezeichen