Forum: Mikrocontroller und Digitale Elektronik Eigenen Datentyp definieren


von Jo-Joe (Gast)


Lesenswert?

Hallo.
Ich möchte meine eigene Struktur herstellen um ein Datum zu speichern.
dazu möchte ich folgendes kominieren:

Datum: 27.08.05

Tag:   27    -> 5 Bits
Monat: 08    -> 4 Bits
Jahr:  05    -> 4 bits (höchtes jahr: 2016)
Zeit:  2     -> 3 Bits (1 = 00:00 Uhr; 2 = 03:00 Ihr; 3 = 06:00....)

das Ganze wären dann 2 Bytes. aber wie mach ich das ?

quasi so in der art:
struct {
Bit[5] Tag;
Bit[4] Monat;
...
} time;

von Sebastian J. (bassti)


Lesenswert?

5+3 =8
4+4 =8
würd ich mit ner union machen, dann kannst entweder bitweise
oder komplett drauf zugreifen.
dazu typen definieren wie oben von dir
so gehts
http://pronix.linuxdelta.de/C/standard_C/c_programmierung_18_2.shtml#9

von Jo-Joe (Gast)


Lesenswert?

An ne Union hab ich auch scon gedacht nur wie soll ich n halbes byte
vergeben?
Ich kann ja nicht schreiben

struct{
halbes_byte Tag;
...
}typ;

wie kann ich das mit einer Union machen ? Da muss ich do ch genauso ne
Struct definieren.
Kann ich das nicht irgendwie so machen, dann ich später über
1
Datum.Tag = 10;

zugreifen kann?

von peter dannegger (Gast)


Lesenswert?

Diese Bit-Knauserei spart Dir zwar 2 Bytes SRAM ein, kostet Dich aber
Unmengen an Flash bei jedem Zusammenbasteln und Auseinanderklamüsern
fürs Shiften, UNDieren und VerODERn.

Schau Dir einfach mal den erzeugten Assembler an, dann wird Dir schnell
übel werden.

Nimm also besser für die 4 Variablen auch 4 Bytes.

C unterstützt zwar Bitfelder, aber kaum einer benutzt sie, sind einfach
zu teuer in Bezug auf Code und CPU-Zeit.


Peter

von Jo-Joe (Gast)


Lesenswert?

Hallo Peter.
esgeht mir nicht um die SRAM sondern um den EEPROM speicher des
Mega16s. Ich hab nur 512 bytes und da müssen möglichst viele messwerte
reinpassen sonst muss man jeden Tag die Daten auf den PC laden. Aus
platzgründen bekomm ich leider kein 2. EEPROM speicher / Flash auf mein
"Brett"

von Rolf Magnus (Gast)


Lesenswert?

struct
{
    uint16_t Zeit  : 3;
    uint16_t Tag   : 5;
    uint16_t Monat : 4;
    uint16_t Jahr  : 4;
} time;

von Jo-Joe (Gast)


Lesenswert?

Hi. Wiso muss ich die einzelenen members der structur als uint16
deklarieren ? später hat die Variable ja nur z.B. 3 bit !?
wiso dann uint_16_

von peter dannegger (Gast)


Lesenswert?

"wiso dann uint_16_"

Das ist eben die Syntax, irgendeinen Typ muß jede Variable haben,
wichtig ist hier aber nur, was hinter dem ":" steht.


Peter

P.S.:
Man kann auch Daten im Flash speichern (SPM).
Beim Nutzen des EEPROM, unbedingt die Brownout-Fuse setzen !

von ---- (Gast)


Lesenswert?

> C unterstützt zwar Bitfelder, aber kaum einer benutzt sie, sind
> einfach zu teuer in Bezug auf Code und CPU-Zeit.
Das trifft aber nur für Prozessoren zu, die ihren Speicher nicht
bitweise adressieren können! (Zugegeben, das dürfte die Mehrheit sein).
Mit "boolschen" Bitvariablen kann der entsprechende Prozessor mind.
genauso schnell arbeiten wie mit int-Werten (Prozessorbreite!) und hat
dabei den Vorteil des geringeren Speicherbedarfs für diese Variablen.

> "wiso dann uint_16_"
"korrekter" wäre int(!), da ANSI/ISO(?)-C das so verlangt.

----, (QuadDash).

von Rolf Magnus (Gast)


Lesenswert?

>> "wiso dann uint_16_"
>"korrekter" wäre int(!), da ANSI/ISO(?)-C das so verlangt.

Tut es nicht (zumindest C99).

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.