mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Problem C-Zeiger


Autor: Thomas (Gast)
Datum:
Angehängte Dateien:

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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wie ist I2CHIP_BASE definiert?

Autor: Thomas (Gast)
Datum:

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

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Index i als "signed char" ist Absicht? Ist ineffizient.

Autor: Thomas (Gast)
Datum:
Angehängte Dateien:

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

Autor: T.Stütz (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

Autor: Thomas (Gast)
Datum:

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

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.