Forum: Mikrocontroller und Digitale Elektronik AtmelStudio 7 util/delay.h funktioniert nicht


von Dominik (Gast)


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.

von Jim M. (turboj)


Lesenswert?

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.

von define (Gast)


Lesenswert?

Moin,

in meinem Code ist die korrekte definition für den Takt:
1
#define F_CPU 4000000UL

Grüße (:

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Dominik (Gast)


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.

von Frank M. (ukw) (Moderator) Benutzerseite


Lesenswert?

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.

von Dominik (Gast)


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

von define (Gast)


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?

von Dominik (Gast)


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.

von Oliver S. (oliverso)


Lesenswert?

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.

: Bearbeitet durch User
von Martin (Gast)


Lesenswert?

Ich würde wenn das delay funktioniert aber nach dem Port einschalten ein 
weiteres delay machen, sonst wird deine aufgeschlossene Last kaum 
funktionieren

von Dominik (Gast)


Angehängte Dateien:

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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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.

von Dominik (Gast)


Angehängte Dateien:

Lesenswert?

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.

von Oliver S. (oliverso)


Lesenswert?

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

: Bearbeitet durch User
von Johann L. (gjlayde) Benutzerseite


Lesenswert?

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"...

von Oliver S. (oliverso)


Lesenswert?

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

von Frank M. (ukw) (Moderator) Benutzerseite


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.

: Bearbeitet durch Moderator
von Dominik (Gast)


Angehängte Dateien:

Lesenswert?

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.

von define (Gast)


Lesenswert?

Dass du teilweise ein großes 0X statt klein 0x benutzt wenn du 
Hex-Values zuweist stört nicht?

von Dominik (Gast)


Lesenswert?

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

von Georg M. (g_m)


Lesenswert?

Dominik schrieb:
> war ein Tipp fehler

Noch einer:
PORTB = 0X00;

von Frank M. (ukw) (Moderator) Benutzerseite


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.

: Bearbeitet durch Moderator
von Dominik (Gast)


Lesenswert?

Wenn ich das _delay_ms() weck mache dann,
toggelt auch der pin.
laut Analyzer.

von Dominik (Gast)


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.

von Dominik (Gast)


Lesenswert?

so am Laptop Funktioniert es -.-


ich hab aber keine Ahnung wieso weshalb warum ...



hat wer eine Idee?

von Hugo H. (hugohurtig1)


Lesenswert?

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 :-)

: Bearbeitet durch User
von Dominik (Gast)


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.

von Kurduppel (Gast)


Lesenswert?

Hat jemand schon das gelöst?

von Marco H. (damarco)


Lesenswert?

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 !

: Bearbeitet durch User
von Oliver S. (oliverso)


Lesenswert?

Eher nur als nicht.

Oliver

von Hmmm (Gast)


Lesenswert?

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.

von Uwe Grassmé (Gast)


Angehängte Dateien:

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 ;).

von Stefan F. (Gast)


Lesenswert?

Marco H. schrieb:
> Und sie funktioniert nicht mit Optimierung !

Es ist anders herum. Sie funktioniert nicht ohne Optimierung.

von Marco H. (damarco)


Lesenswert?

Das habe ich schon mitbekommen und selbst geprüft das diese Aussage 
falsch war....

von Stefan F. (Gast)


Lesenswert?

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"

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


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.)

von Ingo E. (ogni42)


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

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

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.

: Bearbeitet durch Moderator
von Ingo E. (ogni42)


Lesenswert?

Stimmt, aber alle anderen Antworten haben das, was ich geschrieben habe, 
nicht erwähnt - oder ich habe was übersehen.

von Einer K. (Gast)


Lesenswert?

Ingo E. schrieb:
> oder ich habe was übersehen.

Ingo E. schrieb:
> PORTB ^= 0xff; // toggle alle bit auf PORTB

PINB = 0xff; // toggle alle bit auf PORTB

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.