Hallo,
ich benötige eine Schleife durch einen ADC Hindurch aTMEGA16
Die von der Zeit her immer konstant ist. Das Problem besteht darin das
der ADC pro wert immer unterschiedlich viele Zyklen braucht. kann man
die Zyklen irgendwie erfassen? Die schleife schon läuft in einem
Interrupt.
Habt Ihr Ideeen wie man das lösen kann?
Der ADC hat immer gleich lange. Man kann den ADC mit sich selbst
starten, oder von einem Timer. Wenn das Timing sehr stabil sein muss,
unbeeinflusst von irgendwelchen interrupts, so sollte man sich nach
einem CPLD/FPGA umschauen.
Der ADC wert braucht unterschiedliche Zyklen? Das waere wirklich
merkwuerdig... oder braucht deine Schleife immer unterschiedlich lange,
vielleicht wir sie von nem anderen Interrupt unterbrochen. Kenne den
Controller jetzt nicht, aber kann man da keine Prioritaeten fuer
Interrupts setzen?
Hallo,
habe diese schleife im Interrupt mit ein bisschen gerassel vorneweg und
hinterher die aber mit nop usw, angepasst sind ohne ADC sind die Zeiten
konstant. Mache ich die ADC Schleife hinzu dann ändern sich die Zeiten.
Im AVR Studio sind die Zeiten gleich in der Praxis nicht.
start:
sbi ADCSRA, ADSC
wait: sbic ADCSRA, ADSC
rjmp wait
Ich frage nacheinander 3 verschiedene Eingänge im Interrupt ab sobald
ich die ADC Schleife einfüge "Wandern die Zeiten". Schleife ADC +
darüber liegende Schleife für das Umschalten und Speichern der Werte im
RAM. Schleifen wurden mit nop wegen der Sprünge angepasst und im
Simulator sind die Intervalle immer
gleich. ob mit oder ohne ADC Schleife in der Praxis leider nicht.
bin echt ratlos
Warum schickst Du nicht den kompletten Code? Und warum nutzt Du nicht
den ADC-Interrupt? Eine Warteschleife mit derart großen Zeitkonstanten
in einem Interrupt Handler ist miserabler Programmierstil! Auf die
Weise wundert mich überhaupt nicht, dass Du Timing-Probleme bekommst.
Und auch wenn Du es nicht glauben willst: Bis auf die erste Wandlung
nach dem Einschalten dauern alle Wandlungen prinzipbedingt gleich lange.
hier der Relevate Teil durch die Teilweise Rumprobierrei ist es ziemlich
Caotisch. Serg und andere Register werden vorher gesichert und nachher
wieder zurückgeschrieben hab das jetzt weggelassen
René wrote:
> hier der Relevate Teil durch die Teilweise Rumprobierrei ist es ziemlich> Caotisch. Serg und andere Register werden vorher gesichert und nachher> wieder zurückgeschrieben hab das jetzt weggelassen
Ich habe gesagt KOMPLETTER Code! Schreibe ich so undeutlich?
Und wenn das da oben alles in einer Interrupt Routine steht, dann
brauchst Du Dich über gar nichts zu wundern!
René wrote:
> Seit wann darf in einem IR nur 3 Zeilen Code stehen?
Habe ich nicht behauptet. Ich habe lediglich darauf hingewiesen, dass
Warteschleifen in Interrupt Handlern meist dazu führen, dass es
Timing-Probleme gibt. Und Du hast noch nicht mal erzählt, welchen
Interrupt Du da überhaupt verwendest. Aber wenn Du nicht mit dem Code
rausrückst, dann wünsche ich Dir noch einen schönen Tag. Das kann doch
nicht so schwer sein!
Hallo,
ich mache solche Sachen eigentlich immer im Timer-IRQ.
Die Zeit des Timer-IRQ so lang, daß es für eine ADC-Wandlung + ein paar
Takte Reserve reicht.
Dann muß ich die Fertig-Meldung des ADC garnicht auslesen, er ist immer
fertig.
Wert holen, neu starten, Flag für Daten da setzen, raus.
Bei mehreren zu wandelnden Eingängen eben entsprechend viele Flags
vereinbaren und dann im Kreis rum. Webb Dummy-Zyklen nötig sind
(Umschalten von ARef oder sonstige Gründe, dann eben Hilfsflag und
ersten Wert wegwerfen.
Wenn nur die Eingänge wechseln, kann man die Timer-Zeit auch auf die
Hälfte setzen und im IRQ "dazwischen" den MUX schon umschalten.
Die Timerzeit hängt dann davon ab, wie oft ich überhaupt neue Werte
einlesen will.
Wenn man sich das Zeitraster einaml aufgestellt hat, bleibt da nur wenig
Code übrig.
Gruß aus Berlin
Michael
Hallo,
Gute Idee das mit dem Timer IRQ aber den würde das auch mit einer
normalen schleife als Pause funktionieren. Ich Zähle also im AVR Studio
die Zyklen gebe noch ein bisschen reserve dazu und lese dann den ADC aus
und habe immer die selbe Pause zwischendurch.