Hallo
Irgendwie kapiert mein ADC nicht, was 'free running' heisst. Ich
initialisiere ihn folgendermassen:
Einstellen der Quellen (unbedeutend für das Problem):
ADMUX = (1 << REFS0) | (0 << ADLAR) | (n << MUX0);
Einstellen der Funktionsweise:
ADCSRA = (1 << ADEN) // Enable ADC
|(1 << ADSC) // Start Conversion
|(1 << ADIE) // Interrupt Enable (AUSGESCHALTET!)
|(7 << ADPS0)// Prescaler XTAL / 128
|(1 << ADATE); // Auto trigger enable (for free running)
Einstellen der Trigger-Source:
ADCSRB = (0 << ADTS0); // free running mode
Komischerweise wird der ADC-Interrupt (im Simulator) nur genau einmal
aufgerufen, obwohl der ADC ja free running sein sollte. Wenn ich im
Interrupt ADSC wieder auf 1 schreibe, dann läuft er auch schön brav
stetig durch. Allerdings sollte er ja automatisch getriggert werden.
Was mache ich bloss falsch?
Gruss
Michael
Welcher Controller?
Ich habe vor Jahren mal das Problem gehabt, dass die
Auto-Trigger-Funktionalität im Simulator nicht funktionierte. Ich
vermute mal, dass das auch den Free Running Mode betrifft. In den
Known Issues stand damals auch nichts von einem bekannten Bug.
Möglicherweise hat sich da bis heute nichts dran geändert (OK, ich habe
damals glaub ich keinen Bugreport an ATMEL geschrieben, was ich
vielleicht hätte tun sollen).
Beitrag "AVRStudio-Simulator: ATMega16, ADC Auto Trigger"
Ich vermute mittlerweile fast, dass der Simulator schlicht und
ergreifend das ADATE-Bit ignoriert.
> Meines Wissen muss man den wieder anwerfen. Ich tu's jeweils im ADC> Interrupt : Lesen, dann neu starten.
Das würde aber den 'free running' Mode überflüssig machen. Es gibt ja
diese Auto-Trigger-Sources, die den ADC selbst anwerfen. Eine davon ist
free running, und da erwarte ich eben, dass der ADC dann auch
tatsächlich automatisch angeworfen wird.
In meinem Fall ist das insofern wichtig, dass ich keinen ADC-Interrupt
haben möchte, aber immer ein aktuelles Resultat. Der ADC soll einfach
nebenher laufen und stetig abtasten, gelesen wird dann, wenn man gerade
einen Wert braucht.
>Eine davon ist free running, und da erwarte ich eben, dass der ADC dann auch>tatsächlich automatisch angeworfen wird.
Das ist auch so. Habe ich auch schon verwendet.
Also den Controller wissen wir ja noch nicht, aber aus dem Manual vom
48/88/168 habe ich mal folgendes herausgeholt. Ich gehe im Moment davon
aus, das dies bei allen Megas so ist.
>Using the ADC Interrupt Flag as a trigger source makes the ADC start a new >conversion as soon>as the ongoing conversion has finished. The ADC then operates in Free >Running
mode, constantly
>sampling and updating the ADC Data Register. The first conversion must be >started by>writing a logical one to the ADSC bit in ADCSRA. In this mode the ADC will >perform successive>conversions independently of whether the ADC Interrupt Flag, ADIF is >cleared or
not.
> Ich habe vor Jahren mal das Problem gehabt, dass die> Auto-Trigger-Funktionalität im Simulator nicht funktionierte.
Das habe ich mittlerweile auch feststellen müssen. Auf dem AVR läuft es
nämlich. Ein bisschen ärgerlich, was Atmel da produziert - fehlende
Funktionen kann ich verstehen, aber dann sollte der Simulator wenigstens
darauf hinweisen.
@Ahem:
Klar, wie gesagt, ich gehe von einem Simulatorproblem aus. Wäre nicht
das erste. Ich habe auch schon mit dem Free Running Mode in Hardware
gearbeitet, und da läuft er...
mr.chip wrote:
> aber dann sollte der Simulator wenigstens> darauf hinweisen.
Wie gesagt, wenn niemand einen Bugreport schreibt, dann wird das nix.
Auch wenn ich mir fast nicht vorstellen kann, dass das in drei Jahren
noch keiner außer mir damals festgestellt hat...
Wenn die das dann nicht für nötig halten, es zu reparieren, dann kommt
wenigstens in die Known Issues ein Eintrag, dass Auto Trigger nicht
unterstützt wird. Da selbst das ausgeblieben ist, vermute ich stark,
dass sich tatsächlich noch niemand ernsthaft beschwert hat. Aber der
alte Simulator V1 wird ja denke ich mal sowieso nicht mehr gemaintaint.