Hallo! Ich habe ein kleines Problem mit dem ADC, und zwar möchte ich n Messwerte in konstanten Zeitabständen aufnehmen. Zunächst hatte ich den ADC im Free-Running Mode und dann im Timer-Interrupt immer den Wert aus ADCW ausgelesen und in ein Feld der Größe n geschrieben. Dann habe ich gelesen das man das auch über den Interrupt des ADC machen kann was evtl. besser wäre (warum stand nicht dabei...) und wollte das mal ausprobieren, irgendwie komme ich dabei nicht richtig weiter. Es ist doch richtig das ich weiterhin mit dem Timer einen "Takt" erzeuge der dann den ADC startet oder? Ich verwende einen Mega168, zusammen mit AVR Studio, die Messwerte sollen in einem Feld abgespeichert werden. Gibt es dazu eine genauere Erklärung oder bessere Lösungen? Im Forum habe ich einige Sachen in Assembler gefunden, da komme ich leider absolut nicht mit klar :(
1 | main(void) |
2 | {
|
3 | sei(); |
4 | |
5 | ADMUX = 0; |
6 | |
7 | ADMUX |= (0<<REFS1) | (1<<REFS0); |
8 | |
9 | ADCSRA = (1<<ADEN) | (1<<ADPS2) | (1<<ADPS1) | (1<<ADPS0)| (1<<ADATE) | (1<<ADIE); |
10 | |
11 | ADCSRB = (1<<ADTS1) | (1<<ADTS0); |
12 | |
13 | ADCSRA |= (1<<ADSC); |
14 | |
15 | do
|
16 | {
|
17 | messwerte_aufnehmen(); |
18 | ausgabe(); |
19 | }
|
20 | |
21 | while(1); |
22 | }
|
23 | |
24 | |
25 | void messwerte_aufnehmen() |
26 | {
|
27 | index=0; |
28 | TCCR1A = (1<<COM1A1) | (1<<COM1A0); |
29 | cli(); |
30 | TCNT1H = 0xF0; |
31 | TCNT1L = 0x05; |
32 | sei(); |
33 | TIMSK1 = (1<<TOIE1); |
34 | TCCR1B = (1<<CS10); |
35 | while(index<=n-1); |
36 | TCCR1B &=~ (0<<CS10); |
37 | }
|
38 | |
39 | |
40 | SIGNAL (SIG_OVERFLOW1) |
41 | {
|
42 | messwerte[index] =ADCW; // ergebnis übernehmen |
43 | index++; |
44 | }
|