AtmelStudio 7 util/delay.h funktioniert nicht

Gast #6096910
Lesenswert?

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
int main(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
  return 0;
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.
Gast #6096956
Lesenswert?

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.
Gast #6096960
Lesenswert?

Output von Build :
1
------ Build started: Project: GccApplication3, Configuration: Debug AVR ------
2
Build started.
3
Project "GccApplication3.cproj" (default targets):
4
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".
19
Done building project "GccApplication3.cproj".
20

21
Build succeeded.
22
========== Build: 1 succeeded or up-to-date, 0 failed, 0 skipped ==========
Gast #6096964
Lesenswert?

1
#define F_CPU 4000000UL
2

3
#include <avr/io.h>
4
#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?
Gast #6096968
Lesenswert?

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.
Gast #6096977
Lesenswert?

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.
Angehängte Dateien:
Moderator Persönliche Seite #6097037
Lesenswert?

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.
Moderator Persönliche Seite #6097122
Lesenswert?

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.
Gast #6097135
Lesenswert?

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.
Gast #6097406
Lesenswert?

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.
Gast #6270067
Lesenswert?

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 ;).
Angehängte Dateien:
Moderator Persönliche Seite #6270283
Lesenswert?

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.)
#6270429
Lesenswert?

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
7
}

oder so:
1
while(1)
2
{
3
   PORTB ^= 0xff; // toggle alle bit auf PORTB
4
   _delay_ms(200);
5
}

schreiben

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren