Hallo Mikrocontroller Gemeinde,
ich ich bastel gerade ein bisschen am ADC vom Duemilanove rum. Habe es
nach langem Probieren endlich geschafft eine von Timer 1 über CTC
getriggerte Konvertierung auf die Beine zu stellen, allerdings gibt es
noch eine Kleinigkeit, die ich nicht nachvollziehen kann. Würde mich
sehr über Aufklärung freuen.
Hier ist zunächst der Code, ich habe versucht mich kurz zu fassen:
1 | #include <avr/interrupt.h>
|
2 |
|
3 | byte value = 0;
|
4 |
|
5 | void setup()
|
6 | {
|
7 | Serial.begin(9600);
|
8 | Serial.println("Arduino running");
|
9 | noInterrupts();
|
10 | timer1();
|
11 | InitADC();
|
12 | interrupts();
|
13 | }
|
14 |
|
15 | void loop()
|
16 | {
|
17 | Serial.println(value);
|
18 | }
|
19 |
|
20 | void InitADC (void)
|
21 | {
|
22 | ADCSRA = 0x00;
|
23 | ADCSRB = 0x00;
|
24 | //ADMUX = 0x00;
|
25 | ADMUX = (1<<REFS0) | (1<<ADLAR); //Interne Referenz VCC und Linksbündige Ausrichtung von ADC
|
26 | ADCSRA |= (1<<ADEN) | (1<<ADATE)| (1<<ADIE)|(1<<ADPS2)|(1<<ADPS1)|(1<<ADPS0);
|
27 | ADCSRB |= (1<<ADTS2) | (1<<ADTS0); //Output Compare Match Timer 1 Kanal B
|
28 | ADMUX &=~((1<<MUX3) | (1<<MUX2) | (1<<MUX1) | (1<<MUX0)); // ADC Kanal 0
|
29 | ADCSRA |= (1<<ADSC); //Starte erste Konvertierung
|
30 | }
|
31 |
|
32 | void timer1 (void)
|
33 | {
|
34 | TCCR1A = 0x00;
|
35 | TCCR1B = 0x00;
|
36 | TCNT1 = 0;
|
37 | OCR1A = 32000;//Ohne Schreiben von OCR1A hängt sich ADC auf
|
38 | OCR1B = 16000;
|
39 | TCCR1B |= (1 << WGM12); // CTC mode
|
40 | TCCR1B |= 0b00000001; // Kein Prescaler
|
41 | }
|
42 |
|
43 | ISR(ADC_vect){
|
44 | TIFR1 |= (1<<OCF1B); //Reset Timer Compare Match Flag
|
45 | value = ADCH; // Wert nach Value schieben
|
46 | }
|
Frage: Warum muss ich auch das Register OCR1A beschreiben, wenn ich doch
nur auf OCR1b "scharfstelle"? Ich kann doch eh nur den niedrigeren der
beiden Werte erreichen, wenn ich CTC richtig verstanden habe?!
Beste Grüße,
Kai