ich möchte den ADC auto triggern, also Timer1 läuft, jede sekunde springt er mir in den ISR.
Und dann soll auch die ADC-Messunge angestroße werden, aber irgendwie klappt das icht so ....
Meine andere Idee war, im Timer-ISR, eine ADC-Messung zu starten (adc dann als Single conversion) - das hat irgendwie auch nicht gefunzt // kann wohl auch nicht gehen? ^^
Im Prinzip als so wie hier:
http://www.avr-praxis.de/forum/showthread.php?1583-Int0-gt-ADC-triggern
Du kannst auch von einer ISR eine ADC-Wandlung starten. Übrigends löscht eine ISR ihr Anforderungsflag immer selber, das musst du also nicht manuell machen.
So wie ich es aus deinen Code-Stücken heraus lese, möchtest du
- einmal in der Sekunde Messungen starten, aus diesen wird dann ein Mittelwert gebildet
- den Multiplexer des ADC Moduls nutzt du nicht, sondern einen externen.
- im Hauptprogramm möchtest du dann das Ergebnis weiter verarbeiten.
Du könntest hier eventuell so vorgehen:
(1) Timer ISR (alle 1s)
- initialisiert Zähler für Mittelwertbildung (Messzeit für alle Messungen für den Mittelwert muss kleiner 1 Sekunde sein)
- schaltet externen Multiplexer
- startet ADC Messung (der ADC Interrupt aktivieren, FreeRunning Mode aktiviert, ADC Interrupt triggert den ADC)
(2) ADC Interrurpt
- Messung solange summieren, bis Anzahl (zB 16) für Mittelwertbildung erreicht ist.
- Ist Anzahl erreicht, FreeRunning abschalten, ADC Interrupt deaktivieren, Mittelwert bilden (/16, geht schnell mit 4 mal rechts shift). Das Ergebnis in einer weiteren Variablen merken und Signal an das Hauptprogramm, was dieses pollt.
(3) Hauptprogramm
- pollt das Signal vom ADC Interrupt für fertige Messung. Wenn gesetzt, löschen und Ergebnis verarbeiten.
Beim nächten mal erstelle am besten ein neues Thema, damit der Thementitel passt. So könnten andere User besser helfen und User die nach einer Problemlösung suchen, finden sich besser zurecht.
Ich habe gesehen, du hast deinen Beitrag geändert, während ich am Schreiben war. Mach es bitte mit "EDIT:", damit man sieht, was sich geändert hat.
Es ist eigentlich egal, ob du einen CompareInterrupt oder einen OverflowInterrupt eines Timers verwendest, Hauptsache du kommst auf 1 Sekunde. Falls der Timer zu schnell läuft bzw das Event zu oft kommt, kannst du in der TimerISR einen Zähler einbauen. Zur Timerberchnung haben wir ein
kleines Tool, was dir eventuell ein bisschen bei der Berechnung des Comparewertes oder des Nachladewertes hilft.
Dirk