mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Datenpointer Microcontroller


Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Assembler oder C ?

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus_8051 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Welcher µC?

Autor: TheForce (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Ulrich (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus_8051 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus_8051 (Gast)
Datum:

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

Markus_8051

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Markus_8051 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Markus_8051 (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Matthias (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Matthias (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.