Hi zusammen,
ich versuche momentan mit einem Kumpel ein wenig mit einem ADC
rumzuspielen..
Ich habe eine init_adc()-Fkt., die wiefolgt aussieht:
1 | void init_adc( void )
|
2 | {
|
3 | ADMUX = (1<<REFS0);
|
4 |
|
5 | ADCSRA = (1<<ADPS2) | (1<<ADPS1); // prescale 64
|
6 | ADCSRA |= (1<<ADEN);
|
7 |
|
8 | ADCSRA |= (1<<ADSC);
|
9 | while( ADCSRA & (1<<ADSC) ) {}
|
10 |
|
11 | (void) ADCW;
|
12 | }
|
Zudem habe ich die Fkt. read_adc:
1 | uint16_t read_adc( uint8_t channel )
|
2 | {
|
3 | ADMUX = (ADMUX & ~(0x1F)) | (channel & 0x1F);
|
4 | ADCSRA |= (1<<ADSC);
|
5 |
|
6 | while( ADCSRA & (1<<ADSC)) {}
|
7 |
|
8 | return ADCW;
|
9 | }
|
Wenn meine Main-Fkt. nun wiefolgt aussieht:
1 | int main( void )
|
2 | {
|
3 | init_adc();
|
4 |
|
5 | const uint16_t adc_env = read_adc( CHANNEL ); // << CHANNEL == 2
|
6 | delay_ms( 50 ); // std.-fkt. um das programmm 50ms zu pausieren
|
7 |
|
8 | uint16_t adc_cur;
|
9 |
|
10 | while( true )
|
11 | {
|
12 | adc_cur = read_adc( CHANNEL );
|
13 |
|
14 | if( adc_cur == adc_env )
|
15 | switch_beeper( false );
|
16 | else
|
17 | switch_beeper( true );
|
18 |
|
19 | delay_ms( 200 );
|
20 | }
|
21 |
|
22 | return 0;
|
23 | }
|
(switch_beeper schaltet dabei einen summer an oder aus)
Dann müsste der Summer doch angehen, falls der ADC zwei verschiedene
Werte misst oder?
(avr/io.h, stdbool.h sind inkludiert)
Leider funktioniert es nicht wirklich..
Der ADC bekommt seine Werte durch Photodioden, und der Summer geht nicht
an, wenn ich die Photodioden beleuchte.. (switch_beeper funktioniert)
Vielen Dank für eure Hilfe!