Schreiben in der Adresse geht nicht

Gast #1507532
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
Angehängte Dateien:
#1507579
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
Gast #1510231
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
Angehängte Dateien:
#1510239
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.
#1510271
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?
#1510460
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).
Gast #1510506
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);
Gast #1510577
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
Angehängte Dateien:

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren