PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] Pointaschtisch...



Zille
11.10.2013, 11:02
Hallo liebe Community,

dieser Thread bezieht sich auf die Programmierung der PING PONG LED-Matrix und auf das vorhandene Laufschrift C-Programm von User RadBruch.
Verweis: https://www.roboternetz.de/community/threads/50954-Ping-Pong-umprogrammieren/page2?p=492046&viewfull=1#post492046

Es sollte gesagt sein, dass bei mir Erfahrungen mit µC sowie mit AVR-Studio vorliegen. Ich habe mir auch zum Thema Pointer Tutorials bei Youtube und anderen Quellen angeschaut und war für eine geraume Zeit im Irrglauben diese verstanden zu haben... ;)
Bevor ich andere Leute um Hilfe bitte, versuche ich mir durch Selbserarbeitung die Fragen zu klären --> gescheitert :)

Kommen wir nun zum Knackpunkt meines Postings:

Ich verstehe folgende zwei Ausschnitte nicht eindeutig

1.

prog_uint8_t * fnt = (prog_uint8_t *) font; /* Zeiger auf den Zeichensatz im Flash */

-> Für mich wird hier ein 8 Bit Zeiger namens fnt erzeugt, welcher auf die font (Array) zeigt. Ich verstehe weder das ,,prog" vor uint8_t noch warum die Klammer vor font steht und das Sternchen mit in der Klammer...:confused:


2.

fontbyte = pgm_read_byte_near(fnt+c*FONTHEIGHT+fonty); /* Ein Byte (Zeile) des aktuellen Zeichens lesen */

->Mein Verständnis: mit pgm_read_byte_near wird auf den flash speicher (font Array) zugegriffen und ein Byte welches zur Konstellation eines Zeichens beiträgt angepointet und an LEDs ausgegeben. Grob versteh ich es, allerdings würde ich gern eindeutig wissen wie das Zusammenspiel der Pointer an der Stelle ist. Auch woran man erkennt, ob das ,,*" vor FONTHEIGHT nun als Pointer oder als Multiplikator dienen soll...irgendwo hörts da bei mir auf xD


Ich bin für jede Hilfe dankbar =)


Mit freundlichen und hoffnungsvollen Grüßen

Zille

askazo
11.10.2013, 12:03
Hi,

zu 1.1)
"prog_uint8_t" ist eine 8Bit großer Datentyp, der vom Comiler automatisch im Flash abgelegt wird. Die Definition hierfür findet sich in der Datei pgmspace.h:

typedef uint8_t PROGMEM prog_uint8_t;
Das Attribut PROGMEM sagt dem Compiler, dass er Daten dieses Typs im Flash ablegen soll.
prog_uint8_t * ist nun also ein Pointer auf einen solchen Datentyp und zeigt somit auf eine Adresse im Flash.
Sinn und Zweck: Größere konstante Datenmengen wir z.B. Zeichensätze werden lieber im Flash abgelegt, da die meisten µC deutlich mehr Flash- als RAM-Speicher im Bauch haben.

zu 1.2)
(prog_uint8_t *) ist ein sogennanter Cast (http://de.wikipedia.org/wiki/Typumwandlung), eine Typumwandlung.
Sinn und Zweck: Ich gehe mal davon aus, dass die Variable font ein Integer ist, der einfach die Basisadresse eines Zeichensatzes enthält. Würde man diese Variable nun einfach dem Zeiger fnt zuweisen, würde der Compiler meckern, da diese beiden Datentypen nicht kompatibel sind. Um sie kompatibel zu machen, braucht man den Cast.

zu 2)
fnt ist die Basisadresse des Zeichensatzes. Um nun an das richtige Zeichen zu gelangen, muss ich zu dieser Adresse die "Nummer" des Zeichens c mal die Höhe des Zeichens addieren. Damit habe ich die oberste Zeile des Zeichens. Mit der Addition von fonty erhalte ich dann die weiteren Zeilen.
Ein * ist immer nur dann als Multiplikation zu sehen, wenn es zwischen zwei Variablen bzw. Konstanten steht oder direkt vor einem =.
Ansonsten ist er immer als Verweisoperator (Pointeroperator) zu sehen.

Gruß,
Georg

Zille
11.10.2013, 12:49
Hallo askazo,

danke für deine schnelle und umfangreiche Antwort. :)

Ich werde mich heute noch einmal hinsetzen und versuchen mit Hilfe deiner Erklärung es im Ganzen zu verstehen.
Es wird demnach bald ein bessere Feedback von mir geben.
Sobald sich der Thread erledigt haben sollte, markiere ich ihn als erledigt ;)

so long

Zille