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
Das ist die beste Prüfungsvorbereitung! Schlau, voll schlau!
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!
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
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?
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!
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.