PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Headerdatei(en) für ATMega32



021aet04
18.11.2009, 00:45
Da ich den Roboter von meldano gekauft habe arbeite ich mich gerade in die Programmierung vom Mega32 ein. Da keine Headerdateien dabei waren erstelle ich mir selbst welche mit Funktionen zu z.B. PWM. Ich habe einmal gelesen, dass man Funktionen nicht in *.h- Dateien packen soll sondern nur Definitionen. Stimmt das (auch wenn es geht) oder ist es egal. Ich würde sonst die Definitionen in eine *.h-Datei packen und die Funktionen in eine *.c-Datei und diese mit #include einbinden.

Was würdet ihr für Funktionen einbauen? Ich habe mir eine Liste mit funktionen zusammengeschrieben in der z.B. eine Funktion für Vorwärts- und Rückwartsfahren, drehen, verschiedene Rampen (beschleunigen, bremsen für Vorwärts und Rückwärts) und einige Schreib und Lesebefehle (Bit, Nibble und Byte lesen, schreiben und negieren).

Ich will die Dateien so auslegen, damit ein Anfänger diese "leicht" versteht und anwenden kann. Außerdem will ich die Dateien gut kommentieren, damit auch ein Anfänger diese Abändern kann (z.B. Ausgänge definieren,...)

Meine Fragen noch einmal kurz zusammengefasst:

>Funktionen in h-Dateien oder in c-Dateien?
>Was für Funktionen würdet ihr einbauen?

Über Anregungen und Kritik würde ich mich freuen.

MfG Hannes

askazo
18.11.2009, 08:08
Zur ersten Frage:
Funktionen stehen niemals in einer Header-Datei (außer inline-Funktionen).
In eine Header-Datei gehören ausschließlich Deklarationen (bitte nicht verwechseln mit Definition).

Zur zweiten Frage kann ich nicht viel sagen, weil ich den Roboter nicht kenne.

Gute Dokumentation ist ein sehr guter Vorsatz, dafür kann ich Dir doxygen (http://www.doxygen.org) wärmstens empfehlen.

Gruß,
askazo

021aet04
18.11.2009, 10:54
Dann werde ich die Funktionen in eine C-Datei schreiben. Unterschied zwischen Definitionen und Deklarationen kenne ich. Als Beispiele
Definition => #define Led PC3
Deklarationen => int timer;


Zur zweiten Frage kann ich nicht viel sagen, weil ich den Roboter nicht kenne.


https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=50131&highlight=

Ich will allerdings keine Dateien für nur meinen Roboter, sondern allgemein für Mega32 schreiben. Die Platine ist auch kein fertiger Bausatz oder Fertiggerät sondern von Meldano entwickelt worden.

Das mit Doxygen werde ich mir näher anschauen.

MfG Hannes

sternst
18.11.2009, 11:20
Unterschied zwischen Definitionen und Deklarationen kenne ich. Als Beispiele
Definition => #define Led PC3
Deklarationen => int timer;Nein.


Variable:

Definition:

int timer;

Deklaration:

extern int timer;

Funktion:

Definition:

void SomeFunc (int param) {
//Code
}

Deklaration:

void SomeFunc (int param);

auch möglich: void SomeFunc (int);
ersteres ist aber vorzuziehen

Und #define ist keines von beiden. Das ist nur ein Präprozessor-Makro.

oberallgeier
18.11.2009, 11:41
Ich finde diesen Überblick (http://www.math.tu-dresden.de/~schlenk/courses/gdlgs/reference/c-lang.pdf) sehr hilfreich weil er kurz, bündig und ziemlich umfassend ist. Aber ein Überblick ersetzt natürlich weder ein Lehrbuch (z.B. den Kernighan-Ritchie (http://www.eldoro.de/informatik/programmierung/c/kernighan_programmieren_in_c.shtml) - ich weiß, das ist nicht jedermanns Sache) noch ersetzt diese Sammlung die tollen Hilfestellungen der Forumskollegen.

sternst
18.11.2009, 12:08
Ich finde diesen Überblick (http://www.math.tu-dresden.de/~schlenk/courses/gdlgs/reference/c-lang.pdf) sehr hilfreich weil er kurz, bündig und ziemlich umfassend ist.Und leider auch falsch ist im Hinblick auf das Thema hier. Was unter 3.3 aufgelistet ist, ist eben keine Variablendeklaration, sondern eine Variablendefinition.

oberallgeier
18.11.2009, 17:23
... Und leider auch falsch ist ...Danke sternst für den Hinweis. Im KR ist dieses Thema nicht so schön verständlich dargestellt. Dafür habe ich jetzt im VORWORT zur deutschen, zweiten Ausgabe (ISBN 3-446-15497-3) gelesen:

Wir konnten im allgemeinen sehr wortgetreu übersetzen, mit einer wesentlichen Ausnahme: im Deuschen kann man Deklarationen, die Eigenschaften von Namen vereinbaren, völlig von Definitionen unterscheiden, die dazu auch noch Speicherplatz bereitstellen, denn für beide Vorgänge zusammen gibt es im Deutschen noch den Oberbegriff der Vereinbarung. Diese Unterscheidung sollte vor allem die C-Sprachbeschreibung im Anhang A leichter verständlich machen. Und irgendwie ging für meine Lese dann im weiteren Verlauf des Buches Definition und Deklaration etwas unter - weil dafür oft "Vereinbarung" steht.

Fazit: ich bin wieder mal einen Schritt tiefer vorgedrungen.

021aet04
19.11.2009, 00:47
Fazit: ich bin wieder mal einen Schritt tiefer vorgedrungen.


Nicht nur du.

Ich habe in meiner Elektronikmappe aus der Schule das hier gefunden. Das haben wir vom Fachlehrer bekommen. Hier ist eine C-Zusammenfassung, die ich euch nicht vorenthalten möchte.
http://www.inf.hs-anhalt.de/Service/C-Programmierung/C-Zusammenfassung.htm

Das mit der Funktiondefinition bzw. Deklaration ist mir jetzt klar, aber was ist der Unterschied zwischen Variablendefinition und Deklaration?

askazo
19.11.2009, 08:59
Das mit der Funktiondefinition bzw. Deklaration ist mir jetzt klar, aber was ist der Unterschied zwischen Variablendefinition und Deklaration?
Bei der Deklaration einer Variable wird Speicherplatz für sie reserviert. Das ist das ganz normale "Anlegen" einer Variable:


int foo;
oder
int foo = 111;


Willst Du nun diese Variable, sofern sie global ist, in einer anderen Datei bekannt machen, musst Du sie für die andere Datei definieren. Dies geschieht normalerweise in der Headerdatei zu der C-Datei, in der die Variable deklariert ist (analog zu Funktionen). Der einzige Unterschied zur Deklaration ist das Attribut extern.
Mal ein Beispiel:



Datei: test.c
----------------
//Deklaration der Variable
int foo;

Datei: test.h
----------------
//Definition der Variable
extern int foo;

Datei: main.c
----------------
#include "test.h"

//Die Variable foo kann nun auch hier verwendet werden!


Gruß,
askazo

PS: Dein Link funktioniert nicht :(

oberallgeier
19.11.2009, 09:09
... was ist der Unterschied zwischen Variablendefinition und Deklaration?Als C (-äh) - Programmierer in den Kinderschuhen kann ich da ja nicht kompetent antworten. Aber ich versuchs mal nachzuarbeiten. Der KR - siehe Posting oben - hat diesen Unterschied nicht so vorgestellt, dass ich ihn bisher verstanden habe. Aber ich nehme an, dass die Übersetzer ziemlich kompetent waren, und die haben einmal im Vorwort eine Aussage dazu getroffen, siehe Quote oben. Deutlich erläutert steht es in einer Fußnote, S 9 der gleichen Ausgabe:

* Wir unterscheiden zwei Arten von Vereinbarungen: Definitionen, die Objekte erzeugen, und Deklarationen, die nur die Eigenschaften von Objekten festlegen. A.d.Ü.
Die Schwäche bei der Erklärung von Definition und Deklaration im KR finde ich schon deswegen bedauerlich, weil dort z.B. auch steht:
Ein Hinweis auf die Geschichte: die größte Änderung zwischen ANSI-C und früheren Versionen betrifft Deklaration und Definition von Funktionen. In der ursprünglichen Definition von C hätte man . . . .
Da ich eben, morgens, nach einer deutlichen Erläuterung gesucht habe, finde ich auf Seite 32 genau die richtige Stelle (morgens, nicht mitternachts - da war ich einfach zu blind, als dass ich beim suchenden Querlesen das entdeckt hätte). Ein bisschen versteckt ist diese wichtige Unterscheidung trotz des Hinweises "Beachten sie ..." aber schon - man muss den KR halt wirklich SEHR aufmerksam lesen :
Beachten Sie, ... Definition bezeichnet die Vereinbarung, in der für eine Variable Speicherplatz reserviert wird; Deklaration bezeichnet die Vereinbarungen, die zwar die Variable beschreiben, aber eben keinen Speicherplatz reservieren.Und seltsamerweise steht heute (das war doch gestern noch nicht drin . . . ) im Sachverzeichnis des KR sogar "... Definitionen ... und Deklaration 32, ...". Wie sich Bü cher über Nacht manchmal verändern . . . Lustig, nein, eher verwirrend, ist ja nun, dass externe Deklarationen von Variablen und Funktionen üblicherweise in den sogenannten Definitionsdateien gesammelt werden.

Damit habe ich den Unterschied mal so grob verstanden. Mehr wird die bewusst durchgeführte Übung beim Programmieren bringen. Leider hatte ich in der Schule nie C gelernt, das wurde garnicht angeboten. Das bißchen, das ich kann, musste ich mir weitgehend selbst beibringen - na ja, nicht ganz. Zum Glück gibt es Kollegen wie sternst e.a. die immer wieder weiterhelfen, wenns gar zu arg hakt.

sternst
19.11.2009, 10:06
Bei der Deklaration einer Variable wird Speicherplatz für sie reserviert. Das ist das ganz normale "Anlegen" einer Variable:


int foo;
oder
int foo = 111;


Willst Du nun diese Variable, sofern sie global ist, in einer anderen Datei bekannt machen, musst Du sie für die andere Datei definieren. Dies geschieht normalerweise in der Headerdatei zu der C-Datei, in der die Variable deklariert ist (analog zu Funktionen). Der einzige Unterschied zur Deklaration ist das Attribut extern.
Mal ein Beispiel:



Datei: test.c
----------------
//Deklaration der Variable
int foo;

Datei: test.h
----------------
//Definition der Variable
extern int foo;

Datei: main.c
----------------
#include "test.h"

//Die Variable foo kann nun auch hier verwendet werden!

Umgekehrt!

Definieren = Anlegen
Deklarieren = Bekannt machen

021aet04
19.11.2009, 10:22
Jetzt ist alles klar danke sternst und obarallgeier.

Hier noc einmal der Link. Habe mich verschrieben. Nun funktioniert der Link (getestet). Im obigen Post habe ich ihn auch geändert.

http://www.inf.hs-anhalt.de/Service/C-Programmierung/C-Zusammenfassung.htm

oberallgeier
19.11.2009, 10:23
... Deklarieren = Bekannt machen :idea: Klar - steht bei jedem Grenzübergang: Deklarieren sie ihre mitgebrachte Ware (sprich: machen sie gefälligst ihre Schmuggelgimmicks dem Zoll bekannt).


... vom Fachlehrer ... eine C-Zusammenfassung ...Nur - die Ausdrücke Deklaration und Definition hatte der Schlauberger selbst verwendet, aber nicht erklärt *grummel*.

021aet04
19.11.2009, 10:46
Wir haben vom Fachlehrer die Zusammenfassung bekommen und die Grundlage zum einfachen Programmieren gelernt. Da die µC Programmierung kein eigenes Fach war haben wir es in Elektronik durchgemacht. In Elektronik haben wir von den Grundlagen (Bauelemente) bis Leistungselektronik alles gemacht. Da kann man in 2 Jahren nicht alles genau machen. Der Unterricht wurde so ausgelegt, damit auch die den Stoff verstanden haben die etwas länger brauchten um den Stoff zu verstehen. Mit h-Dateien haben wir nie gearbeitet (außer eingebunden). Wir haben Beispiele gemacht von normalen Ein/ Ausgabe uber Timer/ Counter bis Interrupt und I2C

Im obigen Link habe ich noch etwas weitergeschaut. Das Inhaltsverzeichniss
http://www.inf.hs-anhalt.de/Service/index.htm#C

sternst
19.11.2009, 10:54
... vom Fachlehrer ... eine C-Zusammenfassung ...Nur - die Ausdrücke Deklaration und Definition hatte der Schlauberger selbst verwendet, aber nicht erklärt *grummel*..
Doch, allerdings etwas versteckt als Nebenbemerkung im Abschnitt "Definition einer Funktion".
Was natürlich auch den unangenehmen Nebeneffekt hat, dass man denken könnte, es beziehe sich nur auf Funktionen.

021aet04
19.11.2009, 11:15
Ist etwas versteckt, stimmt sternst. Habe hier noch etwas http://www.inf.hs-anhalt.de/Service/C-Programmierung/C-Programmierung.htm#Deklaration_und_Definition


....
Die Definition kann später erfolgen. Eine reine Deklaration nennt man auch Vorwärtsdeklaration.

Typ Name(Typ1, Typ2, ..., Typn );

Normalerweise wird die Deklaration gleich mit der Definition der Funktion verbunden.

Typ Name(Typ1 arg1 , Typ2 arg2 , ..., Typn argn )
{
lokale Variable

Anweisungen
}


PS: Das hat nicht mein Fachlehrer geschrieben, sondern wir haben nur einen Ausdruck bekommen.

MfG Hannes

askazo
19.11.2009, 11:17
Umgekehrt!

Definieren = Anlegen
Deklarieren = Bekannt machen

Äähh, sorry ](*,)
War noch früh....

oberallgeier
19.11.2009, 13:30
... Definieren = Anlegen
Deklarieren = Bekannt machen ...Nun müssen wir auch B zum A sagen. Im RNWiki C-Tutorial (http://www.rn-wissen.de/index.php/C-Tutorial) steht eine ganze Menge. Diese Seite wurde bisher 166877 mal abgerufen - scheint also doch auch gelesen zu werden. ABER es gibt natürlich nirgendwo diese hübsche Erläuterung, die wir jetzt so schön geklärt haben. Nicht dass ich SprinterSB, Inrfb2, PicNick, Plasma und all den vielen Co-Autoren Unvollständigkeit vorwerfen möchte, aber jetzt scheint mir die Zeit gekommen, das Tutorial in so einem nicht unwichtigen Punkt zu ergänzen.

Das Inhaltsverzeichnis steht und damit auch die Benummerung der Kapitel. Das sollte also wohl nicht geändert werden - sonst gehen lokale Favoriten oder Forum-Links fehl, das wäre dann doch schlecht. Vermutlich passt das in eine Erweiterung, wohl einen Unterpunkt "Vereinbarungen" zu 2 Aufbau eines C-Programmes im Anschluss an den aktuellen Text (der ist ein kurzes Beispielprogramm).

Wer schreibt die paar Sätze jetzt bitte? Stefan?

sternst
19.11.2009, 14:12
Das Inhaltsverzeichnis steht und damit auch die Benummerung der Kapitel. Das sollte also wohl nicht geändert werden - sonst gehen lokale Favoriten oder Forum-Links fehl, das wäre dann doch schlecht.
Das wäre kein Problem. Direkte Links sehen z.B. so aus:
http://www.rn-wissen.de/index.php/C-Tutorial#Variablen
Da spielt es keine Rolle, wo genau in der Inhalts-Hierarchie das Unterthema "Variablen" gerade steht. Das Einfügen zusätzlicher Kapitel/Absätze ist also völlig unproblematisch.

Ein entsprechender Abschnitt war wohl auch ursprünglich eingeplant, denn in "Variablen" gibt es zwei Links zu dem (nicht existierenden) Unterthema "Deklaration und Definition".


Wer schreibt die paar Sätze jetzt bitte? Stefan?
Och nö, ich bin eher ein "Korrigierer" als ein "Verfasser". ;-)

oberallgeier
19.11.2009, 14:35
Hmm, ich wollte ja nicht fragen - läuft immer auf dasselbe hinaus, auf "... der der frägt ...". Ich versuch mal etwas - wird ne Weile dauern. Dann melde ich mich.

021aet04
20.11.2009, 10:19
Dann hätte wir das auch geklärt. Eine Frage wäre noch. Welche Funktionen würdet ihr noch einbauen, damit man sie als Programmieranfänger leicht verwenden kann? Ich habe mir gedacht dass man einfache Schreib/Lesebefehle wie z.B. setze_bit(PD3) schreibt und das entsprechende Bit gesetzt wird. Ich will das nicht nur für Bit, sondern auch für Nibble und Byte machen. Außerdem möchte ich noch einige Funktionen wie z.B. PWM initialisierung und Anwendung,.... einbauen.

Was würdet ihr noch alles einbauen?

MfG Hannes

oberallgeier
20.11.2009, 10:49
... einfache Schreib/Lesebefehle wie z.B. setze_bit(PD3) schreibt und das entsprechende Bit gesetzt wird ...Das ist in einem Thread von copius durch askazo schön erklärt worden :an dieser Stelle (https://www.roboternetz.de/phpBB2/zeigebeitrag.php?p=457999&sid=a90e97a9ac4e90db16632e98a794a15a#457999)

Daraus habe ich dann das hier gemacht:

#define SetBit(ADDR,BIT) ((ADDR) |= (1<<(BIT))) // Setzt Bit
#define ClrBit(ADDR,BIT) ((ADDR) &= ~(1<<(BIT))) // Löscht Bit
#define ToogleBit(ADDR,BIT) ((ADDR) ^= (1<<(BIT))) // Toogelt Bit
#define IsBitSet(ADDR,BIT) (((ADDR) & (1<<BIT))?1:0) // Fragt Bit = 1?
#define IsBitClr(ADDR,BIT) (!(ADDR) & ~(1<<BIT)) // Fragt Bit = 0?
und dann heissen Beispiele etwa so:

SetBit(PORTC, 5); // LED auf PC5 schalten EIN, HELL
ClrBit(PORTC, 5); // LED auf PC5 schalten AUS, Dunkel
Bei "IsBitSet/IsBitClr" muß bei "ADDR" statt PORTx natürlich PINx geschrieben werden. BIT läuft wie gewohnt von 0 bis 7.

sternst
20.11.2009, 11:07
Daraus habe ich dann das hier gemacht:

#define IsBitClr(ADDR,BIT) (!(ADDR) & ~(1<<BIT)) // Fragt Bit = 0?
IsBitClr funktioniert so garantiert nicht. Mit "& ~" kannst du das fragliche Bit auf gar nichts testen, weil x&0 immer 0 ist, egal ob x nun 0 oder 1 ist.

021aet04
20.11.2009, 11:20
Genau soetwas habe ich mir vorgestellt. Das hätte ich mir gemacht, ich hätte es zwar in eine Funktion geschrieben, aber mit #define ist es besser. Wäre ich nicht drauf gekommen.

Habe eine Lib mit sehr vielen Funktionen gefunden

http://www.mil.ufl.edu/~chrisarnold/components/microcontrollerBoard/AVR/avrlib/

oberallgeier
20.11.2009, 23:49
... IsBitClr funktioniert so garantiert nicht ...Klar - oder vielmehr - hätte ich wissen müssen. Weil ich es getestet hatte - und es hatte nicht funktioniert; das hatte ich auch in der folgenden Codezeile vermerkt. Diese Abfrage braucth man aber auch nicht, wenn IsBitSet nicht wahr ist, dann habe ich ja schon die Antwort. Aber, dumm genug von mir, die Zeile mit der Anmerkung hatte ich beim Zitieren (dafür gibts nun eigentlich keine Entschuldigung) nicht gelesen. Übrigens: in den späteren codes habe ich dieses Statement nicht mehr stehen. Mit zwei Wörtern: dumm gelaufen. Und wieder habe ich gezeigt, wie wenig ich kann :( bzw. wie viel - ähhh - Fehler ich mache.

021aet04
21.11.2009, 11:57
Jeder macht mal Fehler