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
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.
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
@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>
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.
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.
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
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.
>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/.
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.
@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.
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.
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
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
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.