Programmierung eines Assemblerprogramms

Gast #29086
Lesenswert?

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 #29091
Lesenswert?

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 #29095
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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
Lesenswert?

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

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