Assembler durchschnitts berechnung

#1666699
Lesenswert?

Hallo,

ich muss eine Aufgabe lösen und habe keine Ahnung wie das geht.

Hier die Aufgabe:

Sie haben mit dem Analog-Digitalwandler eine Serienmessung mit 16 8-Bit 
Werten gemacht. Die Werte sind im RAM ab Adresse 0500h gespeichert. 
Errechnen Sie nun den Durchschnitt aus diesen 16 Werten und speichern 
Sie das Resultat ab Adresse 0510h.

(geben Sie den Adressen sinnvolle Namen und arbeiten Sie mit diesen)


Kann das jemand? Ich bin Informatiker und sitze aber ausnahmsweise in 
der Elektroniker klasse und habe davon aber keine Ahnung. Anscheinend 
soll es sehr einfach sein.
#1666750
Lesenswert?

Pascal Saner schrieb:
> Bin übrigens 30ig und arbeite als Software Entwickler! Ich habe
> assembler mit 18 einmal kurz in der Ausbildung gehabt.

Dann hast du mit Sicherheit einen anderen Assembler gehabt. Damals gab 
es noch keine AVR. Oder reden wir gar nicht von AVR?
Denn damit fängt es erst einmal an: Für welchen Prozessor, welcher 
Assembler? Soviel solltest du schon noch wissen, dass Assembler die 
Maschinensprache des Prozessors ist und daher immer an die CPU gekoppelt 
ist, für die man schreibt.

> Wie soll ich
> heute noch wissen wie das geht

Genauso wie in einer Hochsprache auch.
Alle 16 Werte addieren und dann durch 16 dividieren

Hinweis: Zum Addieren lädt man einen Wert nach dem anderen aus dem 
Speicher und summiert in einem Register laufend auf.

Hinweis 2: Eine Division durch 16 ist bei Ganzzahlarithemtik identisch 
zu einem Schieben um 4 Bitpositionen nach rechts.

> wenn man das nie mehr gebraucht hat?

Dein Lehrer wird ja nicht bei der Tür reingekommen sein und noch bevor 
er seinen Stoff vorgetragen hat, euch diese Aufgabe gestellt haben. Von 
einem Informatiker erwarte ich mir schon, dass er mit der Hilfe von 
Online-Tutorial und Instruction Set Summary zumindest mit einer Lösung 
hoch kommt, die nahe drann ist.
Gast #1666983
Lesenswert?

Tim O. schrieb:
> Was soll eigentlich passieren, wenn die 16 addierten 8-bit Werte die
> 8-bit Grenze überschreiten?
Dann hast du einen Überlauf, für sowas prüft man das Overflow-Flag...

Grundsätzlich weiß man ja, in welchem Zahlenbereich die Werte liegen 
können (Minimum und Maximum) und stellt sich darauf ein.

Hier geht es um einen anscheinend 16-Bit-Mikrocontroller und addiert 16 
8-Bit-Werte, also liegt das Maximum bei 4080 (255*16), da sollte es 
keine Probleme geben.
#1667124
Lesenswert?

Hi
Auch wenn's nicht hilfreich ist....
>Kann das jemand? Ich bin Informatiker und sitze aber ausnahmsweise in
>der Elektroniker klasse und habe davon aber keine Ahnung.
Verlaufen ? oder rausgeflogen ?
>Anscheinend soll es sehr einfach sein.
Na ja, wenn's einfach ist, weil das ja Elektroniker können.....
>Bin übrigens 30ig und arbeite als Software Entwickler!
Ausrufezeichen nicht übersehen.. Was soll das heißen, mit 28 aufgehört 
zu denken ? Ich bin übrigends 59 und habe Assembler zu Zeiten deiner 
Geburt gemacht. Aus Spaß, wohlgemerkt, denn gelernt habe ich 
Elektroinstallateur. Glaubst du, es ist nach so langer Zeit gelöscht ? 
Mit nichten, vor einem Jahr hab ich's wieder ausgegraben, um mit AVR's 
zu arbeiten... geht immer noch ! ( und jetzt ein Ausrufezeichen)
Mir scheint, du willst hier nur deine Hausaufgaben gemacht bekommen. 
Bleib schön hartnäckig, und es gibt ja auch noch andere Foren.....
Und jetzt kommen wir mal zu dem Begriff "hilfreich". Was glaubst du, 
warum du diese (einfache) Aufgabe bekommen hast? Weil dein Lehrer es 
gern wissen möchte und es selbst nicht kann ? Ziel deiner Ausbildung 
sollte doch in Zukunft der Einsatz im erlernten Gebiet sein. Was glaubst 
du, was dein Chef mit dir macht, wenn er herausbekommt, das du bei 
einfachen Aufgaben als "Softwareentwickler" das Handtuch schmeißt? Der 
Hinweis: "Such dir ein anderes Handwerk " wird von mir voll unterstützt. 
Da gibt's doch bestimmt was, wo du nicht unbedingt irgendeinen 
Mittelwert bilden mußt.
Gruß Oldmax, der über soviel Unwissen nur noch den Kopf schütteln 
kann...
#1667140
Lesenswert?

Ihr versteht das völlig falsch, oder zumindest einige von euch. 
Natürlich weiss ich in etwa wie das geht. 16 Zahlen addieren und durch 
16 Teilen usw...

Aber ich weiss die Befehle im Assembler nicht um damit arbeiten zu 
können!

Die Grundidee ist in etwa so, ich mach einen loop der mir 16 Werte ab 
0510h in das RAM schreibt, dann addiere ich diese und teile sie durch 
16.

Aber wie oben schon erwähnt, weiss ich nicht genaue wie ich das mit den 
Befehlen machen muss.

Wenn ihr doch nur was zu meckern habt, dann gebt doch einfach keine 
Antwort.
Gast #1667158
Lesenswert?

Hi

>Aber wie oben schon erwähnt, weiss ich nicht genaue wie ich das mit den
>Befehlen machen muss.

Die notwendigen Befehle sind recht überschaubar: ADD,SHL,MOV evtl. ADC.

Wichtiger ist wahrscheinlich erst mal die Adressierungsarten zu 
verstehen.
Hier dürften auch geübte AVR-Assembler-Programmierer (mich 
eingeschlossen) eine Weile zu tun haben.

MfG Spess
Gast #1667168
Lesenswert?

Die Befehle in Assembler sind als eine Art "Dienstanweisung"
zu verstehen. Wie die nun ganau heißen, ist Prozessorabhängig,
bzw. Assemblerabhängig.
Da hilft nur eines:
Den entsprechenden Befehlssatz beschaffen (Datenblatt Prozessor)
und nachsehen was "tut" welcher Befehl.
Und die (benötigten) Befehle heraussuchen, die die gewünschte Funktion
erfüllen, manchmal aber nur mit Umweg.

Logisch, vorher muß an wissen was man will.

Wenn Du keinen Assembler hast, über lege halt wie es z.B. gehen könnte:
Speicherzelle adressieren,
auslesen in den "Akku" (Rechenregister)
nächste Speicherzelle adresieren
zu dem im Akku abgelegten Wert addieren
(ggf. vorher in anderes Regfister laden wenn direkt add nicht geht)
usw. usw.
#1667229
Lesenswert?

Hi
Ein Tipp:
In der Regel kann man an der Mnemonik doch einiges herauslesen, bzw. den 
Befehl erkennen. Assembler ist halt nix anderes, wie das Arbeiten mit 
Speicherzellen, Registern und ein paar binären mathematischen 
Funktionen. Du hast dabei die Möglichkeit, das kostenlose AVR-Studio zu 
Hilfe zu nehmen. Darin kannst du auch dein Programm simulieren und 
Ergebnisse prüfen. Da diese Aufgabe weder Interrupt noch sont wie 
Information außerhalb des Programmes erfordert, kanst du die 16 Werte in 
den Speicherbereich schreiben, deine Assemblerroutine und das ganze im 
Singlestep ansehen.
Tja, Assembler erlaubt eben nicht einfach :
mittelwert=(x1+x2+x3+x4+x5+x6+x7+x8+x9+x10+x11+x12+x13+x14+x15+x16)/16

Nebenbei, ich habs nicht nötig, irgendwie andere fertig zu machen, doch 
die Aussage, ich sitze versehentlich in einer Elektronikerklasse und da 
wird etwas gefordert, was ich als Informatiker nie nich brauche... also, 
ehrlich... auch die restlichen Äußerungen sind schon nahe an der 
Grenzeder Dreistigkeit. Ich hab mit meinen 59 Jahren meine berufliche 
Laufbahn längst beendet, aber wenn ich mir vorstelle, ich erarbeite mir 
mein Wissen schwer, und dann kommt ein Kollege und hat schon bei 
kleineren Aufgaben Probleme, holt sich evtl. noch die Info von mir um 
dann stolz das Resultat zu präsentieren.... wie gesagt, ich hab da keine 
Angst vor un wär die Frage gewesen: "Mittelwert mit Assembler, Ansätze 
zur Lösung gesucht", hätt ich mit Hilfestellung kein Problem.
Gruß oldmax
#1667275
Lesenswert?

Wobei das hier sicherlich eine Übung in den Adressierungsarten ist. Das 
Mittelwert rechnen kann ja nicht das eigentliche Problem sein :-)

Es geht halt darum, wie adressiere ich eine Abfolge von Bytes, wenn ich 
deren Startadresse habe.
Bei einem AVR ürde man das über den Z-Pointer (r30/r31) (oder X-Pointer 
oder Y-Pointer machen) und mit einem lpm r16,Z+ holt man sich die Werte. 
Bei einem Z80 kommt die Startadresse nach HL und über einen LD C,(HL) 
holt man sich den Wert um ihn dann zu A zu addieren und dann HL erhöhen. 
Bei einem R8C muss man sich dann eben im Datenblatt den Befehl 
raussuchen, der es ermöglicht einen Wert aus dem Speicher zu holen, wenn 
die Adresse in einem Register steht. Vielleicht muss die Adresse in 
speziellen Registern sein (wie beim AVR oder beim Z80), vielleicht auch 
nicht. Vielleicht könnte man beim Lehrer Punkte mit einer unorthodoxen 
Lösung sammeln (Stackpointer auf das Ende der Daten und dann Poppen). 
Aber an sich ist die Aufgabe nicht wirklich schwer.

Was ich aber nicht glauben kann/will: Dass im Unterricht mit keiner 
Silbe auf Adressierungsarten eingegangen wurde. Wenn Elektroniker damit 
Schwierigkeiten haben, gut. Aber ein Informatiker? Das ist nichts 
anderes als ein Zugriff über Pointer, nur eben auf Assemblerebene. Von 
daher glaube ich nicht daran, dass euer Lehrer einfach nur sagt: mach 
mal.

(Und ja. Mein letztes Z80 Assemblerprogramm habe ich vor 20 Jahren 
geschrieben. Aber die wichtigsten Befehle weiß ich immer noch und wie 
das mit den weniger esoterischen Adressierungsarten funktioniert)

       LD   HL, 0x0500
       LD   B, 16
       LD   A, 0
LOOP:  LD   C,(HL)
       INC  HL
       ADD  A, C
       DJNZ LOOP

       LD   (0x0510), A

(War jetzt zu faul für 16 Bit Arithmetik)
#1667288
Lesenswert?

_Mittelwert_10Bit:  ;SummeH = temp3 SummeL = temp2
    push ZL
    push ZH        ;Pointer sichern

    ldi ZH,high(SRAM_START)    ;lade Pointer (Anfang Ringspeicher)
    ldi ZL,low(SRAM_START)

    ld Pressure_DATAL,Z+    ;lade ersten 16 Bit Wert
    ld Pressure_DATAH,Z+    ;lade ersten 16 Bit Wert
AddOn:
    ld temp,Z+      ;lade nächsten 16 Bit Wert
    ld temp1,Z+      ;lade nächsten 16 Bit Wert

    add Pressure_DATAL,temp    ;alle 16 bit Werte aufaddieren
    adc Pressure_DATAH,temp1

    cpi ZL,SRAM_START+SampleMenge*2  ;prüfe, ob alles aufaddiert ist
    brlo AddOn

    ldi temp,0      ;temp für Divison (LSR) auf Null
DivOn:
    lsr Pressure_DATAH    ;16 Bit Division durch "Schieben & Rotieren"
    ror Pressure_DATAL

    inc temp

    cpi temp,3      ;3 für 8 Messwerte
    brlo DivOn


    pop ZH
    pop ZL

    ret




16Bit Mittelwert.

Ich hoffe, das hilft
#1667340
Lesenswert?

spess53 schrieb:
> Hi
>
>>Ich hoffe, das hilft
>
> Und jetzt schreibst du das Ganze noch mal in R8C-Assembler.

LOL
Da bleibt ja dann für den TO nichts mehr übrig

Aber das PDF ist gut. Da haben wir es ja schon.
Abschnitt 2.4 Special Instruction Adressing (Seite 45)

ganz unten: 32 Bit Adress Register Indirect
zu verwenden mit den Instructionen LDE und STE
Gast #4064417
Lesenswert?

Ich habe einige Mühe bei der Aufgaben 1.1, 1.2,1.3,und 1.4

Kann mir jemand die lösen oder helfen??



1.1 Wie wird in Assembler eine 8-Bit Konstante in die Adresse 0500h 
geschrieben??

1.2 Wo und wie ist nach dem Assemblerbefehl DIV.W das Resultat 
abgespeichert??

1.3 mov.b #012h,0410h
    xor.b #022h,0410h
Welcher Wert steht nach diesen beiden Befehlen in der Adresse 0410h??

1.4 Welcher Wert steht im R1L nach dieser Sequenz??
    mov.w #0520h,A1
    mov.w #0aa55h,0520h
    mov.b (A1),R1L

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