www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Programmierung eines Assemblerprogramms


Autor: Benjamin Gaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benjamin Gaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
habe noch was vergessen in A51!!!!

Autor: Oberlehrer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist die beste Prüfungsvorbereitung!
Schlau, voll schlau!

Autor: Benjamin Gaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: crazy horse (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ingo (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benjamin Gaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benjamin Gaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: thkaiser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Benjamin Gaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Benno (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Sven (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Benjamin Gaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Simuliers doch einfach, z.B. damit:

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


Peter

Autor: Benjamin Gaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich habe jetzt schon das PROG-Studio runtergeladen und es klappt 
wunderbar damit!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.