delay us liegt weit daneben

Gast #2536203
Lesenswert?

Hallo, ich habe eine Atmega 168-20pu und habe dieses kleine Programm 
genommen, um die delay Funktion zu testen. Leider liege ich nicht bei 
100us, sondern bei 1ms.

Die 8MHz habe ich über PB0 gemessen.


#define F_CPU 8000000

#include <avr/io.h>
#include <util/delay.h>

int main()
{
  DDRB=0xff;


  while( 1 ) {

   PORTB=0x00;
    _delay_us( 100 );

   PORTB=0xff;
    _delay_us( 100);


  }
}
Angehängte Dateien:
#2536217
Lesenswert?

mögliche Fehlerquellen bei _delay_us und _delay_ms

1) man muss beiden Funktionen einen konstanten Ausdruck
   übergeben. Keine Variablen oder sonst zur Laufzeit berechnete
   Werte

2) der Optimizer des Compilers muss eingeschaltet sein

3) die mittels F_CPU angegebene Taktfrequenz muss auch tatsächlich
   die sein, mit der der AVR wirklich läuft


Sind alle 3 Punkte erfüllt, dann stimmen die _delay Zeiten erstaunlich 
genau. Punkt 1 ist bei dir offensichtlich erfüllt. Den Rest kannst nur 
du vor Ort prüfen.
Gast #2536218
Lesenswert?

Ne Warnung bekam ich schon, dachte aber, dass hier keine Optimirungen 
erlaubt sind.


Warning  1  #warning "Compiler optimizations disabled; functions from 
<util/delay.h> won't work as designed"

Was muss ich denn da machen?
#2536221
Lesenswert?

Rudi schrieb:
> Ne Warnung bekam ich schon, dachte aber, dass hier keine Optimirungen
> erlaubt sind.

Weil keine Optimierungen erlaubt sind, warnt auch der Compiler, dass 
Optimierungen ausgeschaltet sind :-)

(bisse nachdenken. Wenns wurscht wäre, gäbs keine Warnung)

> Was muss ich denn da machen?

Die Optimierung einschalten.
Welche IDE benutzt du? Irgendwo in den Projekt Konfigurations Optionen 
(meist ein Dialog, der von einem Menüpunkt aus aufgerufen wird), gibt es 
eine Einstellung für Compiler-Optimizations. Die stellst du auf -Os.

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