Archiv verlassen und diese Seite im Standarddesign anzeigen : Kopieren von Daten
Import-Script
11.05.2003, 20:22
Ich komme auf die Lösung des Problems nicht, wie es in A51 aussehen muss, weil wir so ein Beispiel in der Schule leider noch nicht programmiert haben. <BR> <BR>Die Aufgabenstellung lautet: <BR>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? <BR> <BR>ich hoffe mir kann jemand den Quellcode schreiben, weil da gibt es soviele Befehle und ich weis es leider net, wie genau das gehen soll! <BR> <BR>für jede Hilfe vielen Dank!
Import-Script
11.05.2003, 20:46
bei einem µc geht es ja fast nur um verschieben, vergleichen, kopieren, setzen und löschen. <BR>da kann man sich doch etwas zeit nehmen und ein paar befehle anschauen. <BR>was willst du deinen lehrer sagen wenn er eine beschreibung für DEIN programm haben will? <BR> <BR>also, erst selbst versuchen, auch wenn es falsch ist kann man jede menge dazu lehrnen und dann kann man dir helfen deine fehler zu beseitigen. <BR> <BR> <BR> <BR>
Import-Script
11.05.2003, 20:55
kann ich z. B. Startspeicheradresse so abspeichern? <BR>mov progsp, #05000h ; ext. Programmspeicher <BR>mov eram, #09000h ; ext. RAM <BR>mov iram, #090h ; interne RAM <BR> <BR>und dann so um 1 erhoehen? <BR>add progsp, 01h <BR>add eram, 01h <BR>add iram, 01h <BR> <BR>stimmt das so?
Import-Script
11.05.2003, 21:28
Nö, weil der Mov-Befehl nur Bytes kopieren kann, du kannst also maximal nur bis FFh speichern, aber die Richtung ist schon richtig, schau auch mal was MOVX und MOVC können. <BR>Wirst auf jeden Fall das Bündel um die MOV-Befehle brauchen, ein paar Schleifen mit DJNZ etc wären auch hilfreich. Problematisch ist, dass der Controller ständig zwischen dem Kopieren auf das eigentliche Programm zugreifen muss. Wenns auch noch externes ROM und RAM hat, sind die auch noch gemultiplext und gelatcht. <BR>Aber sieh doch mal den dich interessierten Bereich als Tabelle. Dann ließe sich bestimmt was mit MOVC und DPTR machen. Bisschen kniffeln muss auch sein :-) <BR> <BR>Beste Grüße, Marek
Import-Script
11.05.2003, 21:32
um die verschiedene speicher anzusprechen sind: <BR>für externe datenspeicher (ext. RAM) ist MOVX <BR>programmspeicher (ROM) brauchst MOVC <BR>interner speicher mit MOV <BR> <BR>
Import-Script
12.05.2003, 11:26
Hier bei Batronix unter: Know-How / Diverses: Mikrocontroller Technik... ganz unten ist schon mal ein Beispiel. <BR> <BR>Wie man es dann umsetzt siehst Du z. B. im Batronix-Beispielprogramm 'Wecker.asm'. <BR> <BR>Mit z. B.: <BR>MOV DPTR,5000h 'schreibt Adresse 5000h in Datenpointer <BR>MOVX A,@DPTR 'liest den Inhalt von 5000h in Akku <BR> <BR>und zurück z. B.: <BR>MOV DPTR,9000h <BR>MOVX @DPTR,A 'schreibt Akkuinhalt nach 9000h <BR> <BR>Der Datenpointer kann mit INC um eins erhöht werden. <BR>Die Befehle PUSH und POP sichern z. B. 'Zwischenwerte'. <BR> <BR>Das nur so als Beispiel. Soll ja bestimmt so sein in der Schule, dass man selbst nachdenkt. Wenn Du's nicht von anfang an machst wird es später umso schwieriger. <BR> <BR>Gruß Winnie
Import-Script
12.05.2003, 11:57
mein Programm: <BR> org 4100h <BR>start: <BR> mov progsp, #05000h ; ext. Programmspeicher <BR> mov eram, #09000h ; ext. RAM <BR> mov iram, #090h ; interne RAM <BR> mov r1, #10 <BR>loop: <BR> ;dptr mit dem Startwert geladen <BR> mov dptr, progsp <BR> ; Kopieren des Wertes in a <BR> movx a, @dptr <BR> ; Wert des dptr geändert <BR> mov dptr, eram <BR> ; Wert von a in die Speicherstelle kopiert <BR> movx @dptr, a <BR> ; Wert des dptr geändert <BR> mov dptr, iram <BR> ; Wert von a in die Speicherstelle kopiert <BR> movc a, @dptr <BR> ; Speicheradresse um 1 erhöht <BR> inc progsp <BR> inc eram <BR> inc iram <BR> ; Schleifenbedingung <BR> djnz r1, start <BR>end <BR> <BR>ich habe das Programm jetzt mal so geschrieben, weis nicht, ob man das so machen kann? <BR> <BR>Bitte mir sagen, was ich falsch gemacht habe?
Import-Script
12.05.2003, 12:54
Hi! <BR> <BR>So hab mich eben, mal an die Arbeit gemacht (ca 20 min.) und folgendes Proggie entworfen, sollte wohl deine Anforderungen erfüllen. Bin sicher, dass es noch einfacher geht. Enjoy it: <BR> <BR> <BR>;Initialisiere Zeiger auf Datenfeld <BR>MOV dph, #50h <BR>MOV dpl, #00h <BR> <BR>;Initialisiere Zähler <BR>MOV R1, #11d <BR> <BR>;Initialisiere indirekten Pointer auf internes RAM <BR>MOV R0, #90h <BR> <BR>schleife: <BR> ;Lade Akku mit Startwert <BR> MOV A, #00h <BR> <BR> ;Kopiere in Akku den Inhalt der ROM-Tabelle <BR> MOVC A, @a+dptr <BR> <BR> ;Kopiere Inhalt des Akkus in externes RAM <BR> MOVX @DPTR, A <BR> <BR> ;Kopiere Inhalt des Akkus in internes RAM <BR> MOV @R0, A <BR> <BR> ;Erhöhe Zeiger auf nächste ROM-Adresse <BR> INC DPTR <BR> INC R0 <BR>DJNZ R1, schleife <BR> <BR>;und weiter gehts <BR> <BR> <BR>END <BR> <BR>Beste Grüße, Marek
Import-Script
12.05.2003, 15:02
INCLUDE 89c52.mc <BR> <BR>Initialisierung: <BR> <BR>MOV DPTR,#5000h <BR>MOV R0,#90h <BR>MOV R1,#10 'Zaehler für 10 Speicherstellen <BR> <BR>Schreib_int: <BR> <BR>MOVX A,@DPTR <BR>MOV @R0,A <BR>INC DPTR <BR>INC R0 <BR>DJNZ R1,Schreib_int <BR>MOV DPTR,#9000h <BR>MOV R0,#90h <BR>MOV R1,#10 <BR> <BR>Schreib_ext: <BR> <BR>MOV A,@R0 <BR>MOVX @DPTR,A <BR>INC DPTR <BR>INC R0 <BR>DJNZ R1,Schreib_ext <BR> <BR>END <BR>
Import-Script
12.05.2003, 15:54
Hi Winnie! <BR> <BR>Glaube, wir waren beide etwas vorschnelle, habe nicht bereücksichtigt, dass der Kollege ab Adresse 9000h ins externe RAM schreiben will, sondern dachte, dass er einen ROM-Bereich 1 zu 1 ins ext-RAM kopieren will, zu was auch immer *Augenzwinker* <BR>Deine Methode mit getrennten Durchläufen für internes/externes RAM ist hier natürlich die benötigte. Allerdings hast du die Leseroutine aus dem ROM ganz weggelassen, die muss natürlich mit nem MOVC-Befehl erfolgen. <BR>Übrigens, der Schleifenzähler, muss doch mit #11d initialisiert werden, da der DJNZ-Befehl erst decrementier und dann springt, oder eben bei Null nicht springt, die Routinen wären also nur neun Mal durchlaufen worden. Hab in meinem Proggie noch am Ende ne Tabelle eingefügt, um zu überprüfen, was tatsächlich in den RAM gesschrieben wird. Es muss bis einschlielich Speicherstelle xx0Ah beschrieben werden. <BR>So und hier das (hoffentlich nun fehlerfreie) Programm. <BR> <BR>INCLUDE 89c52.mc <BR> <BR>;Initialisierung <BR>MOV DPTR,#5000h <BR>MOV R0,#90h <BR>MOV R1,#11d 'Zaehler für 10 Speicherstellen <BR> <BR>;Leseroutine <BR>lesen: <BR> MOV A, #00h <BR> MOVC A, @a+dptr <BR> MOV @R0, A <BR> INC R0 <BR> INC DPTR <BR>DJNZ R1, lesen <BR> <BR>;Zähler neu setzen und neue Adressen angeben <BR>MOV DPTR, #9000h <BR>MOV R1, #11d <BR>MOV R0, #90h <BR> <BR>;Schreibroutine <BR>schreibe: <BR> MOV A, @R0 <BR> MOVX @DPTR, A <BR> INC DPTR <BR> INC R0 <BR>DJNZ R1, schreibe <BR> <BR>;Probieren obs auch klappt <BR>death_end: <BR>JMP death_end ;und nun verrecke! <BR>org 5000h <BR>;Datenfeld zum testen <BR>DB "ABCDEFGHIJKLMNOPQRSTUVWXYZ" <BR> <BR>END <BR> <BR>Beste Grüße, Marek
Import-Script
12.05.2003, 16:13
Moin! <BR> <BR>Klar kann man das in eine Schleife machen, nur müsste man den Datenpointer immer wieder wechselweise mit 5000h und zum Auslesen des ROM und 9000h zum Beschreiben des RAMs beschreiben. Wie gesagt, viele Wege führen nach ROM, ähm, Rom *g* <BR> <BR>Beste Grüße, Marek
Import-Script
12.05.2003, 16:13
ich bin gerade in Gedanken, das vorgeschlagene Programm durch gegangen und nach meiner Einschätzung müsste es auch so laufen. <BR> <BR>vielen Dank für die Tipps!
Import-Script
12.05.2003, 16:17
Hi! <BR> <BR>Wieso denn nur im Gedanken durchgegangen? Und wieso müsste? Ich habs im Prog-Studio geschrieben und mit dem Debugger ausprobiert, und es LÄUFT. <BR>Helfen gerne, wenns mal klemmt und man nett gefragt wird <img src="http://progshop.com/elektronik/diskussion/clipart/happy.gif" border=0> <BR> <BR>Beste Grüße, Marek
Import-Script
12.05.2003, 16:27
woher bekomme ich das Prog-Studio? <BR> <BR>ist es kostenlos? <BR> <BR>wo kann ich es Downloaden?
Import-Script
12.05.2003, 16:36
Moin, na hier auf den Seiten <img src="http://progshop.com/elektronik/diskussion/clipart/biggrin.gif" border=0> <BR>In der eingeschränkten Version bis 32 Byte ist es kostenlos. Mein Proggie hat erstaunlicherweise genau 31 Byte, würde also noch laufen, wenn man das Datenfeld bei org 5000h weglässt. <BR>Aber du kannst kannst trotzdem dann halt die Werte im Debugger per Hand ändern, z.B. auf NULL setzen und dann schauen ob sie mit FF´s überschreiben werden aus dem Speicherbereich von 5000h. Sonst einfach hier mal weiter fragen. <BR>Aber bei mir läufts. <BR> <BR>Beste Grüße, Marek
Import-Script
12.05.2003, 17:37
noch eine Frage! <BR> <BR>ich habe das Programm jetzt laufen gelassen! Es klappt alles wunderbar! <BR> <BR>bloß wo kann ich das dptr anschauen? was für werte jeweils drin stehen? <BR> <BR>ich habs nirgends gefunden?
Import-Script
12.05.2003, 17:46
Hi, wenn du den Debugger startest, gehen neben dem MC-Editor noch weitere Fenster auf. <BR>Zum einen das gewöhnliche RAM-Register, und Externe RAM, wenn du die verschiebst zur Seite, siehst du das SFR Register. Dort ist der Datenpointer an den Adressen 82h und 83h eingetragen. Evtl. muss du das Fenster unter dem Menüpunkt "Ansicht" oder mit Umschalt+F9 aktivieren. <BR> <BR>Beste Grüße, Marek
Import-Script
12.05.2003, 21:29
Hallo Marek, <BR> <BR>ob er nun aus einem ROM oder RAM liest ist doch egal. Da steht doch nur das aus dem externen Programmspeicher gelesen werden soll. <BR> <BR>Deshalb liest man ja auch kein Datenfeld sondern einfach nur externe Speicherstellen eben mit MOVX und nicht mit MOVC. <BR> <BR>Die Leseroutine habe ich nicht vergessen, sondern nach dem Initialisieren steht die Adresse 5000h im DPTR und deren Inhalt wird über MOVX in den Akku übernommen. <BR> <BR>Der Einfachheit halber habe ich dann dies Inhalte zuerst in die niedrigen (90h) internen Adressen geschrieben. Du hast natürlich recht das man sofort diese Werte auch in die 9000er Adressen schreiben kann, aber wie Du schon sagtest muss dann immer wieder der DPTR umgeschrieben werden. So geht's halt schneller. <BR> <BR>Mit dem Zähler hast Du wohl auch recht, der schreibt einen zu wenig<img src="http://progshop.com/elektronik/diskussion/clipart/blush.gif" border=0>, aber wir müssen doch sparen in Deutschland<img src="http://progshop.com/elektronik/diskussion/clipart/rofl.gif" border=0>. <BR> <BR>Ich meine sogar das Prog-Studio kann mitlerweile 256 Bytes kostenlos. Ist mir auch egal ich hab' die ganze Version.<img src="http://progshop.com/elektronik/diskussion/clipart/happy.gif" border=0> <BR> <BR>Ich bin übrigens bei weitem nicht gut im Proggen und wohl auch als Anfänger zu bezeichnen. Habe zwar alle Sachen schon sehr löange, benutze sie aber sehr selten.<img src="http://progshop.com/elektronik/diskussion/clipart/sad.gif" border=0> <BR> <BR>Gruß Winnie
Import-Script
12.05.2003, 21:35
Uuuppss... <BR> <BR>Das mit dem Zaehler ist völlig falsch. Das ist Hex also 16 dezimal (5000h bis 5010h). <BR> <BR>Peinlich, peinlich aber Marek mach Dir nichts draus. Wer nichts macht macht auch nichts falsch, wir haben uns ja wenigstens Mühe gegeben, gelle.<img src="http://progshop.com/elektronik/diskussion/clipart/rofl.gif" border=0> <BR>
Import-Script
12.05.2003, 22:03
Jo, und letztenendlich funzt des doch, was will man mehr? Schönen Abend noch. <BR> <BR>Beste Grüße, Marek
Powered by vBulletin® Version 4.1.12 Copyright ©2012 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.