Hi,
mal wieder scheitere ich wohl an den einfachsten Dingen...
Ich wollte die Helligkeit mit einem Fototransistor messen, habe mir
dafür den SFH 300 besorgt. Hab gelesen das der Emitter (langes Bein)
Richtung GND muss. Dann hab ich ein paar Beiträge gefunden wonach es
wohl Schaltungen gibt die diesen mit 100 Omh aber auch mit 10kOhm
betreiben. Ich hab mitlerweile 270 Ohm, 4.7kOmh und 10kOhm getestet, das
ist alles was ich in dem Bereich da habe. Ich habe dazu den Widerstand
im Stromfluss vor den Fototransistor geschaltet und den Widerstand mit
Vcc verbunden. Den Fototransistor dann an PA0 (ADC0). AVCC liegt auf VCC
und GND unterhalb von AVCC ebenfalls auf "normalem" GND.
Wiefolgt mein Code das dann zu messen und anzuzeigen:
1 | // enable ADC
|
2 | ADCSRA |= (1<<ADEN);
|
3 | // disable ADC interrupt
|
4 | ADCSRA &= ~(1<<ADIE);
|
5 | // prescaler = 110 = 64
|
6 | ADCSRA |= (1<<ADPS2) | (1<<ADPS1);
|
7 | ADCSRA &= ~(1<<ADPS0);
|
8 | // AVCC as reference
|
9 | ADMUX &= ~(1<<REFS1);
|
10 | ADMUX |= (1<<REFS0);
|
11 | // ADC0 as input
|
12 | ADMUX &= ~(1<<MUX4);
|
13 | ADMUX &= ~(1<<MUX3);
|
14 | ADMUX &= ~(1<<MUX2);
|
15 | ADMUX &= ~(1<<MUX1);
|
16 | ADMUX &= ~(1<<MUX0);
|
17 |
|
18 | spi_master_init();
|
19 |
|
20 | dogm_init();
|
21 |
|
22 | while (1)
|
23 | {
|
24 | dogm_clear();
|
25 |
|
26 | // start converstion
|
27 | ADCSRA |= (1<<ADSC);
|
28 | while (ADCSRA & (1<<ADSC));
|
29 |
|
30 | uint16_t val = ADCL;
|
31 | val += (ADCH<<8);
|
32 |
|
33 | char tmp[6];
|
34 | ItoA(val, &tmp);
|
35 | dogm_goto(0,0);
|
36 | dogm_print_string(tmp);
|
37 |
|
38 | _delay_ms(5000);
|
39 | }
|
Ich messe leider immer 1023 als maximalwert, außer ich zieh den
Fototransistor dann pendelt der freie pin bei ca. 110. Es ändert sich
nichts je nach Lichtverhältnis und Widerstand :( Kann mir jemand helfen
und sagen was ich falsch mache?
CU Chris