www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Schreiben in der Adresse geht nicht


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

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich versuche die ganze Woche mit Hilfe der Adresse in  Register zu lesen 
und zu schreiben.
Mit Hilfe einer Struktur, die aus Adresse und Value besteht, will ich 
der Inhalt einer Register auslesen und an dieser Adresse des Registers 
einen neuen Wert schreiben.
Bei Ausführen des Programms klappt nicht.
Das erste auslesen ist richtig, aber wenn ich etwas an der Adresse 
schreibe, bekomme ich immer der alten Wert beim Lesen.

danke euch

Autor: Sebastian Hepp (sebihepp)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

also entweder benutzt du globale Variablen für den Parameter oder
du nimmst den Funktionsparameter dafür. Hier hast du beides, benutzt
aber nur den globalen. Desweiteren sollten noch die Funktions-
deklarationen in der io.h stehen.

Der eigentliche Fehler den du meinst, liegt darin dass du in der
Funktion writeIORegister(...) zwar einen Zeiger auf den Speicher-
bereich erzeugst, aber nicht darauf schreibst. Es fehlt also noch ein
*Ptr_Reg = Val_Reg;
 am Ende.

Viele Grüße
Sebihepp

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

Bewertung
0 lesenswert
nicht lesenswert
hallo,
ich habe festgstellt, dass ich letze mal paar Fehler gemacht habe.Jetzt 
habe ich das kleine Programm aufgeräumt.
Wie ich schon gesagt habe, versuche ich paar Werte in Adresse zu 
schreiben, leider klappt nicht.
Kann jemanden mir helfen.
Anbei das Programm.
danke

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

Bewertung
0 lesenswert
nicht lesenswert
gast schrieb:
> hallo,
> ich habe festgstellt, dass ich letze mal paar Fehler gemacht habe.Jetzt
> habe ich das kleine Programm aufgeräumt.
> Wie ich schon gesagt habe, versuche ich paar Werte in Adresse zu
> schreiben, leider klappt nicht.

Dann räum erst mal kräftig auf

Aber sehen wir uns doch mal die Funktion an
 void writeIORegister(struct InOut *ptr_InOut)
 {  
   Adr_Reg = (uint8_t) (ptr_InOut->Adresse & 0xFF);
   Val_Reg = (uint8_t) (ptr_InOut->Value & 0xFF);
        //*Ptr_Reg = ((volatile uint8_t *) ((uint8_t) Val_Reg & 0xFF));
         *Ptr_Reg = Val_Reg;
         printf("the value %x will be written in adresse %p", Val_Reg,Adr_Reg);
  
 }

Hmm.
Da wird wie wild zugewiesen.
Aber letztendlich wird über *Ptr_Ref der neue Wert zugewiesen.
Nur: Wie kommt eigentlich Ptr_Reg zu seinem Wert?

Du trickst dich hier mit deinen ganzen Zwischenvariablen (die noch dazu 
ohne Grund global sind) permanent selber aus indem du dir Information 
konsequent vor dir selber versteckst.
void writeIORegister(struct InOut *ptr_InOut)
{
  uint8_t* Address = (uint8_t*)(ptr_InOut->Adresse & 0xFF);
  *Address = (uint8_t) (ptr_InOut->Value & 0xFF);
}

Ob das allerdings das korrekte Gegenstück zur read Funktion ist, kann 
ich nicht sagen, denn dort wird noch ein _MMIO_BYTE benutzt um an die 
Werte zu kommen.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo,

ich habe auch vorher mit _MMIO_BYTE( (Adr_Reg)) = 0xAA;und er hat auch 
nicht geklappt.

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

Bewertung
0 lesenswert
nicht lesenswert
gast schrieb:
> hallo,
>
> ich habe auch vorher mit _MMIO_BYTE( (Adr_Reg)) = 0xAA;und er hat auch
> nicht geklappt.

Dazu kann man wenig sagen, weil _MMIO_BYTE ein Makro ist, das wir nicht 
kennen. Aber so wie das Makro beim read eingesetzt wird, wundert mich 
das wenig, dass damit das Schreiben nicht funktioniert.

Funktioniert eigentlich der read?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ja, das read funktionniert gut, in jeder Adresse lese ich den richtigen 
wert aus.

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

Bewertung
0 lesenswert
nicht lesenswert
Dann such doch mal das Makro raus.
Ohne Kenntnis der Details ist das immer so ein Rätselraten.

Vielleicht kann man es ja auch zum Schreiben benutzen. Das weiß man aber 
erst, wenn man den Code sieht.

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

Bewertung
0 lesenswert
nicht lesenswert
hallo Karl,
das Mokro ist in header file sfr_defs.h definiert.

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

Bewertung
0 lesenswert
nicht lesenswert
Sag doch gleich, dass du mit dem gcc auf einem AVR arbeitest :-)

Dann sollte aber
void writeIORegister(struct InOut *ptr_InOut)
{
  _MMIO_BYTE( ptr_InOut->Adresse & 0xFF ) = (ptr_InOut->Value & 0xFF);
}
aber schon das Gegenstück zu deinem read sein.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hallo Karl,

bitte nicht böse  sein,aber ich bekomme gar nicht. was mache ich mit dem 
*Ptr_Reg?

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

Bewertung
0 lesenswert
nicht lesenswert
Gar nichts.
Wer braucht das denn?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich frage, weil ich immer der ursprunchliche Werte bekomme, nachdem ich 
geschrieben habe. Dh beim zweitem Aufruf der Funktion read, lese ich 
immer 0xfb  statt 0xAA;

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

Bewertung
0 lesenswert
nicht lesenswert
Welches Register liest du denn aus?
Also welchen Zahlenwert hat denn die Adresse? Und welchem Register in 
üblicher Nomenklatur entspricht diese Adresse deiner Meinung nach auf 
deinem Prozessor? Und um welchen Prozessor handelt es sich überhaupt?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich lese den Register DDRC mit der Adresse 0x27

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

Bewertung
0 lesenswert
nicht lesenswert
Auf welchem Prozessor?

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
die Adresse des Register habe ich im header file iocanxx.h gefunden.

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ich benutze den Mikrocontroller AT90CAN128 von Atmel

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

Bewertung
0 lesenswert
nicht lesenswert
Gerade ausprobiert
#include <avr/io.h>

int main()
{
  uint8_t j = 0xFF;
  uint8_t k;

  _MMIO_BYTE( 0x27 ) = 0x55;

  k = _MMIO_BYTE( 0x27 );

  return 0;
}

mit einem AT90CAN128
Funktioniert wie erwartet und der Simulator zeigt mir auch, dass sich 
tatsächlich das DDRC Register verändert hat (mit dem erwartetem Wert).

Autor: gast (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hi Karl,
vielleicht bekomme ich den falschen Wert, weil ich diese Warnung habe.
warning: cast to pointer from integer of different size
wegen _MMIO_BYTE( ptr_InOut->Adresse & 0xFF ) = (ptr_InOut->Value & 
0xFF);

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

Bewertung
0 lesenswert
nicht lesenswert
hi Karl,
ich habe das Problem localisiert.
das DDRC ist richtig im write-Funktion aber nicht in read-Funktion (nur 
für den ersten Aufruf).

1.Aufruf read-Funktion

value=0xfb
value1=0xff
DDRC=0xfb

2.Aufruf write -Funktion

k=0xAA
DDRC=0xAA

3.Aufruf read-Funktion

value=0xfb
value1=0xff
DDRC=0xfb

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.