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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.