C Wie fügt man Hauptdatei, source Datei, header Datei und Definitionen zusammen?

Folienkondensator

Neues Mitglied
28. Mai 2012
89
0
0
Sprachen
  1. ANSI C
  2. Assembler
Hallo

Ich quäle mich seit einigen Wochen mit einem at90CAN128 herum.
Den at90CAN brauche ich zum CAN signale senden und empfangen. Leider gibt es im Netz nur wenig wirklich nützliche Informationen darüber.
Heute habe ich eine Seite gefunden die recht vielversprechend aussieht.

http://blog.cc-robotics.de/2009/04/07/beispiel-can-bus-testapplikation-fr-at90can128/

Hier werden 4 Dateien angeboten die man "ganz einfach" zusammenfügen kann. Und genau da liegt mein Problem.
Ich habe vor einem Jahr schon mal ein Thema eröffnet mit der Frage, wie man Makefiles benutzt. Leider ist da nichts gutes dabei heraus gekommen.
Jetzt meine Frage. Weis jemand wie man diese 4 Dateien sinnvoll zusammenfügt? Die .h Dateien sind nicht das große Problem. (ich hab sie einfach mit in den include Ordner kopiert wie immer)
Nur, was mache ich mit der at90can.c Datei und der main.c Datei. Und wieso sind in beiden .c Dateien die selben includes verbaut? meines wissens nach verursachen doppelte includes nur Fehler. oder nicht?

In welcher Reihenfolge fügt man die 4 Dateien zusammen, und vorallem, WIESO in dieser Reihenfolge. und wieso gibt es zwei .c Dateien? könnte man das nicht in eine schreiben?

Wäre super wenn mir das mal jemand erklären könnte. ich stehe nämlich dauernd vor genau diesem Problem. :eek:

Danke im vorraus

Gruß
Folienkondensator
 
Hallo,

ich nehme an du verwendest Atmel Studio?!


Ein eigenes makefile benötigst du wahrscheinlich nicht. Du erstellst ein neues Projekt. Im Solution Explorer gehtst du auf das Projekt und wählst mit rechter Maustaste aus "Add/Existing Item ...". Du fügst nun alle .c und .h Dateien hinzu.
In main.c wird sicherlich das Hauptprogramm "int main(void)" sein. Der Compiler erkennt dies. Die Reihenfolge, wie die Dateien hinzugefügt werden, ist egal.

Damit einem a_datei.c Funktionen bekannt sind, die in einem anderen b_datei.c definiert sind, muss man die Prototypen der Funktionen bekannt machen. Diese sind i.d.R. im b_datei.h eines b_datei.c definiert. Das erreicht man dann durch #include "b_datei.h" in a_datei.c

Das hört sich im Moment vielleicht kompliziert an, ist es aber nicht.

Ein Projekt erstellt man dann nicht in einer einzelnen Datei, wenn der Soucecode zu groß wird. Es ist wie bei großen Kleiderschränken, die haben oft auch mehrere Schubfächer ;) Es ist auch dann sinnvoll, wenn sich das Projekt in Bereiche unterteilen läßt (CAN, Display, Tastatur ... Socken, Unterwäsche, Hemden :D ...)

Dirk :ciao:
 
Hallo Dirk

Hat super funktioniert. Danke! :)

Das Programm wurde bis auf einen Fehler problemlos kompiliert.
Kann es sein dass AVRstudio 6 ein Problem mit "const prog_char" hat? bzw, kann es sein dass dieser Befehl nicht in der pgmspace.h mit drinnen ist?
Das programm schien mit AVRstudio 4.1.4 zu funktionieren (laut Internet)
Oder kann man den Befehl einfach durch das gewöhnliche "const char" ersetzen?

Fehler unten rot markiert.

Grüße
Folienkondensator

Code:
//  CPU speed
#define F_CPU 16000000UL

#define CAN_DDR DDRD
#define CAN_RX 6
#define CAN_TX 5

//  message objects
#define NR_MOBS 15		// number of message objects
#define NOMOB   0xff


//  global structs and variables
typedef struct
	{	
		uint16_t id;			//  MSG ID 11 Bit                  
		uint16_t msk;        	//  Mask for ID 11 Bit          
		uint8_t length;   		//  DLC length
		uint8_t data[8];  		//  Data field 8 Byte
	}CAN_messageType;           //  CAN 2.0 A message 11 Bit

// globale Varaiabe für empfangene CAN-Botschaft
CAN_messageType recMsg;

//CAN speed-settings for 16MHz
[COLOR="#FF0000"]const prog_char _at90can_cnf[8][3] = {[/COLOR]
	// 10 kbps
	{	0x7E,
		0x6E,
		0x7F
	},
	// 20 kbps
	{	0x62,
		0x0C,
		0x37
	},
	// 50 kbps
	{	0x26,
		0x0C,
		0x37
	},
	// 100 kbps
	{	0x12,
		0x0C,
		0x37
	},
	// 125 kbps
	{	0x0E,
		0x0C,
		0x37
	},
	// 250 kbps
	{	0x06,
		0x0C,
		0x37
	},
	// 500 kbps
	{	0x02,
		0x0C,
		0x37
	},
	// 1 Mbps
	{	0x00,
		0x0C,
		0x37
	}
};

//  external functions
extern void delay_ms(uint16_t period);	 //delay routine (milliseconds)
 
Hallo,

probiere es einmal mit

Code:
static const uint8_t _at90can_cnf[8][3] PROGMEM = {


Dirk :ciao:
 
Hallo Dirk

Also ich habs jetzt mit folgender benennung zum laufen gebracht:

Code:
const char _at90can_cnf[8][3] PROGMEM = {

Gruß
Folienkondensator
 
Ja super!

Dann kannst du ja nun eigentlich in deinen Benutzereinstellungen bei "Sprachen" noch "C" hinzufuegen :D

Dirk :ciao:
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)