mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Assembler durchschnitts berechnung


Autor: Pascal Saner (freakstr)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernd (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pascal Saner schrieb:
> 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.

such dir einen anderen Beruf, Handwerk hat goldenen Boden!

Autor: Pascal Saner (freakstr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wow wie hilfreich....

Autor: hans (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bernd schrieb:
> Handwerk hat goldenen Boden!

Bei solchem Nachwuchs dann nicht mehr lange ;)

hans

Autor: Nils S. (kruemeltee) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das IST eine Informatik-Aufgabe!

Autor: MarioT (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Elektroniker?
Sind das nicht die mit den Lötkolben und Informatiker die die 
Programmieren?

Autor: Pascal Saner (freakstr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Bin übrigens 30ig und arbeite als Software Entwickler! Ich habe 
assembler mit 18 einmal kurz in der Ausbildung gehabt. Wie soll ich 
heute noch wissen wie das geht, wenn man das nie mehr gebraucht hat?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Horst Hahn (horha)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

wo ist das Problem, 16 Werte für i  = 0 bis 15 in einer Reihe an der 
Stelle 0x0500 +i  auf Ergebnis zu addieren und dann Ergebnis durch 
16=2^4 zu teilen ?

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Pascal Saner (freakstr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Vielen Dank, werds mal versuchen. Es geht hier um den R8C / Tiny Series.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pascal Saner schrieb:
> Vielen Dank, werds mal versuchen. Es geht hier um den R8C / Tiny Series.

Damit kannst du das Tutorial schon wieder in die Tonne klopfen - andere 
Baustelle.

Autor: Pascal Saner (freakstr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ja ich muss irgendwie mit mov.b und so arbeiten. Aber schwierig wenn 
mans neu zusammensuchen muss.

Autor: Tim O. (tim_o)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was soll eigentlich passieren, wenn die 16 addierten 8-bit Werte die
8-bit Grenze überschreiten? Einfach so addieren sollte man dann doch
nicht so schnell, oder? ..

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Was soll eigentlich passieren, wenn die 16 addierten 8-bit Werte die
>8-bit Grenze überschreiten? Einfach so addieren sollte man dann doch
>nicht so schnell, oder? ..

Der R8C hat 16-Bit-Register. Da passiert gar nichts.

MfG Spess

Autor: Link zu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Gast1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Ich bin Informatiker

>und habe davon aber keine Ahnung

Sorry, aber das ist irgendwie ein Widerspruch, die Aufgabenstellung 
betreffend. Selbst jemand, der "nur" in den hohen Gefilden der 
theoretischen Informatik wandelt, sollte eine derart trviale 
Aufgabenstellung intellektuell erfassen können. SCNR!

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zumindest den Algorithmus als Pseudo-Code aufschreiben zu können ist 
etwas, das ein theoretischer Informatiker sicherlich drauf haben muss 
:-)

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>> 30ig
Das heißt ausgeschrieben dan dreißigig.
Und was sagt uns das?   :-/

Autor: Martin Vogel (oldmax)
Datum:

Bewertung
2 lesenswert
nicht 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...

Autor: LoL (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Manche haben hier echt die Sozialkompetenz einer Amöbe. Scheinbar 
bekommt man im Job nix auf die Reihe und muss dann hier im Forum (gut 
ich gebe zu die Frage ist etwas "komisch") Leute runterputzen um das 
Selbstwertgefühl etwas zu heben. Echt Armselig.

Autor: Pascal Saner (freakstr)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: magnetus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Pascal Saner schrieb:
> Die Grundidee ist in etwa so, ich mach einen loop der mir 16 Werte ab
> 0510h in das RAM schreibt,

Warum das denn? Ab Adresse 0510h soll das Ergebnis stehen und die 16 
Messwerte stehen angeblich bereits an den Adressen 0500h bis 050Fh zur 
Verfügung.

Gruß,
Magnetus

Autor: Gast 22 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Pascal Saner (freakstr)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke, das Datenblatt hab ich :) Werds heute mittag mal versuchen!

Autor: Martin Vogel (oldmax)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

@oldmax

Der R8C ist ein 16Bit-Controller. Ein einfacher MOV-Befehl 'MOV a,b' ist 
eigentlich leicht zu verstehen. Wenn aber a und b jeweils fast zwanzig 
verschieden Adressierungsarten haben können, kommst du auf ein paar 
hundert verschiedene Möglichkeiten. AVRs sind dagegen sehr einfach 
gestrickt.

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Torsten B. (torty)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi

>Ich hoffe, das hilft

Und jetzt schreibst du das Ganze noch mal in R8C-Assembler.

MfG Spess

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: spess53 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi

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

Deswegen habe ich mich auch zurückgehalten. Ich habe das auch nur 
überflogen. Ist eigentlich kein Problem.

MfG Spess

Autor: m16c_er (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
hier mal eine Lösung für den M16C,zum laden/ausführen mit dem Monitor
(umbenennen in .scr und mit dem Script-Window laden).
Daher auch keine init. des SP etc., macht halt der Monitor.
Die Routine DURCH16 steht am Anfang, weil sonst der Line-Assembler das 
Lable nicht kennt.

Autor: m16c_er (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
http://www.renesas.eu/products/tools/evaluation_so...
hier gibt es auch einen Simulator für 60 Tage.

Autor: Gast2 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie wärs bei sowas einfach mal die Aufgaben C programmieren und sich 
dann das Listing bzw. Dissasembly anschauen...auf die einfachste Lösung 
kommt wohl keiner ;-).

Autor: spess53 (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Hi

>Wie wärs bei sowas einfach mal die Aufgaben C programmieren und sich
>dann das Listing bzw. Dissasembly anschauen...auf die einfachste Lösung
>kommt wohl keiner ;-).

Das Ganze lässt sich, grob geschätzt, mit 10...15 Assemblerbefehlen 
realisieren. Wenn du dafür C und den Disassembler brauchst. Na,ja.

MfG Spess

Autor: Srele (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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.