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
makefile erstellen und dann im PN unter Tools > Make All ... siehe auch http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial/Exkurs_Makefiles
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/.
1 | #include <signal.h> |
musst du in
1 | #include <avr/signal.h> |
ändern, die anderen includes entsprechend. Oliver
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
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
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.