mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Eigenen Datentyp definieren


Autor: Jo-Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Sebastian Jooß (bassti)
Datum:

Bewertung
0 lesenswert
nicht 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_program...

Autor: Jo-Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
Datum.Tag = 10;

zugreifen kann?

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Jo-Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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"

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
struct
{
    uint16_t Zeit  : 3;
    uint16_t Tag   : 5;
    uint16_t Monat : 4;
    uint16_t Jahr  : 4;
} time;

Autor: Jo-Joe (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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_

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 !

Autor: ---- (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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).

Autor: Rolf Magnus (Gast)
Datum:

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

Tut es nicht (zumindest C99).

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.