Hallo, ich habe eine Frage zum ADC in Verbindung mit dem DMA (es geht nicht um die Implementierung). Ich Scanne mit dem ADC im continuous mode 4 Kanäle und lasse die Werte vom DMA in ein Array schreiben. Es soll ein Interrupt ausgelöst werden, wenn der DMA alle Werte geschrieben hat. Z.B. 4 Kanäle, je 4 Werte --> DMA schreibt 16 Werte in ein Array und löst dann einen Interrupt (Trandfer complete) aus. In dieser ISR möchte ich die Mittelwerte berechnen. Jetzt zu meinen Fragen: - Während der ISR wandelt der ADC doch weiter, was macht der DMA? - Überschreibt er die gespeicherten Werte im Array mit neuen Werten? - Müsste ich den ADC während der ISR stoppen um das zu vermeiden? - Ist es so möglich dass ich keinen gescannten Wert verliere? Danke im voraus
in einer ISR verarbeitet man keine Daten. Den DMA kann man so einstellen dass er einmal fertig nichts mehr macht und du kannst ihn dann in der ISR neu aufsetzen.
Steel schrieb: > in einer ISR verarbeitet man keine Daten.Den DMA kann man so einstellen dass er einmal fertig nichts mehr macht und du kannst ihn dann in der ISR neu aufsetzen. mit der Datenverarbeitung in der ISR ist auch nur ein Beispiel um den Fall einfach zu halten. Wenn der DMA stoppt nachdem er alle Werte geschrieben hat, kann ich ihn in der ISR wieder anstoßen, ok. Aber der ADC macht ja weiter und ich würde somit Werte verlieren. Was ist mit meiner Reihenfolge mit der die Werte in das Array geschrieben werden? Wenn ich den DMA wieder starte und der ADC gerade an einem Kanal ist der vorher im Element [2] gespeichert war, wird er jetzt im Element [0] gespeichert. Würde die Reihenfolge somit verloren gehen?
Du kannst die DMA auch zyklisch im Ringpuffer laufen lassen. Damit würdest Du keine Werte verlieren. Musst die DMA nur exakt so schnell laufen lassen wie den ADC. Aber natürlich musst Du trotzdem dafür sorgen, dass Du die Werte schneller verarbeitest als der ADC liefert (klar) :-) Chris D.
erstmal danke sehr :) Bevor ich jetzt meinen Ansatz schreibe, noch eine Frage zum zyklisch laufen lassen. Es sind 6 Kanäle, von denen ich jeweils 16 Werte in einen Puffer[96] schreiben lasse. Irgendwann muss ich ja die Werte verarbeiten, um es einfach zu halten in der ISR. Jetzt muss ich also nur dafür sorgen, dass ich alle Werte verarbeitet habe, bevor der ADC den nächsten Wert liefert. Denn dann würde der DMA den ersten Wert im Puffer überschreiben. Ist das also das einzige was beim zyklischen laufen lassen zu berücksichtigen ist? (Solange der DMA nicht langsamer läuft wie der ADC) Ich habe jetzt folgenden Ansatz gewählt: Ich lasse den ADC eine Sequenz wandeln (6 Kanäle nur 1x). In der ISR (EOSEQ) zähle ich einen Zähler hoch und starte den ADC erneut. Erreicht der Zähler den Wert 16 (dann habe ich den Puffer gefüllt 16*6=96) starte ich den ADC NICHT wieder. Das geschieht erst in der DMA-ISR (transfer complete). Dort verarbeite ich meine Werte und starte den ADC anschließend. Somit verliere ich keine Werte, allerdings glaube ich nicht dass dies der Optimale Ansatz ist (scheint mir etwas zu aufwendig). Wenn ich mit einen 2. Puffer arbeiten würde, müsste ich in der DMA-ISR nur die Ziel Adresse ändern und hätte dann genug Zeit die Werte zu verarbeiten. Allerdings benötige ich dann den doppelten Speicher und ich muss sicher sein, dass der nächste ADC-Wert dann auch im 2. Puffer landet, also die Änderung der Adresse unmittelbar durchführen.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.