mikrocontroller.net

Forum: Compiler & IDEs struct Rückgabe von Funktion


Autor: SichFragender (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Kleine Frage
ich würde gerne die Rückgabe einer Funktion über eine globale Variable
vom Typ struct ermöglichen.Um Platz zu sparen(hab ich aus dem C-
Tutorial) versteht sich.
Kann ich verschiedene Datentypen in dieses Bitfeldfeld schreiben ohne
das es zu Fehlern kommt, wenn sich die Struktur über mehrere Byte
erstreckt.



// ***********************************************************
// Project:
// Author:
// Module description:
// ***********************************************************
// 
// -----------------------------------------------------------
// Struct 'Daten'
// Daten.bModus  -  0 Ankerspannung | 1 Moment
// Daten.iUsoll  -  Sollwert Steuerspannung
// Daten.iUst    -  Istwert Ankerspannung
// Daten.iI      -  Istwert Strom
// -----------------------------------------------------------
//


#include <avr\io.h>              // Most basic include files
#include <avr\interrupt.h>       // Add the necessary ones
#include <avr\signal.h>          // here

// Datentypen / Strukturen
  struct {
    unsigned char bModus:1;   // 1 BIT
    unsigned long iUsoll:16;  // 16 BIT  Sollwert Steuerspannung
    unsigned long iUst:16;    // 16 BIT  Istwert Ankerspannung
    unsigned long iI:16;      // 16 BIT  Istwert Strom
  }Daten;
  
// Funktionen
void init(void)  {
// PD0..PD7 Ausgang            - D/A Wandler über R2R Netzwerk
// PC0..PC2 Eingang (A/D Wandler)  - Eingang der Ist-Werte
// PC3 Eingang                - Betriebsmodus
// PC4..PC6 Ausgang            - HD44780 Display Steuerleitungen
// PB0..PB7 Ausgang            - HD44780 Display Datenleitungen
// DDRB - Data Direction Register B
// 1 Ausgang  |  0 Eingang
DDRB = 0xFF;
DDRC = 0x00;
DDRD = 0xFF;

// PullUp Widerstände der Eingänge PC0..PC3 aktivieren
PORTC = 0x0F;
}

void Lesen(void)  {
// Lesen der Eingangswert
// Usoll - PC0(ADC0)
// Ust  - PC1(ADC1)
// i    - PC2(ADC2)
// Modus  - PC3
Daten.bModus = PINC&(1<<PINC3);
}

int main(void) {
  unsigned long test = 0;
  void init(void);            // PORT Zustände setzen
   while(1) {
     void Lesen(void);
      Daten.bModus = PINC3;
   }
}

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Klar geht das. Aber :

Daten.bModus = PINC&(1<<PINC3);

wird wohl immer 0 im bModus Feld hinterlassen. Diese Zuweisung nimmt
das niederwertigste bit aus dem rechten Ausdruck und kopiert ihn nach
bModus.

Autor: The Daz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
iUsoll, iUst und iI werden von dieser Operation nicht modifiziert.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Na ja.
Wenn du schon Platz sparen willst, dann machs doch so:

struct {
  unsigned char bModus;
  unsigned int  iUsoll;    // 16 Bit
  unsigned int  iUst;      // 16 Bit
  unsigned int  iI;        // 16 Bit
} Daten;

in Summe dürfte diese Struktur kleiner sein, als
deine ursprüngliche. Es besteht kein Grund da mit
Bit-Angaben zu werken. Wenn es einen 16Bit Datentyp
gibt, benutze ihn auch!

PS: Warum benutzt heutzutage eigentlich jeder anonyme structs?
In ganzen 20 Jahren Industrieprogrammierung hab ich nicht eine
anonyme struct gebaut bzw. in fremden Libraries gesehen. Und hier
im Forum wimmelt es nur so davon.

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.