IRAM 80c32x2 indirekte Adressierung Fehler

OP #4908179
Lesenswert?

Hallo!

Ich bräuchte einen Rat zu einem merkwürdigen Fehler beim Lesen aus dem 
internen RAM eines 80c32x2 Prozessors.

Ich würde gerne ab Adresse "80h" 80 Byte als LCD-Bildpuffer benutzen. 
Ein Testlauf schlug fehl, das LCD zeigte 80 mal das gleiche komische 
Symbol an. Das nachfolgende Testprogramm gab 80 mal den Wert "80h" bzw. 
"1000000" an einem Ausgangsport an.



Hier das ungefähre Programm:

Zum Beschreiben der 80 Bytes ab IRAM-Adresse "80h":

          MOV R0,#50h        //Zähler für 80d Zeichen
          MOV R1,#80h        //Zeiger auf Start oberes IRAM
          MOV A,#30h
Loop1     MOV @R1,A
          INC R1
          INC A
          DJNZ R0,Loop1

Zum Auslesen und Anzeigen der 80 Bytes ab IRAM-Adresse "80h":

          MOV R0,#50h        //Zähler für 80d Zeichen
          MOV R1,#80h        //Zeiger auf Start oberes IRAM
Loop2     MOV A,@R1
          MOV Ausgabeport,A
          LCALL Parallel_Ausgeben_Unterprogramm
          LCALL Warte_1_Sekunde
          DJNZ R0,Loop2


Ist zu dem "Fehler" etwas bekannt oder mache ich generell etwas falsch ?
OP #4908383
Lesenswert?

Guido B. schrieb:
> In Loop2 fehlt inc R1!

Tut mir leid, ich habe es falsch abgetippt - INC R1 steht im Programm 
selber nach dem MOV A,@R1.
So einen einfachen Fehler hätte ich auch selber gefunden  :-)

Edit: Opcode "09h" hat der INC R1 im Programm direkt nach "F7h" also dem 
MOV A, @R1.

Edit2: ist das nicht seltsam? Gerade diesen Vertipper der den Fehler 
normalerweise verursacht passiert mir ...
#4908456
Lesenswert?

Mir scheints auch richtig.
Mach doch mal so einen Speichertest, ohne die LCD-Routinen.
Vielleicht hast du auch C31-Derivat? Denen fehlt der oberere Speicher.

Tut nichts zum Problem:
H-G S. schrieb:
> MOV R0,#50h        //Zähler für 80d Zeichen

Warum macht man sowas? Hast du die 80d in Hex umgerechnet, um sie im 
Assemblercode als Hex-Zahl zu schreiben und im Kommentar wieder als 
Dezimal, damit man weiss, dass 80d gemeint ist?
mov R0, #80   // Zeichenzähler
wäre hier sinnvoller.
OP #4908479
Lesenswert?

Naugt, ich werde ein Testprogramm schreiben dass nur ein Byte in das 
obere RAM schreibt und wieder ausliest und anzeigt - irgendwie befürchte 
ich aber das Schlimmste ...

Immer diese Probleme!
Erst kurz zuvor musste ich beim ersten LCD-Test feststellen dass ich das 
ganze LCD-Modul verkehrt herum eingebaut/-gelötet hatte - alle Zeichen 
standen auf dem Kopf :-)



Und diese "80" ist leider zufällig die Startadresse des oberen internen 
RAM (als Hex-Wert) sowohl als auch die Größe des LCD-Bildpuffers (in 
Byte) der ja an Adresse 80h im internen oberen RAM beginnt!
OP #4909790
Lesenswert?

So wild ist das händische Assemblieren scheinbar gar nicht!

Man formatiert das Blatt und fängt rechts mit dem Assembler-Programm an. 
Danach macht man links die Opcodes zu den Befehlen, fast alle kann man 
sich von vorhergehenden fertigen Programmteilen klauen - neue Opcodes 
guckt man in der ausgedruckten Opcode-Tabelle nach. Wenn das fertig ist 
füllt man links die Adresszeile aus und ganz am Ende kalkuliert man die 
Sprungadressen der Verzweigungen.

Ich habe über 1000 Byte reingeswitcht mit meinem DIL-Switch-EEPROMmer 
:-)
Einmal war der Chip mit seinen Beinchen nicht mittig im Sockel, da hats 
mir die Bytes quer durch mehrere Unterprogramme verteilt gebrannt - das 
war hart!

Da weiss man wenigstens was man hat, ganz im Gegensatz zu den 
PC-gebundenen Sachen über USB ...

Edit: Einmal muss ich das einfach machen, ich hatte das schon als ich 
jünger war vor ...

Edit 2: Das linke Häkchen heisst "wurde eingeswitcht" und das rechte 
Häkchen heisst "wurde überprüft durch /RD".
Angehängte Dateien:
#4909832
Lesenswert?

H-G S. schrieb:
> Ich habe über 1000 Byte reingeswitcht mit meinem DIL-Switch-EEPROMmer
> :-)

Ja, da lernt man auch gleich richtig zu programmieren und auf Fehler zu 
achten und sie zu vermeiden. ;-)

Auf dem Bild mein Brennwerkzeug. Im Sockel steckt ein RAM auf einer 
Adapterplatine. Damit haben meine damaligen Lehrlinge so ungefähr 
verstanden, was RAM ist ...
Die Widerstände sind z.T. recht Q&D ...


Gruß

Jobst
Angehängte Dateien:
#4910103
Lesenswert?

H-G S. schrieb:
> So wild ist das händische Assemblieren scheinbar gar nicht!

Hast du ja selbst gesehen, wie schnell da ein Fehler passiert! Und 
irgendwo einen einzigen Befehl einfügen und man kann alle Sprungziele 
neu berechnen - neben sinnloser Arbeit auch wieder fehlerträchtig. 
Assembler gibts für jeden Prozessor kostenlos, kann also auch kein 
Argument sein. Was soll's also?? Zu zeigen, dass es geht? Ja es geht, 
aber das war auch vorher klar, aber dann such deine Fehler gefälligst 
auch selber und schreib hier nicht so Scheinproblem hin.
Eigentlich ne Frechheit, was du hier veranstaltest hast.
OP #4910837
Lesenswert?

H.Joachim S. schrieb:
> Assembler gibts für jeden Prozessor kostenlos, kann also auch kein
> Argument sein. Was soll's also?? Zu zeigen, dass es geht? Ja es geht,
> aber das war auch vorher klar, aber dann such deine Fehler gefälligst
> auch selber und schreib hier nicht so Scheinproblem hin.
> Eigentlich ne Frechheit, was du hier veranstaltest hast.

Arghl ... das trifft mich hart  ;-)
Nagut das nächste Mal warte ich 2 Tage bevor ich etwas frage!


@Jobst:
Ich hätte Lust den perfekten, luxurösesten und effektivsten manuellen 
EEPROMmer zu entwickeln ... mit dem sollte es sehr einfach sein schnell 
ganze Programme einzutippen :-)

@Ultramon 8051: Da ist aber kein Witzprogramm mit drin dass einen in den 
Wahnsinn treibt oder ? :-)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren