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.
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!
Elektroniker? Sind das nicht die mit den Lötkolben und Informatiker die die Programmieren?
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?
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.
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 ?
Vielen Dank, werds mal versuchen. Es geht hier um den R8C / Tiny Series.
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.
Ja ich muss irgendwie mit mov.b und so arbeiten. Aber schwierig wenn mans neu zusammensuchen muss.
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? ..
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
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.
>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!
Zumindest den Algorithmus als Pseudo-Code aufschreiben zu können ist etwas, das ein theoretischer Informatiker sicherlich drauf haben muss :-)
>>> 30ig
Das heißt ausgeschrieben dan dreißigig.
Und was sagt uns das? :-/
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...
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.
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.
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
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
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.
Danke, das Datenblatt hab ich :) Werds heute mittag mal versuchen!
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
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
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)
_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
Hi
>Ich hoffe, das hilft
Und jetzt schreibst du das Ganze noch mal in R8C-Assembler.
MfG Spess
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
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
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.
http://www.renesas.eu/products/tools/evaluation_software/evaluation_software_mid_level_landing.jsp hier gibt es auch einen Simulator für 60 Tage.
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 ;-).
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
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
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.