Hallo,
und Zwar hab ich ein Problem, mit den Atmega328 - PU.
Umgebung: AtmelStudio 7.
C code
1
2
#include<avr/io.h>
3
#include<util/delay.h>
4
5
intmain(void)
6
{
7
DDRB=0xFF;
8
PORTB=0X00;
9
_delay_ms(200);
10
PORTB=0xFF;
11
/* Replace with your application code */
12
while(1)
13
{
14
PORTB=0X00;
15
_delay_ms(200);
16
PORTB=0xFF;
17
}
18
return0;
19
}
die F_CPU=16000000 hab ich in den Symbols Deklariert.
Wenn ich die F_CPU in Code Deklariere, Bekomme ich eine Warnung mit :
"F_CPU not defined for <util/delay.h>".
Beim ausführen des Debugers bleibt der code bei _delay_ms() hängen.
und auch auf den Board wir Der code bis _delay_ms(200) ausgeführt und
dan bleibt er hängen habt ihr vlt Abhilfe ?
Danke für Eure Hilfe.
Dominik schrieb:> die F_CPU=16000000 hab ich in den Symbols Deklariert.
Da ist entweder ein Tippfehler drin oder es kommt beim C-Compiler nicht
an.
Auch Atmel Studio kann die komplette Kommandozeile ausspucken die beim
Kompilieren ausgeführt wird. Schau Dir die mal genau an.
Dominik schrieb:> die F_CPU=16000000 hab ich in den Symbols Deklariert.
Ein Screenshot wäre hilfreich. Vergiss nicht, diese Definition sowohl
für Debugging als auch Release einzutragen.
Jim M. schrieb:> Auch Atmel Studio kann die komplette Kommandozeile ausspucken die beim> Kompilieren ausgeführt wird. Schau Dir die mal genau an.
Wie bekomme ich die angezeigt ?
von define (Gast)
>in meinem Code ist die korrekte definition für den Takt:>#define F_CPU 4000000UL>Grüße (:
hab ich schon versucht mit #define F_CPU 16000000UL.
Bekomme "F_CPU not defined for <util/delay.h>".
Danke schon mal.
define schrieb:> in meinem Code ist die korrekte definition für den Takt:
Darum gehts nicht, ein #define im C-Code einfügen kann jeder.
Es geht darum, diese Definition projektweit anzulegen, damit man das
nicht in allen C-Modulen separat machen muss. Ein Projekt kann nämlich
durchaus aus mehr als einem C-Modul bestehen.
Target "PreBuildEvent" skipped, due to false condition; ('$(PreBuildEvent)'!='') was evaluated as (''!='').
5
Target "CoreBuild" in file "F:\Atmel\Studio\7.0\Vs\Compiler.targets" from project "E:\Projekte\Testprojekt\atemga 328p\GccApplication3\GccApplication3\GccApplication3.cproj" (target "Build" depends on it):
6
Task "RunCompilerTask"
7
Shell Utils Path F:\Atmel\Studio\7.0\shellUtils
8
F:\Atmel\Studio\7.0\shellUtils\make.exe all --jobs 8 --output-sync
9
make: Nothing to be done for 'all'.
10
Done executing task "RunCompilerTask".
11
Task "RunOutputFileVerifyTask"
12
Program Memory Usage : 160 bytes 0,5 % Full
13
Data Memory Usage : 0 bytes 0,0 % Full
14
Done executing task "RunOutputFileVerifyTask".
15
Done building target "CoreBuild" in project "GccApplication3.cproj".
16
Target "PostBuildEvent" skipped, due to false condition; ('$(PostBuildEvent)' != '') was evaluated as ('' != '').
17
Target "Build" in file "F:\Atmel\Studio\7.0\Vs\Avr.common.targets" from project "E:\Projekte\Testprojekt\atemga 328p\GccApplication3\GccApplication3\GccApplication3.cproj" (entry point):
18
Done building target "Build" in project "GccApplication3.cproj".
define schrieb:> #define F_CPU 4000000UL>> #include <avr/io.h>> #include <util/delay.h>>> das Define muss vor dem Include kommen. Ich bekomme die selbe> Fehlermeldung wenn ich das Define nach dem Include mache.>> Vllt ist es das?
Nein das Funktioniert eben auch nicht. das wahr mein erster versuch,
dann hab ich gelesen mann soll es in Symbols eintragen.
Zeig den nicht funktionierenden Code mit F_CPU define, oder einen
Screenshot von den Symboleinstellungen. Alles andere hilft nicht weiter.
Oliver
P.S. wenn du das define in den Code schreibst, muß das VOR
#include <util/delay.h>
Stehen.
Ich würde wenn das delay funktioniert aber nach dem Port einschalten ein
weiteres delay machen, sonst wird deine aufgeschlossene Last kaum
funktionieren
Oliver S. schrieb:> Zeig den nicht funktionierenden Code mit F_CPU define, oder einen> Screenshot von den Symboleinstellungen. Alles andere hilft nicht weiter.>> Oliver> P.S. wenn du das define in den Code schreibst, muß das VOR> #include <util/delay.h>> Stehen.
Komisch ist jetzt, das ich keine Warnung mehr habe.
Aber es funktioniert trotzdem nicht.
Dominik schrieb:> die F_CPU=16000000 hab ich in den Symbols Deklariert.
Falsch. F_CPU muss ein Makro sein, also per #define im Code oder per
-DF_CPU=xxx bei den Optionen.
Ein Symbol ist was anderes, das würde man per -Wl,--defsym,F_CPU=xxx
definieren.
Johann L. schrieb:> Dominik schrieb:>> die F_CPU=16000000 hab ich in den Symbols Deklariert.>> Falsch. F_CPU muss ein Makro sein, also per #define im Code oder per> -DF_CPU=xxx bei den Optionen.>> Ein Symbol ist was anderes, das würde man per -Wl,--defsym,F_CPU=xxx> definieren.
Johann L. schrieb:> Falsch. F_CPU muss ein Makro sein, also per #define im Code oder per> -DF_CPU=xxx bei den Optionen.
Das passt schon, die IDE (und alle anderen, die die Optionsdialoge bei
Eclipse abgeschaut haben) nennt das halt Symbol.
Oliver
Oliver S. schrieb:> Johann L. schrieb:>> Falsch. F_CPU muss ein Makro sein, also per #define im Code oder per>> -DF_CPU=xxx bei den Optionen.>> Das passt schon, die IDE (und alle anderen, die die Optionsdialoge bei> Eclipse abgeschaut haben) nennt das halt Symbol.
Prima. Und Symbole heißen wie? Vermutlich "Macros" oder "Defines"...
Dominik schrieb:> Aber es funktioniert trotzdem nicht.
Woher du wissen?
Da der Screenshot allerdings die Optionen für Configration Debug zeigt,
vermute ich mal, daß du ohne Optimierung kompilierst. Das sollte dann a)
doch eine Warnung vom Preprozessor geben, und b) funktioniert das Delay
dann nicht, wie erwartet. RTFM.
Oliver
Dominik schrieb:> Aber es funktioniert trotzdem nicht.
Was heisst das: Dauern die Delays jetzt vielleicht 16 mal so lang?
Die AVR-Delay-Funktionen funktionieren nur dann korrekt, wenn man die
Optimierung eingeschaltet hat. Also: Stell das Projekte mal auf
"Release" statt "Debug" um.
Noch etwas: Ist Dein µC per Fuses überhaupt auf Quarzbetrieb umgestellt?
Wenn nicht, läuft der nämlich mit internem 8MHz-Oszillator-Takt.
Und dann gibt es noch die CKDIV8 Fuse: Wenn Du diese nicht deaktivierst,
wird der Takt nochmal durch 8 geteilt und Dein µC rennt nur mit einem
Achtel, also lediglich 1MHz. Das ist die Standard-Einstellung jedes
fabrikneuen AVRs.
Fazit: Wenn Du die Fuses nicht korrekt konfigurierst, dauert jeder Delay
tatsächlich 16-mal so lang wie Du erwartest.
Fuses :
EXTENDED : 0xFD
HIGH : 0xD6
LOW : 0XFF
Board: Arduino Uno. nur als test Board.
Der uc macht Gar nichts er führt DDRB = 0xFF und PORTB = 0x00 aus.
dan friert er ein und macht gar nichts mehr.
define schrieb:> Dass du teilweise ein großes 0X statt klein 0x benutzt wenn du> Hex-Values zuweist stört nicht?Dominik schrieb:> Fuses :> EXTENDED : 0xFD> HIGH : 0xD6> LOW : 0XFF
war ein Tipp fehler
Dominik schrieb:> Fuses : EXTENDED : 0xFD> HIGH : 0xD6> LOW : 0XFF
Laut Fusecalc
http://eleccelerator.com/fusecalc/fusecalc.php?chip=atmega328p&LOW=FF&HIGH=D6&EXTENDED=FD&LOCKBIT=FF
sieht das gut aus.
> Der uc macht Gar nichts er führt DDRB = 0xFF und PORTB = 0x00 aus.> dan friert er ein und macht gar nichts mehr.
Woran erkennst Du das? Am Verhalten im Debugger? Wie gesagt: _delay_ms()
ist ohne Compiler-Optimierung unbrauchbar. Da gibt es hier zig Threads
zu diesem Thema.
Frank M. schrieb:> Woran erkennst Du das? Am Verhalten im Debugger? Wie gesagt: _delay_ms()> ist ohne Compiler-Optimierung unbrauchbar. Da gibt es hier zig Threads> zu diesem Thema.
ich hab schon Opzimize -O1 und -Os getestet.
Release ist gestellt.
hast du sonnst noch einen tipp ?
ich versuche es jetzt mal auf Laptop, mal sehen.
Ich habe es mal getestet - auch im Debugger funktioniert es (dauert halt
einige Sekunden und keine 200 ms). Bei Symbols trage ich
F_CPU=16000000UL ein.
Vielleicht Atmel Studio mal updaten / neu installieren?
Edit: Stottermodus aus :-)
Hugo H. schrieb:> Ich habe es mal getestet - auch im Debugger funktioniert es> (dauert halt> einige Sekunden und keine 200 ms). Bei Symbols trage ich> F_CPU=16000000UL ein.>> Vielleicht Atmel Studio mal updaten / neu installieren?>> Edit: Stottermodus aus :-)
ich hab jetzt AtmelStudio neu installiert.
Es hat nichts gebracht, wie gesagt auf Laptop ohne Probleme nur das die
Version Älter ist.
Die entsprechende Bibliothek installiert ? Atmel Studio hat die
Eigenschaft alles ins Projekt zu kopieren.
F_CPU=16000000 muss vor den inkludieren der delay.h stehen. Und sie
funktioniert nicht mit Optimierung !
Dominik schrieb:> while (1)> {> PORTB = 0X00;> _delay_ms(200);> PORTB = 0xFF;> }
Ist das wirklich noch dieser Code? Dann fehlt ein zweites Delay, sonst
ist der zeitliche Abstand zwischen PORTB=0xff und PORTB=0x00 etwas
klein.
Ich bin grad über den Beitrag gestolpert, also schlagt mich nicht, wenn
ich falsch liege. Bei mir musste ich im Atmel Studio 7 im Fenster der
Solution (hier "Pipe1") unter "Toolchain" bei "Symbols" den F_CPU-Wert
eintragen. Die ganzen anderen #define-Anweisungen im Programm hatten
nichts gebracht.
Im übrigen hat Dominik wohl recht ;).
Marco H. schrieb:> Das habe ich schon mitbekommen und selbst geprüft das diese> Aussage falsch war....
Seltsam. Ich habe delay immer mit Optimierung benutzt und hatte damit
nie Probleme. Es passt auch zur Doku:
https://www.nongnu.org/avr-libc/user-manual/group__util__delay.html
"In order for these functions to work as intended, compiler
optimizations must be enabled"
Uwe Grassmé schrieb:> Die ganzen anderen #define-Anweisungen im Programm hatten nichts> gebracht.
Wichtig ist, dass F_CPU vor dem #include <util/delay.h> definiert ist.
Ob man das nun per #define F_CPU eine Zeile davor schreibt oder auf
globaler Ebene im Makefile bzw. Projekt, bleibt sich gleich.
Du bekommst allerdings auch eine Warnung, wenn du das nicht richtig
gemacht hast. Ab da wird mit der Voreinstellung von 1 MHz weiter
gearbeitet, die für viele AVRs im Auslieferungszustand passend ist.
Stefan ⛄ F. schrieb:> Ich habe delay immer mit Optimierung benutzt und hatte damit nie> Probleme.
Kann auch nicht anders sein. All diese "convenience functions"
(_delay_us() und _delay_ms()) sollen halt "convenient" zu benutzen sein.
Daher akzeptieren sie eben statt einer festen Anzahl von Zyklen (wie in
<util/delay_basic.h>) eine Kombination aus einer als Gleitkommazahl
angebbaren Verzögerungsdauer sowie einer als Gleitkommazahl angebbaren
Frequenz. Es gibt ja bspw. Quarze mit 7.372 MHz, die kann man als
1
#define F_CPU 7.372E6
angeben. Damit die Gleitkomma-Rechnung aber nicht auf den Code
durchschlägt, muss man natürlich die Compileroptimierungen aktiv haben.
(Meines Erachtens sollte man Microcontroller-Code sowieso nie ohne
Optimierungen benutzen, auch zum Debuggen, aber das ist eine andere
Sache und würde den Rahmen dieses Threads sprengen.)
Dominik schrieb:> Oliver S. schrieb:>> Zeig den nicht funktionierenden Code mit F_CPU define, oder einen>> Screenshot von den Symboleinstellungen. Alles andere hilft nicht weiter.>>>> Oliver>> P.S. wenn du das define in den Code schreibst, muß das VOR>> #include <util/delay.h>>> Stehen.>>> Komisch ist jetzt, das ich keine Warnung mehr habe.>> Aber es funktioniert trotzdem nicht.
Doch, es funktioniert alles perfekt - auch das Übersetzen. Du solltest
aber Deine schleife entweder so
1
while(1)
2
{
3
PORTB=0x00;
4
_delay_ms(200);
5
PORTB=0xff;
6
_delay_ms(200);// sonst wird ja sofort wieder umgeschaltet
Ingo E. schrieb:> Doch, es funktioniert alles perfekt> Dominik schrieb:
… am 6. Januar, muss man hier ergänzen.
Es hat nicht viel Sinn, jetzt wieder auf alle möglichen Altbeiträge hier
zu antworten.