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
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.
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
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
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
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.
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?
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
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
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!