Forum: Compiler & IDEs Brauche Hilfe zu "C"


von Old P. (Gast)


Lesenswert?

Hallo,

die ganze Programmiererei, nochdazu in "C", ist mir nie ganz geheuer. 
Mit Bascom komme ich zumindest im Ansatz klar, doch das ganze 
verschachtelte Geraffel in "C" ist mir schleierhaft.
Ich habe also eine Datei *.c und eine  *.h. Dann habe ich mir WinAVR 
installiert und nu? Wie baue ich aus den beiden Dateien eine *.hex?
Bisher bekomme ich nur Fehlermeldungen, deren Inhalt mir soviel sagt, 
wie ein Schnittmusterbogen (wenn den noch jemand kennt ;) )

Ach ja, ich wollte dieses Dingens hier mal nachbauen: 
Beitrag "ADC mit Multiplexanzeige"

Old-Papa

von Justus S. (jussa)


Lesenswert?

makefile erstellen und dann im PN unter Tools > Make All ...

siehe auch 
http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Exkurs_Makefiles

von SF (Gast)


Lesenswert?

Am einfachsten geht es wenn du das Beispiel Makefile aus deiner WinAVR 
Installation, das du unter WinAVR\sample findet, in dein 
Projektverzeichnis kopierst, also da wo sich ADC.H und ADC.C befinden 
kopierst.

Danach öffnetst du es mit einem Texteditor und änderst MCU = irgendetwas 
auf den µController Typ, den du verwendest. Also hier MCU = attiny26.

Danach must du das richtige F_CPU auswählen. Leider hat Peter nicht 
angeben auf welcher Frequenz der Tiny laufen soll. Da aber kein Quarz 
angeschlossen ist, ist es der interne Oszillator und im Quelltext, bei 
der ADC Initialisierung schreibt er "1MHz/8 = 125kHz = 104æs 
conversion". Also wird der Tiny auf 1Mhz laufen. Das ist die 
Defaultkonfiguration vom Tiny. Man braucht also die Fuses nicht zu 
verändern. Die gefundenen 1MHZ musst du nun bei F_CPU eintragen: F_CPU = 
1000000

Jetzt must du nur noch den Dateinamen, der Datei.c unter TARGET = 
eintragen, in der sich die main() Funktion befindet. Also ADC.C:

TARGET = ADC

Das .c wird hier weggelassen! Jetzt ist dein Makefile passend für dein 
Projekt konfiguriert. Wenn du jetzt eine Kommandozeile in deinem 
Projektordner öffnest, so kannst du durch Eintippen von make das Projekt 
kompilieren.

Nur wird du danach eine Menge Fehlermeldungen sehen. Das kommt weil das 
Projekt aus dem Jahr 2005 stammt und für eine ältere Version des 
Compilers gedacht ist. Das muss man jetzt noch anpassen.

Als erstes muss man die veralteten Headerdateien in adc.h anpassen.

#include<signal.h> kanst du löschen. Aus #include<interrupt.h> und 
#include<io.h> machst du #include<avr/interrupt.h> und 
#include<avr/io.h>.

Nochmal make eintippen. Jetzt läuft der Compiler ohne Fehlermeldungen 
durch und du hast eine adc.hex Datei in deinem Projektordner.

von Peter D. (peda)


Lesenswert?

Mit Makefiles habe ich noch nie was gemacht.
Installiere einfach AVRStudio, das ist narrensicher.

F_CPU kann man als Kommandozeilenoption angeben oder direkt in der 
Source, wenn es benutzt wird.
Ich benutze aber XTAL als Frequenzangabe, schon lange bevor WINAVR F_CPU 
einführte.


Peter

von Old P. (Gast)


Lesenswert?

@SF (Gast)
So, habe alles genau so wie Du beschrieben hast gemacht. Ergebnis: 
Dutzende Fehlermeldungen.... <grrrrr>

s. unten....

Microsoft Windows XP [Version 5.1.2600]
(C) Copyright 1985-2001 Microsoft Corp.

Z:\Elektronik\Projekte\Panelmeter\ATtiny26-Voltmeter>make

-------- begin --------
avr-gcc (WinAVR 20100110) 4.3.3
Copyright (C) 2008 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is 
NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR 
PURPOSE.


Compiling C: ADC.c
avr-gcc -c -mmcu=attiny26 -I. -gdwarf-2 -DF_CPU=1000000UL -Os 
-funsigned-char -f
unsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes 
-Wa,-ad
hlns=./ADC.lst  -std=gnu99 -MMD -MP -MF .dep/ADC.o.d ADC.c -o ADC.o
In file included from ADC.c:9:
adc.h:9:1: error: unterminated comment
ADC.c:25: warning: return type defaults to 'int'
ADC.c:25: warning: function declaration isn't a prototype
ADC.c: In function 'SIGNAL':
ADC.c:25: warning: type of 'SIG_OVERFLOW1' defaults to 'int'
ADC.c:26: error: 'PORTB' undeclared (first use in this function)
ADC.c:26: error: (Each undeclared identifier is reported only once
ADC.c:26: error: for each function it appears in.)
ADC.c:26: error: 'unused0' undeclared (first use in this function)
ADC.c:26: error: 'unused1' undeclared (first use in this function)
ADC.c:27: error: 'ADCSR' undeclared (first use in this function)
ADC.c:27: error: 'ADEN' undeclared (first use in this function)
ADC.c:27: error: 'ADSC' undeclared (first use in this function)
ADC.c:27: error: 'ADIF' undeclared (first use in this function)
ADC.c:27: error: 'ADIE' undeclared (first use in this function)
ADC.c:27: error: 'ADPS1' undeclared (first use in this function)
ADC.c:27: error: 'ADPS0' undeclared (first use in this function)
ADC.c: At top level:
ADC.c:36: warning: return type defaults to 'int'
ADC.c:36: warning: function declaration isn't a prototype
ADC.c:35: error: redefinition of 'SIGNAL'
ADC.c:25: error: previous definition of 'SIGNAL' was here
ADC.c: In function 'SIGNAL':
ADC.c:36: warning: type of 'SIG_ADC' defaults to 'int'
ADC.c:37: error: expected '=', ',', ';', 'asm' or '__attribute__' before 
'adc_su
m'
ADC.c:37: error: 'adc_sum' undeclared (first use in this function)
ADC.c:38: error: expected '=', ',', ';', 'asm' or '__attribute__' before 
'count'

ADC.c:38: error: 'count' undeclared (first use in this function)
ADC.c:39: error: 'u8' undeclared (first use in this function)
ADC.c:39: error: expected ';' before 'i'
ADC.c:41: error: 'ADC' undeclared (first use in this function)
ADC.c:46: error: 'adc_val' undeclared (first use in this function)
ADC.c:50: error: 'i' undeclared (first use in this function)
ADC.c:53: error: 'PORTA' undeclared (first use in this function)
ADC.c:53: error: 'digit' undeclared (first use in this function)
ADC.c:54: error: 'PORTB' undeclared (first use in this function)
ADC.c:54: error: 'pin_d0' undeclared (first use in this function)
ADC.c:55: warning: 'return' with no value, in function returning 
non-void
ADC.c:59: error: 'pin_d1' undeclared (first use in this function)
ADC.c:60: warning: 'return' with no value, in function returning 
non-void
ADC.c:64: error: 'pin_d2' undeclared (first use in this function)
ADC.c:65: warning: 'return' with no value, in function returning 
non-void
ADC.c:68: error: 'pin_d3' undeclared (first use in this function)
ADC.c: In function 'init':
ADC.c:77: error: 'DDRB' undeclared (first use in this function)
ADC.c:77: error: 'pin_d0' undeclared (first use in this function)
ADC.c:77: error: 'pin_d1' undeclared (first use in this function)
ADC.c:77: error: 'pin_d2' undeclared (first use in this function)
ADC.c:77: error: 'pin_d3' undeclared (first use in this function)
ADC.c:78: error: 'PORTB' undeclared (first use in this function)
ADC.c:78: error: 'unused0' undeclared (first use in this function)
ADC.c:78: error: 'unused1' undeclared (first use in this function)
ADC.c:79: error: 'DDRA' undeclared (first use in this function)
ADC.c:80: error: 'TCCR1B' undeclared (first use in this function)
ADC.c:80: error: 'CS11' undeclared (first use in this function)
ADC.c:80: error: 'CS10' undeclared (first use in this function)
ADC.c:81: error: 'TIMSK' undeclared (first use in this function)
ADC.c:81: error: 'TOIE1' undeclared (first use in this function)
ADC.c:82: error: 'ADMUX' undeclared (first use in this function)
ADC.c:82: error: 'REFS1' undeclared (first use in this function)
ADC.c:82: error: 'MUX3' undeclared (first use in this function)
ADC.c: At top level:
ADC.c:89: error: expected ')' before 'val'
ADC.c: In function 'main':
ADC.c:125: warning: implicit declaration of function 'sei'
ADC.c:128: warning: implicit declaration of function 'dec_out'
ADC.c:128: error: 'adc_val' undeclared (first use in this function)
ADC.c:128: error: 'u32' undeclared (first use in this function)
make: *** [ADC.o] Error 1

Z:\Elektronik\Projekte\Panelmeter\ATtiny26-Voltmeter>

von Old P. (Gast)


Lesenswert?

@Peter,

AVR-Studio habe ich drauf, nur wie erzeuge ich damit aus *.c und *.h 
eine Exe?

Old-Papa

von Sven P. (Gast)


Lesenswert?

Bei den allermeisten C-Kompilern kannst du dir eine Sache hinters Ohr 
schreiben: Wenn eine Million Fehlermeldungen kommen, lies die allererste 
und vergiss die anderen.

von Karl H. (kbuchegg)


Lesenswert?

Guido S. schrieb:
> @Peter,
>
> AVR-Studio habe ich drauf, nur wie erzeuge ich damit aus *.c und *.h
> eine Exe?

AVR-Studio starten

Neues Projekt

C-Projekt

Prozessor auswählen, Simulator auswählen

grummel, grummel, grummel  AVR Studio legt alles an.

Source Code reinkopieren.
Wenns mehere Files sind, jedes einzelne mit 'Add existing File' zum 
Projekt hinzufügen. Compilieren lassen, linken lassen, fertig.

von Old P. (Gast)


Lesenswert?

So, habe es wohl hin bekommen <freu>

Habe das wie Karl-Heinz schreibt gemacht (ohne es gelesen zu haben, 
einfach gesunden Menschenverstand genommen ;) )
Zunächst gab es noch ein paar Fehlermeldungen, die erste war das mit 
#include<signal.h>
Das also geändert in //#include<signal.h> (und schon gab es "nur" noch 
Warnungen.

Mal sehen obs die hex tut....

Old-Papa

von Karl H. (kbuchegg)


Lesenswert?

Guido S. schrieb:

> Zunächst gab es noch ein paar Fehlermeldungen, die erste war das mit
> #include<signal.h>
> Das also geändert in //#include<signal.h> (und schon gab es "nur" noch
> Warnungen.

Die in diesem Fall allerdings Ernst zu nehmen sind.
So wie der Code geschrieben ist, ist das alter Code. Und der braucht die 
signal.h.
Sonst wirds nichts mit den Interrupt Handlern.

von Oliver (Gast)


Lesenswert?

>Das also geändert in //#include<signal.h> ...

Dank Peters (Ex-Un-)Sitte, die Pfade der Standard-WinAVR-Installation zu 
vermurksen, kommen da diese Fehlermeldungen.

Bei den System-Includes fehlt überall ein avr/.
1
#include <signal.h>
 musst du in
1
#include <avr/signal.h>
 ändern, die anderen includes entsprechend.

Oliver

von SF (Gast)


Lesenswert?

Im zweiten Teil meiner Anleitung hatte ich ja auch geschrieben, was noch 
zu machen ist. Es lohnt sich manchmal auch einen längeren Post komplett 
durchzulesen.

>Nur wird du danach eine Menge Fehlermeldungen sehen. Das kommt weil das
>Projekt aus dem Jahr 2005 stammt und für eine ältere Version des
>Compilers gedacht ist. Das muss man jetzt noch anpassen.
>
>Als erstes muss man die veralteten Headerdateien in adc.h anpassen.
>
>#include<signal.h> kanst du löschen. Aus #include<interrupt.h> und
>#include<io.h> machst du #include<avr/interrupt.h> und
>#include<avr/io.h>.

Signal.h ist nicht nötig. Das was da drin stand wurde alles in 
avr/interrupt.h integriert. Ich hatte nach dem obigen Kochrezept keine 
Compilerfehler oder Warnungen mehr. Auch keine nicht aufgelöste 
Abhängigkeiten.

von Old P. (Gast)


Lesenswert?

@SF (Gast)

jou, genau das hatte ich ja auch step-by-step gemacht und dann die lange 
Liste mit den Fehlermeldungen bekommen.
Und Ja, wenn mir jemand hilft, lese ich immer alles bis zum Ende ;-)))

Jetzt mit der belassenen, aber geänderten <avr/signal.h> wurde unter 
Avr-studio zumindest nichts mehr direkt angemeckert, "nur" 2 
Warnungen....

Ob das so geht, sehe ich erst in einigen Tagen, muss erstmal andere 
Projekte beenden (mein Tisch ist schon übervoll....)

Old-Papa

Update

ich habe das jetzt nochmal mit make versucht. Merkwürdig, gleiche 
Dateien, signal.h wieder auskommentiert (//) und keine Fehlermeldung 
mehr. Warum vorhin mit exakt der gleichen Vorgehensweise diese lange 
Liste erschien, ist mir ein Rätsel.

von SF (Gast)


Lesenswert?

Dann hattest du eventuell vergessen die geänderte adc.h wieder 
abzuspeichern. Das passiert schon mal. :-)

Man sucht stundenlang nach Fehlern, die schon längst behoben sind und 
plötzlich funktioniert alles und man kann sich danach nur noch total 
verwirrt am Kopf kratzen ...

Ich dachte eben für einen kurzen Moment auch, ich hätte was bei der 
Anleitung übersehen und es deshalb sicherheitshalber nochmal neu 
ausprobiert.

Es sind oft irgendwelche Kleinigkeiten die zwischen Erfolg und Blamage 
liegen.

Oft kann der Texteditor den man zum Editieren des Quelltext benutzt, so 
konfiguriert werden, das er make aufruft und vorher auch alle geänderten 
Dateien abspeichert. Dann kann so was (fast) nicht mehr passieren.

Wenn man den makefile Mechanismus einmal verstanden hat, so hat man 
damit ein äußerst potentes Werkzeug das der AvrStudio IDE haushoch 
überlegen ist. Vor allem wenn man etwas komplexere Projekte oder damit 
zusammenhängende Arbeitsabläufe hat, die automatisiert werden sollen.

Man muss das makefile auch nicht bei jeden neuen Projekt von Grund auf 
neu erstellen oder verstehen. Oft kopiere ich ein funktionierendes 
makefile von einem meiner alten Projekte und ändere es für eine neues 
Projekt ab. Oder ich benutze das Winavr-Beispiel, um damit auch die 
"neusten" Compilerschalter mitzubekommen, die gerade bei avr-gcc in Mode 
sind.

von Old P. (Gast)


Lesenswert?

Nicht abgespeichert eher nicht. Als ich das dann mit AVR-Studio gemacht 
hatte, musste ich die #include<signal.h> ja erst wieder auskommentieren. 
Da stand schön sauber //#include<signal.h> drin.
Aber vielleicht ist irgendwas Anderes gaga gegangen....

Wenn Du Dich so gut auskennst, der Autor hatte ja 2 
Siebensegmenttabellen und unterschiedliche Beschaltung für 0,2 und 1,3 
benutzt.
Da ich ganz andere Einzeldisplays einsetze, ist das Routing jetzt ein 
Krampf. Kann man das rückgängig machen? Klar kann man, nur iche eher 
nicht... :-(
Irgendwo in der ADC.h, ja, nur ich brauche mal einen "Anfangsverdacht"
Ich möchte also alle "a", alle "b" usw. wie immer als Bus verdrahten.

Old-Papa

von Peter D. (peda)


Lesenswert?

Hier:
1
#define _0A     0x02
2
#define _0B     0x04
3
#define _0C     0x40
4
#define _0D     0x10
5
#define _0E     0x08
6
#define _0F     0x01
7
#define _0G     0x20
8
#define _0DP    0x80
9
10
#define _1A     0x40
11
#define _1B     0x80
12
#define _1C     0x04
13
#define _1D     0x02
14
#define _1E     0x01
15
#define _1F     0x10
16
#define _1G     0x20
17
#define _1DP    0x08


Peter

von Old P. (Gast)


Lesenswert?

Hmmm,

verstehe ich richtig, wenn ich jetzt beide Tabellen gleich belege?
Oder sollte eine gelöscht werden? Dann ist doch sicher noch was zu 
ändern....

Old-Papa

von Bernd N (Gast)


Angehängte Dateien:

Lesenswert?

Du brauchst nur eine Tabelle und passt die an deine Gegebenheiten an.

Ich hab dir mal nen WIN AVR Projekt angehangen, habe mich mit der 
Schaltung auch mal beschäftigt und eine andere Tabelle verwendet... sind 
noch ein paar kleine Änderungen drin :-)

Achtung !!! Spannungsteiler ist bei mir 10:1.

von Old P. (Gast)


Lesenswert?

Hallo Bernd,

herzlichen Dank für die Dateien. Ich werde aber erst in einigen Tagen 
dazu kommen.

Gruß
Old-Papa

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.