Forum: Mikrocontroller und Digitale Elektronik Programm für PIC18F4420


von Mark R. (rammi)


Lesenswert?

Hallo, ich bräuchte mal hilfe bei einer Aufgabe. Zuvor habe ich mit 
einem 8051 gearbeitet. Jetzt versuche ich den Umgang mit einem PIC zu 
lernen. Ich steige aber nicht durch
Programmieren Sie ein Assembler Programm, welches einen Datenblock 
(20kB) im Internen Datenspeicher von Adressse 0x0 nach Adresse 0x80 
kopiert. Kodieren sie die Kopierfunktion in ein Universelles Programm, 
welches die Parameter (Blocklänge und Adresse) in geeigneten Registern 
übergeben bekommt.

Vielen Dank für die Hilfe

von Dieter W. (dds5)


Lesenswert?

Da muss ein Missverständnis oder Tippfehler vorliegen, dieser PIC hat 
nur 768 Byte Datenspeicher, damit lassen sich keine 20kB kopieren.

von Stephan S. (uxdx)


Lesenswert?

In der 18er-Serie der PICs gibt es keinen einzigen Chip, der mehr als 4 
kByte RAM hat. Für 20 kByte und mehr musst Du schon auf PIC24xxx oder 
PIC32xxx ausweichen.

von rammi (Gast)


Lesenswert?

Morgen, danke erst einmal für die Schnelle Auskunft. Wie wäre denn die 
generelle Vorgehensweise einen Datenblock zu kopieren?
Bei dem 8051 hat man mit ISEG AT zuerst speicherplatz reserviert und 
dann in einer schleife daten an eine Adresse geschrieben und 
anschließend mit dem Datenpointer an Adresse X kopieret.
Könnten Sie mir ein Programm beispiel geben?
Mit freundlichen Grüßen
rammi

von tt2t (Gast)


Lesenswert?

> Wie wäre denn die generelle Vorgehensweise einen Datenblock zu kopieren?

hast Du denn schon mal irgendwas programmiert?

-------------------------------------------------------
Variante 1 (für Hochprachen):

1 variabler Pointer, 2 Basisadressen (source und target)
Start mit Pointer=0

lese Data von Source+Pointer (+ steht für plus)
schreibe Data nach Target+Pointer
incrementiere Pointer
Ende erreicht ?
wenn nein, dann von vorne

z.B. mit DO-LOOP oder FOR-NEXT

-------------------------------------------------------
Variante 2 (macht man eher in Assembler):

1 variabler Pointer, 2 Basisadressen (source und target)
Start mit Pointer=Endpointer

lese Data von Source+Pointer (+ steht für plus)
schreibe Data nach Target+Pointer
incrementiere Pointer
Pointer=0 ?
wenn nein, dann von vorne

-------------------------------------------------------
Die 2. Variante macht man in Assembler lieber, weil die Nullabfrage da 
etwas einfacher ist als die Pointer=Wert Abfrage, das sind aber 
Marginalien (1-2 Befehle weniger).

von tt2t (Gast)


Lesenswert?

KORREKTUR - KORREKTUR - KORREKTUR - KORREKTUR

in der 2. Variante muss es natürlich "DECREMENTIERE Pointer" heissen

von Rainer Unsinn (Gast)


Lesenswert?

Mark Rammenstein schrieb:
> welches einen Datenblock
> (20kB) im Internen Datenspeicher von Adressse 0x0 nach Adresse 0x80
> kopiert

tt2t schrieb:
> Variante 1 (für Hochprachen):
> 1 variabler Pointer, 2 Basisadressen (source und target)
> Start mit Pointer=0
> lese Data von Source+Pointer (+ steht für plus)
> schreibe Data nach Target+Pointer
> incrementiere Pointer
> Ende erreicht ?
> wenn nein, dann von vorne
> z.B. mit DO-LOOP oder FOR-NEXT

Wenn der Datenblöck größer ist als der Abstand von Source zu Target, 
dann überschreibt man irgendwann den Source-Bereich. Das kann man 
umgehen, indem man mit dem letzten Byte anfängt und die Pointer 
decremetiert.

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.