Forum: Mikrocontroller und Digitale Elektronik Programmierung eines Assemblerprogramms


von Benjamin Gaus (Gast)


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

von Benjamin Gaus (Gast)


Lesenswert?

habe noch was vergessen in A51!!!!

von Oberlehrer (Gast)


Lesenswert?

Das ist die beste Prüfungsvorbereitung!
Schlau, voll schlau!

von Benjamin Gaus (Gast)


Lesenswert?

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!

von crazy horse (Gast)


Lesenswert?

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.

von Ingo (Gast)


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

von Benjamin Gaus (Gast)


Lesenswert?

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

von Benjamin Gaus (Gast)


Lesenswert?

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?

von Peter D. (peda)


Lesenswert?

Du solltest Dir erstmal den 8051-Befehlssatz ansehen, welche Operationen 
es überhaupt gibt und wie auf die verschiedenen Speicherbereiche 
zugegriffen wird.

Und dann Googeln und es finden sich Programmbeispiele zuhauf, z.B.:

http://www.specs.de/users/danni/appl/soft/xcopy/index.htm


Peter

von thkaiser (Gast)


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.

von Benjamin Gaus (Gast)


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?

von Benno (Gast)


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

von Sven (Gast)


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

von Benjamin Gaus (Gast)


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!

von Peter D. (peda)


Lesenswert?

Simuliers doch einfach, z.B. damit:

http://spot.fho-emden.de/ftp/micro/sim51_04.zip


Peter

von Benjamin Gaus (Gast)


Lesenswert?

ich habe jetzt schon das PROG-Studio runtergeladen und es klappt 
wunderbar damit!

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
Noch kein Account? Hier anmelden.