Programmierung eines Assemblerprogramms

Gast #29086
Hallo

ich habe eine Aufgabenstellung für eine Programmierung eines 
Mikrocontrollers von einem Lehrer bekommen zur Prüfungsvorbereitung. 
Sowas haben wir bis jetzt noch nicht im Unterricht gemacht.

Die Aufgabenstellung lautet:
Schreiben Sie ein kurzes Kopierprogramm, das den Inhalt des ext. 
Programmspeichers (Adresse 5000h bis 5010h) sowohl in das externe RAM 
(ab Adresse 9000h), als auch in das interne RAM (ab Adresse 90h) 
speichert. Quellcode?

ich hoffe mir kann jemand dieses Programm schreiben, weil ich nicht 
genau weis, wie ich die Daten kopieren soll!

Vielen Dank im Voraus!

Bis dann

Benjamin
Gast #29089
Wir haben sowas noch nie Programmiert im Unterricht, deshalb frage ich 
ja, sonst würde ich auch nicht fragen, wenn ich es schon könnte!
Gast #29090
und wer machts dir, wenn du in der Prüfung sitzt? Es nützt dir wirklich 
nichts, wenns dir einer hier macht (was ich bezweifle). Die Aufgabe ist 
doch dafür da, daß du dich selbst damit beschäftigst, der Weg ist das 
Ziel, nicht das Ergebnis. Nur wenn du es selber machst, wirst du es 
verstehen.
Gast #29091
OK Benjamin,

das Progamm schreiben lassen gilt nicht!!!  Aber hier gibts nicht nur 
schlaue Sprüche, sondern auch Hilfe.

Das Kopieren ist eigentlich ganz einfach.

In dem Datenblatt des Mikrokontrolers suchst Du nach einem Befehl, mit 
dem Du den Inhalt einer Speicherzelle in einen Akku oder eine Hilfszelle 
übertragen kanst. Wenn Du einen solchen Befehl gefunden hast, findest Du 
auch den, mit dem man den Inhalt wieder in eine Speicherzelle 
zurückschreiben kann.
Nun ist eine Speicherzelle kopiert, da Du eine Zelle auslesen und an 
eine andere Position wieder zurückschreiben kannst.
Für den Rest der Arbeit, baust Du eine Schleife drum herum - FERTIG!

GRUSS    INGO
Gast #29092
gut

dann probier ich es mal aus!

kann ich z. B. Startspeicheradresse so abspeichern?
mov progsp, #05000h ; ext. Programmspeicher
mov eram, #09000h ; ext. RAM
mov iram, #090h ; interne RAM

und dann so um 1 erhoehen?
add  progsp, 01h
add eram, 01h
add iram, 01h
Gast #29093
kann mir das niemand beantworten, ob das Beispiel, wo ich da aufgeführt 
ist, richtig ist, oder ob es da noch ein anderes Schlüsselwort dafür 
gibt?
Gast #29095
Was issen das fürn Lehrer, der ohne jedwege Vorbereitung so etwas 
verlangt?
Tipp: Mit einem 51er muß man mit speziellen Befehlen auf den externen 
Speicher zugreifen. Der Controller ist ein 8-bitter - die Adresse ist 16 
Bit lang. Pfeif Dir mal, wie schon vorgeschlagen, den Befehlssatz rein. 
Suche nach (dem einzigen) Register, das 16 Bit adressieren kann. 
Konkrete Fragen bekommst Du dann beantwortet.
Gast #29096
mein Programm:
org 4100h
start:
mov progsp, #05000h ; ext. Programmspeicher
mov eram, #09000h ; ext. RAM
mov iram, #090h ; interne RAM
mov r1, #10
loop:
;dptr mit dem Startwert geladen
mov dptr, progsp
; Kopieren des Wertes in a
movx a, @dptr
; Wert des dptr geändert
mov dptr, eram
; Wert von a in die Speicherstelle kopiert
movx @dptr, a
; Wert des dptr geändert
mov dptr, iram
; Wert von a in die Speicherstelle kopiert
movc a, @dptr
; Speicheradresse um 1 erhöht
inc progsp
inc eram
inc iram
; Schleifenbedingung
djnz r1, start
end

ich habe das Programm jetzt mal so geschrieben, weis nicht, ob man das 
so machen kann?

Bitte mir sagen, was ich falsch gemacht habe?
Gast #29097
Das Problem sind die Variablen  progsp, eram, iram.
Diese sind 16bit lang, aber der 51 kann nur 8bit. Also funktioniert das 
so nicht.
Ich würde die Adressen erhöhen, wenn der Wert im dptr ist, denn so kann 
der Mikrocontroller direkt einen 16bit Wert verarbeiten.
Die 16 bit Werte kann man auf 2 Bytes verteilen. Dazu dient DPH und DPL 
(High und Low Byte des dptr).
Für den internen RAM reicht ein einzelnen Byte aus, hier verwendet man 
normalerweise R0 oder R1

Der Anfang des Programms sieht dann so aus:

org 4100h
start:

mov progsph #50h
mov progspl, #00h ; ext. Programmspeicher

mov eramh, #90h
mov eraml, #00h ; ext. RAM

mov r0, #90h ; interne RAM
mov r1, #10
loop:

;dptr mit dem Wert geladen
mov dpl, progspl
mov dph, progsph

; Kopieren des Wertes in a
movx a, @dptr

inc dptr
; Wert des dptr geändert

mov progspl, dpl
mov progsph, dph
; geänderter Datenpointer sichern

mov @r0, a
inc r0

;dptr mit dem Wert geladen
mov dpl, eraml
mov dph, eramh

; Kopieren des Wertes in a
movx @dptr, a

inc dptr
; Wert des dptr geändert

mov eraml, dpl
mov eramh, dph
; geänderter Datenpointer sichern
Gast #29098
Hi Bejamin!

Erstmal, ich kenne mich mit dem Befehlssatz des A51 nicht aus. Sieht 
aber gut aus, müßte so funktionieren und ist sauber programmiert und 
kommentiert.

Werden die variablen Register progsp,eram,iram,rl irgendwo definiert? 
Beim AVR muß man da immer die Registeradresse zuweisen. a ist, nehme ich 
an, der Akkumulator, und dptr der Datenzeiger, die müßten schon so 
vorgegeben sein. Gibt es den Befehl end in dieser Form?

Ansonsten, finde ich gut, wie Du in wenigen Stunden von "Hilfe! Schreibt 
mir das mal jemand" zu "Mein Programm" gekommen bist. Glückwunsch.

Sven
Gast #29099
Danke für eure Antworten!

manchmal will der Compiler den END, manchmal auch nicht, das ist halt 
so!

das ist richtig das a, der Akkumulator und dptr der Datenzeiger ist.

Aber jetzt müsste der Mikrocontroller das nur noch ausführen, wenn ich 
einer daheim hätte so kann ich es halt nicht ausprobieren, ob eine 
Lösung so funktionieren würde.

Vielleicht bekomme ich noch eine Lösung vom Lehrer. Ich habe ihn mal 
eine Mail geschrieben und darum gebeten eine Lösung zu versenden um es 
zu vergleichen, weil die Lösung von Benno könnte auch richtig sein, weil 
ich das nicht genau weis mit den 16 und 8 Bit, ob das der Compiler so 
nimmt!

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 23 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.