Forum: Mikrocontroller und Digitale Elektronik Problem C-Zeiger


von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Guten Abend,
ich versuche gerade das Easy TCP Modul (Wiznet WR3100a) mit einem
ATMEGA162 in C zu programmieren. Das lief bereits mit einem 89c8252,
bin aber nun umgestiegen und versuche nun den alten Quellcode zu
recyclen. Mit
#define SUBNET_MASK_PTR  (*(volatile unsigned char *)(I2CHIP_BASE +
0x84))
definiere ich einen Zeiger auf eines der Register des WR3100 das ich
als externe Speicherzelle ansprechen will. Beim Compilieren mit WinAVR
bekomme ich immer folgende Fehler wenn ich in diese "Speicherzellen"
schreiben will:
warning: array subscript has type `char', error: invalid lvalue in
assignment
Was will mir das sagen? Habe im Internet Beispiele gesucht und gefunden
die es genau so machen (andere Adressen natürlich).
Bin für jeden Hinweis dankbar, mein Code ist ausschnittweise
angehängt..

Gruß

Thomas

von A.K. (Gast)


Lesenswert?

Wie ist I2CHIP_BASE definiert?

von Thomas (Gast)


Lesenswert?

Die ist 0x8000. Hab aber herausgefunden dass ich die entsprechende
Header Datei nicht eingebunden hatte, deshalb ging es nicht. Nu bekomm
ich noch folgende Warnungen bei meinen Zuweisungen:

warning: array subscript has type `char'
bei den Zeilen
 SRC_HA_PTR(i) = mac[i]; usw.

Habe alles als "unsigned char" definiert,was will er nu??

Danke vorab,

Gruß
Thomas

von A.K. (Gast)


Lesenswert?

Index i als "signed char" ist Absicht? Ist ineffizient.

von Thomas (Gast)


Angehängte Dateien:

Lesenswert?

Hab mal unsigned probiert, war keine Absicht. Die Warnung geht weg.
Danke.
Trotzdem schreibt er nicht in die gewünschten Register. Habe mal
oszilografiert, das ist auf WR, RD und ALE etwas los. Er scheint extern
zuzugreifen.
Aber wenn ich in die Register hineinschreibe und wieder herauslese
kommt nicht das erwartete heraus, siehe Codeschnipsel im Anhang.
Ich schreibe zum Test viermal FF in die Subnetmask und lese es dann
wieder aus. Ergebnis ist 132,133,134,135. WARUM??

von T.Stütz (Gast)


Lesenswert?

Die Folge 132,133.. sieht verdächtig nach
((unsigned char) (0x8084+n)) aus => 0x84,0x85 ..

Mach mal ne paar Klammern in dein #define

#define SUBNET_MASK_PTR(n) (*((unsigned char
*)((n)+I2CHIP_BASE+0x84)))

oder:

#define SUBNET_MASK_PTR(n) ((unsigned char *)(I2CHIP_BASE+0x84))[n]

Gruss

von Thomas (Gast)


Lesenswert?

Hallo,
danke für die Tips. Beide Versionen bringen das selbe Ergebnis: Ich
bekomme nicht den Inhalt der externen "Speicherzelle" sondern das LSB
der Adresse (132....).
FRUST.
Was mach ich falsch?

Gruss

Thomas

von Thomas (Gast)


Lesenswert?

Bin ein Stück weiter. Es ist ein Hardware Problem das ich nicht
verstehe.
Prozessor: ATMEGA162. Der externe Speicher ist mit einem Inverter in
den Bereich bis 0x8000 gemappt, funktionierte OK mit dem 89C8252.
Wenn ich nun Spannung einschalte ist P2.7 sofort auf 5V, auch wenn ich
den RESET festhalte. Es ist also kein SW Problem, die läuft ja noch gar
nicht. Wenn ich zugreifen will so ist immer eine Adresse über 8000
selektiert. Mein CE ist immer H und mein Speicher nicht selektiert. Ich
habe mal Schreib und Lese Zugriffe mit Zeigern versucht, sind OK bis
4ff. Ab 500 ist das Problem, da wird es extern.
Die Spannung kommt aus dem Prozessor, den hab ich schon mal gewechselt,
keine Änderung. Ziehe ich den Prozessor raus sind meine 5V weg. Also
kein Kurzschluß in der Platine oder so.
Konnte im PDF nix finden warum das so ist, weiß da einer Rat?? Warum
ist P2.7 immer sofort H auch wenn der reset noch da ist??

Good nite

Thomas

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.