mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik mehrkanal AD mit Atmega -> programmablauf


Autor: Erik D. (dareal)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin gerade dabei einen mehrkanal AD-Wandler für meinen Atmega zu 
realisieren.

Dabei werte ich 6 Kanäle aus. Soweit klingt das ganze jetzt noch recht 
simpel. Ich möchte jedoch für jeden Wert den Mittelwert bilden. Das 
könnte man jetzt für jeden Kanal einzelnd machen, ich möchte das aber 
fortlaufend und gestalten. Soll heißen:

Kanal wird eingelesen, zum Mittelwertspeicher addiert und es wird zum 
nächsten Kanal gewechselt. Für diesen das gleiche, das ganze dann eine 
bestimmte Anzahl an durchgängen und zum schluss werden die Mittelwerte 
gebildet und am LCD ausgegeben.

Das problem hierbei ist für mich: bei der Anzahl der Messwerte muss ich 
schon auf den SRAM zurückgreifen ... was 1. Zeitintensiv ist, viel 
Speicerplatz im Code benötigt und eventuelle sprünge nicht mehr 
realisierbar macht (RJMP).

Gibt es da möglicherweise tricks bzw. routinen, die das erleichtern?


Um Register zu sparen rechne ich derzeit lediglich 64 Messwerte hoch, 
womit ich beim Summierspeicher nur zwei Register benötige.

Damit komme ich auf 12 Register allein für die Messwerte.


Hier mal ein Codeschnipsel von einem Kanal.
sample_ch0:
  sbi    ADCSRA, ADSC

wait_ch0:
  sbic  ADCSRA, ADSC
  rjmp  wait_ch0


; ADC einlesen
 
  in    adlow, ADCL
  in    adhigh, ADCH
  lds    temp1, ch0l
  lds    temp2, ch0h
  add    adlow, temp1
  adc    adhigh, temp2
  sts    ch0l, adlow
  sts    ch0h, adhigh

Allein das holen der Messwerte und abschließende Abspeichern kostet 8 
Cycles und 4 zeilen im Programmcode.

Autor: Marius Wensing (mw1987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich würde das ganze über einen Interrupt machen.

Dann kannst du während der schon den nächsten Wert aufnimmt, den 
aktuellen Wert bearbeiten. Somit nutzt du die Zeit während der Wandlung.

Da der AD-Wandler bis maximal 200 kHz geht hast du schon einigen 
Freiraum.

MfG
Marius

Autor: Dussel (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso musst du auf den SRAM zurückgreifen? Für sechs Kanäle wären das 
sechs Register plus eins, das den aktuellen Wert hat. Dann einfach zu 
dem entsprechenden Register den aktuellen Wert addieren und fertig. Mal 
davon abgesehen, weißt du, wie langsam der ADC ist im Vergleich zur CPU? 
Wenn du das alles während der nächsten Wandlung berechnest sollte das 
kein Problem geben.

Autor: AVRFan (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das problem hierbei ist für mich: bei der Anzahl der Messwerte muss ich
>schon auf den SRAM zurückgreifen ... was 1. Zeitintensiv ist, viel
>Speicerplatz im Code benötigt und eventuelle sprünge nicht mehr
>realisierbar macht (RJMP).

Hast Du denn einfach alles mal sauber durchgerechnet?  Taktfrequenz des 
Controllers, RAM-Größe, Anzahl der ADC-Kanäle, gewünschte 
Aktualisierungsrate, Mittelung über soundsoviele Werte... aus diesen 
Daten sollte sich doch eine brauchbare Vorhersage kalkulieren lassen, ob 
Dein Controller die gewünschten Anforderungen bewältigen kann.

Speicherplatz im Code?  Das ist doch nur ein Problem, wenn Du den Platz 
anderweitig benötigst, oder kein Controller mit mehr Platz verfügbar 
ist.  Ansonsten: Benutzen und fertig.

Zeitintensiv?  Solange der Controller mit seiner Arbeit rumkommt, ist es 
egal, ob er 10 % oder 90 % der Zeit ausgelastet ist.

Einen Codeabschnitt, der 100 Taktzyklen benötigt, kann ein mit 8 MHz 
getakteter Controller theoretisch 80000 mal pro Sekunde ausführen. Ich 
finde, das ist eine ganze Menge.  Angenommen, Dein Codeabschnitt zur 
Mittelwertbildung verschlingt 1000 Zyklen, muss 6 mal ausgeführt werden 
muss (6 Kanäle), und Deine Aktualisierungsrate ist 50/s - wie groß ist 
die dadurch verursachte Prozessorlast bei 8 MHz Taktfrequenz? Richtige 
Antwort: Nur 3.75 %.

>Damit komme ich auf 12 Register allein für die Messwerte.

Wenns mit Registern eng wird, kann man sie auf dem Stack zwischenlagern 
(push/pop).

>Allein das holen der Messwerte und abschließende Abspeichern kostet 8
>Cycles

8 Instruktionen meinst Du.  Cycles sinds ein paar mehr.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.