Atmega8, Mittelwert berechnen (Assembler)

#582979
Lesenswert?

Hallo
ich habe ein kleines Problem mit einer Temperatursteuerung. Die 
Schaltung besteht aus vier Thermoelementen die an der oberen 
Temperaturgrenze 12mV abgeben. Diese werden dann jeweils mit einem 
Operationsverstärker auf 3.2V verstärkt und auf einen ADC-Eingang eines 
Atmega8 gelegt. Für den AVR habe ich ein Assembler Programm geschrieben 
das diese vier "Temperaturwerte" überwachen   und die entsprechenden 
Heizelemente schalten soll.(natürlich mit Hysterese)
Allerdings schwankt die Spannung an den ADC Eingängen wohl ziemlich 
sodass der  Wert ständig an die obere und untere Grenze der Hysterese 
kommt.
Hab es schon mit 100nF Kondensatoren am OP Eingang versucht aber das 
bringt nicht viel. Jetzt will ich versuchen den Mittelwert aus mehreren 
Messungen zu bilden. Leider hab ich noch sehr wenig Erfahrung mit dem 
Programmieren von AVR. Gibt es vielleicht schon eine Assembler-Routine 
dafür oder kann mir jemand helfen eine zu schreiben? Bin für jede Hilfe 
Dankbar!

Gruß, falken
Gast #582984
Lesenswert?

Von wo hast du den Rest des Programmes her, dass du es nicht fertig 
bringst ein paar Werte zu addieren (am besten 2^n) und dann durch die 
Anzahl summierter Messungen zu teilen (bzw. nach rechts zu shiften mit 
lsr)?
In dieser Frage steckt auch schon ein Tipp...
Gast #583004
Lesenswert?

Hi

Ungefähr 3,25 mal !! Was naturlich nicht so einfach geht. In Assembler 
benutzt man vorzugsweise 2er-Potenzen, also 2,4,8,16...1024... .
Einmal Rechtschieben entspricht einer Division durch 2. Vor dem Schieben 
sollte man den Wert 'aufrunden', in dem man z.B. vor einer Division 
durch Acht  4 addiert.

MfG Spess
Persönliche Seite #583017
Lesenswert?

machs am besten so:
du benuzt 2 register

Du addierst auf das erste (nenen wir es R0) deinen Meßwert drauf
Du addierst auf das zweite (nenen wir es R1) das Carry also etwa so:


add r0, meßwert
adc r1, null (null = ein register was die 0 enthält)

dies wiederholst du 256 mal.

Nun hast du im R0 den Mittelwert über 256 Meßwerte.
Alle Regsiter wieder auf 0 setzen --> neue Meßreihe beginnen
Gast #583030
Lesenswert?

Hi

Persönlich würde ich das allerdings über eine gleitende 
Mittelwertbildung realisieren (Ringpuffer+ Pointer). Dadurch bekommt man 
nach dem ersten Durchlauf für jeden Messwert einen Mittelwert.

MfG Spess
Gast #583544
Lesenswert?

Hallo Läubi,

mal ne Frage zur Funktion:

> add r0, meßwert
> adc r1, null (null = ein register was die 0 enthält)
> dies wiederholst du 256 mal.
> Nun hast du im R0 den Mittelwert über 256 Meßwerte.
> Alle Regsiter wieder auf 0 setzen --> neue Meßreihe beginnen

In r0 wird im Prinzip die Summe aller Messwerte erfasst, in r1 die 
Anzahl, sehe ich das soweit richtig? Dann müsste man mit r0/r1 den 
Mittelwert bekommen.
Ich habe da folgende Bedenken/Fragen:
- man kann dann nur solange Werte mitteln, solange r0 nicht überläuft, 
oder?
- warum nicht in einer Schleife r1 mit "inc r1" erhöhen?
- wie funktioniert die Teilung (wenn keine Zweierpotenz)?

Gruß

Fred
Gast #583569
Lesenswert?

Hi

Das Verfahren funktioniert nur mit 8Bit-Werten. Die Addition von 256 
Bytes bleibt innerhalb von 16Bit(2 Register). Im o.g. Fall ist r0 das 
Low-Byte und r1 das High-Byte und nicht der Zähler. Um den Übertrag von
'add r0,meßwert' zu berücksitigen wird das 'adc r1,0' (wobei 0 ein mit 0 
geladenenes Register ist). Rechtsschieben ist nicht notwendig,weil das 
High-Byte einer 16 Bit Zahl dem Ergebnis von 8 mal 16Bit Rechtsschieben 
ist.

MfG Spess
#583630
Lesenswert?

Läubi Mail@laeubi.de wrote:
> machs am besten so:
> du benuzt 2 register
>
> Du addierst auf das erste (nenen wir es R0) deinen Meßwert drauf
> Du addierst auf das zweite (nenen wir es R1) das Carry also etwa so:
>
>
> add r0, meßwert
> adc r1, null (null = ein register was die 0 enthält)
>
> dies wiederholst du 256 mal.
>
> Nun hast du im R0 den Mittelwert über 256 Meßwerte.

Der Mittelwert (ohne Rundungskorrektur) ist in R1, nicht
in R0

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren