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


von Raphael S. (Firma: None) (hex-boy)


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!

von Stefan B. (stefan) Benutzerseite


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

von Raphael S. (Firma: None) (hex-boy)


Lesenswert?

Hallo,

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

von Stefan B. (stefan) Benutzerseite


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

von OliverSo (Gast)


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#Vergleich_der_Fuses_bei_verschiedenen_Programmen

Oliver

von Rolf Magnus (Gast)


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.

von Raphael S. (Firma: None) (hex-boy)


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

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.