Hallo, ich möchte gern aus ca. 5-10 Werten die im RAM eines ATMEGA 16 einen 8 Bit Mittelwert bilden. Wie stelle ich das am besten an. Gibt es da elegante methoden. ich habe das momentan mit vorher Register mit Ram laden und dann mit lsr temp1 lsr temp2 add temp1,temp2 gemacht bei 10 Werten kommt das ganz schön was an code zusammen ich suche nach einer eleganteren Methode Könnt Ihr helfen? Mfg René
Hi René, sinnvoller scheint es, die Werte erst aufzuaddieren, dann durch deren Anzahl zu dividieren. Lies die Werte doch über X, Y oder Z indirekt ein. Ich gehe dabei davon aus, dass die Werte hintereinander im RAM liegen und bei Adresse data anfangen. Optimal sollte ANZAHL=2_hoch_n sein #define ANZAHL 10 .def suml r20 .def sumh r21 .def null r0 .dseg .org SRAM_START data: BYTE ANZAHL .cseg .org DEINE_ANFANGSADRESSE ;..... anderer Code hier clr null ; ist auch für andere Zwecke später zu gebrauchen! ;..... anderer Code hier mittelw: ldi r16, ANZAHL clr sumh clr suml ldi XL, low(data) ldi XH, high(data) lp: ld r17, X+ add suml,r17 adc sumh,null dec r16 brne lp ; jetzt suml/sumh "nur" noch durch ANZAHL dividieren...... ; (vielleicht bei 7-10 Werten durch eine Division durch 8 (3* ; Rechtsshift) annähern (?) -- sonst bleibt Dir nur die "echte" ; Divisionsroutine (ist von Atmel in Dokument "AVR200" ; beschrieben) asr sumh ror suml asr sumh ror suml asr sumh ror suml Gruß Fred
P.S. Bei 10 Werten kommst Du bei der Mittelwertbildung natürlich nicht um eine "echte" Division herum. Du musst überlegen, ob Du es einrichten kannst, 2_hoch_n Daten zu haben, oder hinnehmen, dass Du bei 10 addierten Werten und nachfolgender Division durch 8 eben ein 9 Bit Ergebnis bekommst -- oder hinnehmen, eine 16 Bit durch 8 Bit Divisionsroutine einzusetzen.
>Mittelwert bilden. Wie stelle ich das [...] an.
Die Werte einfach addieren und durch die Anzahl der Werte teilen. Ferig!
>vielleicht bei 7-10 Werten durch eine Division durch 8 (3*
; Rechtsshift) annähern (?) -- sonst bleibt Dir nur die "echte"
Nimm acht Wert für deinen Mittelwert wie Fred S. (fredhs) es gezeigt
hat.
Wenn du nach der Division durch 8 (3mal rechtsschieben) das carry noch
dazu addierst, dann hast du gleich noch gerundet
Hallo, sorry das können auch 12 oder mehr Werte sein wenn es die Sache vereinfacht umso besser.
@ René (Gast) >sorry das können auch 12 oder mehr Werte sein wenn es die Sache >vereinfacht umso besser. Dann nimm 16, ist viermal rechts schieben. MFG Falk
wo kommen deine Werte her für die du einen Mittelwert bilden willst evtl. vom AD-Wandler? Dann könntest du nämlich auch einen RC-Filterglied nehmen. Wobei es in Software komfortabler wäre wenn man da nach verschiedenen Bedingungen die Mittelwertbildung verändern will.
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.