www.mikrocontroller.net

Forum: Compiler & IDEs delay.h - Ruf der Verzweiflung


Autor: Raphael Sobczyk (Firma: None) (hex-boy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo alle zusammen,

ich bin hier neu, frisch angemeldet, vorher mit Assembler, jetzt mit C 
angefangen. Das Forum lese ich aber schon seit längerer Zeit. Ich habe 
schon viele Antworten auf meine Fragen bekommen, ohne einen Post 
geschickt zu haben (alle Achtung!). Thema Delay war auch schon unzählige 
Male gewälzt, aber nirgendwo habe ich 'ne Antwort gefunden.
Mein Problem:
Delay Zeiten bei mir viel zu lange (8-10 mal zu lang). 200ms sollten es 
sein, ung. 1600 sind es.
Ich habe auch ein Beispielprogramm von irgendwo kopiert, F_CPU-Bedingung 
hinzugefügt (make file ist automatisch generiert), auf M8 und M128 
ausprobiert, Parameter "20" ist auch constant und auch nicht zu groß, 
alles leider ohne Erfolg. Sieht jemmand einen versteckten Fehler?
Der Code:

#include <avr/io.h>

#ifndef F_CPU
#define F_CPU 8000000UL
#warning "F_CPU war noch nicht definiert, wird nun mit 8000000 
definiert"
#endif

#include <util/delay.h>

int main(void)
{
    DDRB = 0xFF;
    int i;
    while(1) {
        PORTB ^= (1 << PB0);  // LED
        for(i=0;i<10;i++) {
     _delay_ms(20);
        }
    }
    return 0;
}

Ich verwende: AVR Studio 4.13.557, Service Pack 1 mit eingebautem 
WinAVR.
Danke im Voraus!

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hört sich für mich so an, als ob du mit internem RC-Oszillator als 
Taktquelle arbeitest und den mit den 1 MHz wie ab Werk betreibst, aber 
das Programm fälschlicherweise über F_CPU gesagt bekommt, es wäre ein 8 
MHz Taktquelle am werkeln.

Eine andere Fehlerursache könnte sein, dass beim Übersetzen mit AVR-GCC 
die Codeoptimierung nicht eingeschaltet ist.

Mehr im Abschnitt Warteschleifen im AVR-GCC-Tutorial

Autor: Raphael Sobczyk (Firma: None) (hex-boy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

die Optimierung ist auf -O2 eingestellt. Und welche "Flag" ist für 
Clock-Auswahl verantwortlich?

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Und welche "Flag" ist für Clock-Auswahl verantwortlich?

Keins.

Taktauswahl machst du über den Hardwareaufbau (interne Taktquelle oder 
externe z.B. Quarz) und die Fuses-Einstellung passend tzm 
Hardwareaufbau.

Damit das Programm (bzw. hier die delay Routinen in der Library) passend 
zur Taktquelle läuft, wird der eingestellte Takt über das Makro F_CPU 
bekannt gemacht. Andere Funtionen, die mit diesem Makro arbeiten, können 
sein UART (serielle Übertragung), Timer, ...

Mehr dazu im Artikel AVR Fuses

Autor: OliverSo (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gar kein Flag, die Taktfrequenz lässt sich nur von aussen durch 
umprogrammieren der entsprechenden Fuses ändern. Das define F_CPU dient 
nur dazu, dem Programm mitzuteilen, welche Taktfrequenz extern 
eingestellt wurde, hat aber keinen Einfuß auf den Prozessor.

Mehr Info dazu gibts im DAtenblatt, und auch z.B. hier:
http://www.mikrocontroller.net/articles/AVR_Fuses#...

Oliver

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Gar kein Flag, die Taktfrequenz lässt sich nur von aussen durch
> umprogrammieren der entsprechenden Fuses ändern.

Das kommt auf den Typ an. Bei manchen kann der Takt-Vorteiler über ein 
I/O-Register eingestellt werden.

Autor: Raphael Sobczyk (Firma: None) (hex-boy)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das war das!

Die Fuses CKSEL3..0 waren einfach im Originalzustand - "0001" also "1 
MHz internal RC". Ich habe es auf "0000" gesetzt, also "External clock" 
(auf XTAL1), also meine Config. und es funzt!
Ich danke euch!
PS. Das beste Forum die es je gab!!!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.