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


von gast (Gast)


Angehängte Dateien:

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

von Sebastian H. (sebihepp)


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
1
*Ptr_Reg = Val_Reg;
 am Ende.

Viele Grüße
Sebihepp

von gast (Gast)


Angehängte Dateien:

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

von Karl H. (kbuchegg)


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
1
 void writeIORegister(struct InOut *ptr_InOut)
2
 {  
3
   Adr_Reg = (uint8_t) (ptr_InOut->Adresse & 0xFF);
4
   Val_Reg = (uint8_t) (ptr_InOut->Value & 0xFF);
5
        //*Ptr_Reg = ((volatile uint8_t *) ((uint8_t) Val_Reg & 0xFF));
6
         *Ptr_Reg = Val_Reg;
7
         printf("the value %x will be written in adresse %p", Val_Reg,Adr_Reg);
8
  
9
 }

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.
1
void writeIORegister(struct InOut *ptr_InOut)
2
{
3
  uint8_t* Address = (uint8_t*)(ptr_InOut->Adresse & 0xFF);
4
  *Address = (uint8_t) (ptr_InOut->Value & 0xFF);
5
}

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.

von gast (Gast)


Lesenswert?

hallo,

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

von Karl H. (kbuchegg)


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?

von gast (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


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.

von gast (Gast)


Angehängte Dateien:

Lesenswert?

hallo Karl,
das Mokro ist in header file sfr_defs.h definiert.

von Karl H. (kbuchegg)


Lesenswert?

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

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

von gast (Gast)


Lesenswert?

hallo Karl,

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

von Karl H. (kbuchegg)


Lesenswert?

Gar nichts.
Wer braucht das denn?

von gast (Gast)


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;

von Karl H. (kbuchegg)


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?

von gast (Gast)


Lesenswert?

Ich lese den Register DDRC mit der Adresse 0x27

von Karl H. (kbuchegg)


Lesenswert?

Auf welchem Prozessor?

von gast (Gast)


Lesenswert?

die Adresse des Register habe ich im header file iocanxx.h gefunden.

von gast (Gast)


Lesenswert?

ich benutze den Mikrocontroller AT90CAN128 von Atmel

von Karl H. (kbuchegg)


Lesenswert?

Gerade ausprobiert
1
#include <avr/io.h>
2
3
int main()
4
{
5
  uint8_t j = 0xFF;
6
  uint8_t k;
7
8
  _MMIO_BYTE( 0x27 ) = 0x55;
9
10
  k = _MMIO_BYTE( 0x27 );
11
12
  return 0;
13
}

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).

von gast (Gast)


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);

von gast (Gast)


Angehängte Dateien:

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

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.