Forum: Mikrocontroller und Digitale Elektronik Datenpointer Microcontroller


von Matthias (Gast)


Lesenswert?

Hallo,

Bin dabei mit meinem Microcontroller eine LED Matrix anzusteuern. Nun
werden meine Daten aber so groß das sie langsam unübersichtlich werden.
Ich weiß es gibt einen Datenpointer, aber ich weiß nicht wie ich diesen
richtig ansprechen soll. Kann mir da bitte einer helfen

Danke schon im voraus für die hilfe

von Ulrich (Gast)


Lesenswert?

Assembler oder C ?

von Matthias (Gast)


Lesenswert?

Hallo Ulrich,

ich wollte es in Assembler versuchen. Ein Kollege der mir dabei ein
wenig hilft wollte dies in C programmieren. Wenn du eine Idee hast. Ich
nehme alles.

Danke für deine schnelle ANtwort

von Markus_8051 (Gast)


Lesenswert?

Welcher µC?

von TheForce (Gast)


Lesenswert?

http://www.mikrocontroller.net/forum/read-1-63156.html#new

Schau dir den Beitrag von crazy_horse (hätt fast crazy_hores
geschrieben...:]) an.

von Ulrich (Gast)


Lesenswert?

Warst du schon auf dieser Homepage?

http://www.avr-asm-tutorial.net

Da war das so gut für mich erklärt das ich damit mir problemlos bereits
einen Rinpuffer bauen konnte.

von Matthias (Gast)


Lesenswert?

Hallo Markus_8051,

um deine Frage zu beantworten ich benutze den AT89S8252. Ich benutze
diesen, da ELEKTOR dazu ein Entwicklerboard herausgebracht hat.

Hallo TheForce,

Danke für den link, aber diese Befehle sagen mir überhaupt nichts.
Wie ein paar Zeile höher schon gesagt benutze ich den AT89S8252 von
Atmel und dieser hat ganz andere Befehle.

von Matthias (Gast)


Lesenswert?

Hallo Ulrich,

habe mir gerade deinen Link angeschaut. Sieht ja alles gut erklärt aus,
aber dies war eine Seite für die µC der Serie AT90XXXX und ich weiß
nicht inwieweit die zu meinem kompatibel sind, da die ganzen Befehle
komplett anders sind als meine die ich jetzt benutze.

von Markus_8051 (Gast)


Lesenswert?

Der 89S8252 hat genau einen 16-Bit-Pointer, den DPTR, aufgeteilt in DPL
und DPH. Wenn die Daten ab "Basisadresse" im Code-Segment stehen und
Null-terminiert sind, sähe ein Programm dazu etwa so aus: (Stehen die
Daten im externen RAM, mußt Du statt MOVC einen MOVX-Befehl verwenden.
Wenn Du über Datenpointer auf das interne RAM zugreifen möchtest,
kannst du hier Index-Adressierung über die Register realisieren.)

MOV dptr, Basisadresse
CLR r0
loop:
MOV a,r0
MOVC a,@a+dptr
JZ ende    ; wenn Null gelesen, Ende
MOV Display_Data_Register,a
INC r0
JMP loop
ende:

Gruß,
Markus_8051

von Matthias (Gast)


Lesenswert?

Hallo Markus_8051,

Danke das sieht auf den ersten Blick sehr gut aus und die Befehle sagen
mir auch was. Ich werd das heut abend gleich mal ausprobieren.

Vielen Dank

von Matthias (Gast)


Lesenswert?

Hallo Markus_8051,

hab noch ne kurze Frage: Welches Assembler compilierprogramm nutzt du
eigentlich? Meines heißt TASM und ist ein weinig umständlich in der
Graphischen Umgebung.

von Markus_8051 (Gast)


Lesenswert?

@Matthias: Ich benutze den Assembler von Keil. Na, dann viel Erfolg beim
ausprobieren,

Markus_8051

von Matthias (Gast)


Lesenswert?

Hallo Markus_8051,

die Procedure die du mir gegeben hast, funktioniert soweit das mein
Compiler nicht gemeckert hat, aber es ist doch nur dazu da die Daten
aus dem Speicher auszulesen, aber wie bekomme ich die Daten erstmal
dahin?

von Markus_8051 (Gast)


Lesenswert?

Na, ich weiß nicht, was das für Daten sind, die Du da ausgeben möchtest.
Sind es feste Daten (z.B. Texte, Bilder, etc. die beim compilieren schon
feststehen) oder Daten, die erst zur Laufzeit berechnet werden? Feste
Daten würde ich halt direkt im Code-Segment ablegen. Wenn die Daten
erst berechnet werden, gehören sie in externe RAM. Dazu gibt es - wie
geschrieben - den MOVX Befehl. Dabei kann man "@A+DPTR" sowohl als
Quelle, als auch als Ziel der Operation angeben.

Also, wo kommen die Daten bei Dir her?

Gemäß Deinem ersten Posting schienst Du Schwierigkeiten mit der
Benutzung von Datenpointern und Index-Adressierung zu haben. Das
scheint es aber noch nicht so ganz getroffen zu haben. Also beschreib
Dein Problem mal etwas genauer, sonst kann Dir hier keiner helfen.

Markus_8051

von Matthias (Gast)


Lesenswert?

Ok Markus_8051,
so sieht meine Matrix aus. 0=LEDaus -=LEDan
000---00 P1.0 //Dies soll z.B. den Buchstaben "A" darstellen.
00-000-0 P1.1 //Der Port 3 dient nur zum durchschalten der Spalten.
00-000-0 P1.2 //An Port 1 gebe ich nun immer ein Hex-Wert an
00-000-0 P1.3 //z.B.011h, der beim Beispiel Spalte P3.3 und P3.4
00-----0 P1.4 //beinhaltet. Diese Hexwerte würde ich am liebsten
00-000-0 P1.5 //vorher irgendwie in den internen Speicher schreiben.
00-000-0 P1.6 //Dann im Programm ihm eine Adresse geben der dann halt
00-000-0 P1.7 //8 Hexwerte nacheinander ausliest und auf Port 1 gibt.
              //Dies wollte ich nun mit dem Datenpointer realisieren,
PPPPPPPP      //aber ich weiß nicht genau wie. Per Hand die ganzen
33333333      //Werte angeben funktioniert bis auf meine
........      //Warteschleife so wie ich es haben möchte, aber bei
01234567      //der große der Daten die immer mehr Zeichen mit sich
bringen wird es sehr unübersichtlich.

Ich hoffe diese Erklärung reicht dir Markus bzw. den anderen guten
Menschen die mir Helfen, wenn nicht sagt es. Dies ist nur die
Kurzfassung.

von Markus_8051 (Gast)


Lesenswert?

Dafür kennt der Assembler die db-Anweisung. Damit kannst Du Daten im
Code ablegen. Das könnte dann so aussehen:

char_tab:
char_A:   db 0,0,254,17,17,17,254,0
char_B:   db ......
.
.
.
(Solche Tabellen stehen üblicherweise am Ende des Programm-Codes)

mit

MOV dptr,#char_A

kannst Du nun den Datenpointer auf die richtige Start-Adresse setzen.

Da alle Buchstaben gleich lang sind (also 8 Bytes) kannst Du dir auch
eine Formel basteln, mit der Du aus dem ASCII-Code den richtigen
Startwert in der gesamten Tabelle (char_tab) berechnen kannst. So
kannst Du eine Prozedur schreiben, der Du nur das ASCII-Zeichen
übergibst, und die es dann auf der LED-Matrix anzeigt.

Viel Erfolg,

Markus_8051

von Matthias (Gast)


Lesenswert?

Mensch Markus das sieht ja richtig toll aus genau soetwas habe ich mir
gedacht, aber davon habe ich ja noch nie etwas gesehen mit diesen db
Anweisungen. Wird nachhergleich mal ausprobiert.
herzlichen Dank

von Matthias (Gast)


Lesenswert?

Hallo Markus_8051

ich habe deinen Vorschlag mal ausprobiert, aber mein Compiler versteht
irgendwie nicht diese "db" Anweisung. Sobald ich mir deinen Compiler
von Keil besorgt habe werde ich es nochmal ausprobieren.

von Karl H. (kbuchegg)


Lesenswert?

Setz mal einen '.' davor

char_A:   .db 0,0,254,17,17,17,254,0

Im Zweifel: Mal in die Doku des Assemblers schauen.
Solche Definitionen kann jeder Assembler in der einen
oder anderen Form.

von Matthias (Gast)


Lesenswert?

Hallo Karl Heinz,
Danke für diesen Vorschlag. Jetzt funzt das alles wie von Markus_8051
beschrieben.

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.