Forum: Mikrocontroller und Digitale Elektronik [AVR] signed int und EEPROM (GCC)


von Stefan W. (swessels)


Lesenswert?

Hallo zusammen,

ich möchte einen signed int im EEPROM ablegen. Mit dem folgenden 
Codeschnipsel
1
//...
2
int16_t test_EE EEMEM = -7;
3
//...
4
int main(void) {
5
    int16_t test;
6
7
    test = eeprom_read_byte(&test_EE);
8
    //.....
9
}

kommt (sinngemäß) die Warnung " xyz differs ind signedness".

Nach einem Blick in die libc dokumentation ist mir die Ursache klar.

Die Frage: Gibt es eine fertige Funktion mit der ich signed integers 
direkt ins EEPROM schreiben und auslesen kann oder muss ich mir da etwas 
selber bauen?

Für meinen Anwendungsfall (elektronisches V-Kabel mit einstellbarer 
Servomitte) kann ich mit nem kleinen Workaround auch uint16_t nehmen. 
Es gibt aber sicherlich auch Fälle in denen das nicht praktikabel ist.

Danke und Gruß,
Stefan

von Martin (Gast)


Lesenswert?

Die Funktion nennt man gemeinhin "Cast".

von Stefan W. (swessels)


Lesenswert?

Martin schrieb:
> Die Funktion nennt man gemeinhin "Cast".

Das ist mir durchausd bekannt, auch wenn ich es selten benötige. 
Vielleicht habe ich auch nur nen Knoten zwischen den Ohren.

Mit dem Code
1
int16_t test_EE EEMEM = -7;

steht in der Variable  0xFFF9, was ja aufgrund des Datentyps uint16_t 
auch richtig ist, da die Variable überläuft. Wenn ich das caste kommt 
leider nicht -7 raus....

Gruß,
Stefan

von holger (Gast)


Lesenswert?

>    test = eeprom_read_byte(&test_EE);

    test = eeprom_read_word(&test_EE);

von Stefan W. (swessels)


Lesenswert?

holger schrieb:
>>    test = eeprom_read_byte(&test_EE);
>
>     test = eeprom_read_word(&test_EE);

Ja, danke. Im richtigen Programm ist es natürlich ein 
eeprom_read_word...

von Läubi .. (laeubi) Benutzerseite


Lesenswert?

Stefan Weßels schrieb:
> Wenn ich das caste kommt
> leider nicht -7 raus....
Sondern?  Wie sieht der Code aus?

von Stefan W. (swessels)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

im Anhang sind der Quellcode und der Prinzipschaltplan.
Meine Fragen wären:

1. Kann ich das Problem überhaupt mit einem Cast lösen?
2. Wo genau im Code muss der Cast hin?

Danke für Eure Mühe.

gruß,
Stefan

von Oliver (Gast)


Lesenswert?

Stefan Weßels schrieb:
> 1. Kann ich das Problem überhaupt mit einem Cast lösen?

Welches Problem?

Stefan Weßels schrieb:
> 2. Wo genau im Code muss der Cast hin?

Überall dorthin, wo der Compiler eine Warnung ausgibt.

Sieh es mal so: Die eeprom-Funktionen lesen und schreiben ein Byte bzw. 
ein Word. Das sind 8 bzw. 16 Bits, deren Bedeutung dem EEPROM völlig 
egal ist.

Den passenden Datentyp musst du dem C-Compiler per Cast (in beide 
Richtungen) mitteilen. Das wirst du schon hinkriegen...

Oliver

von Stefan W. (swessels)


Lesenswert?

So, "Problem" gelöst... lag wie vermutet zwischen den Ohren.
Zum einen habe ich den Variableninhalt falsch interpretiert, zum zweiten 
castet GCC automatisch.
Zur Sicherheit habe ich trotzdem die entsprechenden Casts eingefügt.

Nochmals danke für die Hilfe!

Gruß,
Stefan

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.