Hi,
ich habe mit C angefangen und interesiiere mich jetzt für den AD-Wandler. ich will den Freilaufmodus verwenden da er glaub ich einfacher mitten im programm abzufragen ist. Aber meine Frage ist ob er im freilaufmodus die geschwindigkeit des ATmega16 verändert bzw. wie viel verändert.
Was ist die Wiki-german?
Hallo Superhirn,
der Freilaufmodus ist tatsächlich interessant, wenn du nur genau einen ADC-Kanal abfragen möchtest. Sobald du aber verschiedene Kanäle benötigst, musst du laut der AVR-Doku schon etwas aufpassen. (Seite 203 in der ATmega8-Doku, die beim ASURO dabei war)
Wenn dein Hauptprogramm den ADC-Kanal über das Register ADMUX ändert, dann wird die aktuell laufende Wandlung noch weiter durchgeführt und erst danach wird der neu eingestellte Kanal 'freerunningmäßig' gewandelt.
Da das Hauptprogramm aber nun den neuen ADC-Kanal erwartet, bekommst du nun trotzdem ersteinmal noch einen Wert zum vorher eingestellten ADC-Kanal.
Falls du in deiner Hauptprogrammschleife ein Sleep hast, das länger als ZWEI Wandlerzeiten ist, kannst du direkt vor dem Sleep den ADC-Kanal wechseln, halt ein bisschen warten, und danach den Wert, der einfach in der ADC-Interruptfunktion in eine globale Variable geschrieben wurde, benutzen.
Wenn du den Kanal NICHT wechselst, dann ist der Wert tatsächlich immer aktuell.
Somit benötigst du den Sleep NUR dann, wenn du den ADC-Kanal wechseln willst.
Der code könnte ungefähr so aussehen:
P.S.: Eine Reaktion auf super_castle ist nie notwendig.Code:unsigned int global_adc_wert; main () { char kanal_akt = 1; char kanal_neu = 1; unsigned int adc_wert; while (1) { // Hier muss Programmcode sein, der den neuen ADC-Kanal bestimmt. // Natürlich nur dann, wenn du es tatsächlich benötigst. // Vielleicht ja auch nur zum testen über irgendeine Taste if (kanal_akt != kanal_neu) { wechsel_den_Kanal_auf kanal_neu; kanal_akt = kanal_neu; Sleep (100); // Hier ein bisschen ausprobieren. DIe 100 habe ich nur geraten. } adc_wert = global_adc_wert; // global_adc_wert wird in der ADC-Interrupt-Funktion gefüllt. // Hier kanst du nun beliebig auf den ADC-Wert reagieren if (adc_wert > 100) Lampe an; else Lampe aus; } }
Lieber Asuro programieren als arbeiten gehen.
man kann den freilaufmodus austricksen, bei mir laufen 7 verschiedene wandlungen (5 sharpsensoren und 2 radencoder). alle ergebnisse sind einwandfrei.
das obige programm kann so nicht laufen...he...he...du hast das wichtigste vergessen. der adc(porta0) läuft immer wenn es los geht admux=0 gibt es nicht.
castle
Hallo,
was haltet Ihr davon, wenn Ihr den Kanal in der adcready Interrupt routine umschaltet?
Gruß Sebastian
@castle
Anstatt blöde zumzulabbern, würde ich auch Deiner Stelle mal die Lösung sagen
zu umständlich......
man kann winavr-c nur kennenlernen wenn man auch mal mit dem datenblatt arbeitet. es ist hier nicht alles erklärbar.
Der Kandidat hat hiermit 100 Punkte gewonnen.man kann winavr-c nur kennenlernen wenn man auch mal mit dem datenblatt arbeitet.
Damit gege ich Dir zum erstem Mal recht, das ist war, darin sind schon viele Weisheiten verborgen...
Gruß Sebastian
An die, die das Verstehen:
Wenn man der Doku traut, dann heißt es zum ADC-Wandler, dass die nächste Wandlung gestartet wird, sobald die aktuelle fertig ist. Dazu wird dann noch der Interrupt ausgelösst.Zitat von izaseba
Somit läuft die nächste Wandlung schon wenn wir in der Interrupt-Funktion angekommen sind. Es ist hier demnach schon zu spät, da wir den MUX ja hier erst nach dem Start der jetzt schon laufenden 'freerunning'-Wandlung umschalten können.
Ich möchte keinesfalls ausschliessen, das ich da nichts verstehe. (Rechtlicher Hinweis)
Vielleicht nochmal (vor allem für mich): Wir reden doch vom ATmega16?
Die von mir angegeben Seite (203) kam vom ATmega8, da ich nur die CPU nutze, und entsprechend nur diese Doku habe.
Ich kann mir aber nicht vorstellen, das der interne Ablauf im Kontroller komplett anders sein sollte. Aber man weiss ja nie.
Deshalb hier die 'eventuell möglichen Kapitelüberschriften' die ich zu diesem Thema für relevant halte:
ADC-Konverter (natürlich auf Englisch)
Interrupt-System (klar, auch auf Englisch)
@izaseba
Die Idee ist nicht schlecht. Leider bin ich aber auf diese 'Falle' schon gestoßen und habe deshalb den 'freeruning'-Mode beim Asuro komplett aufgegeben. Mag sein, dass man es hinbekommt, aber ich verwalte alle anstehenden ADC-Kanal-Anforderungen nun komplett ohne den 'freerunner'. Mal sehen, wann ich es gelernt habe einen Thread aufzumachen um darüber zu berichten
Lieber Asuro programieren als arbeiten gehen.
Damit gege ich Dir zum erstem Mal recht, ....
brauchst du nicht, ich fühl mich auch so pudelwohl....
Lesezeichen