"_delay_ms" zu kurz, ATMega48

Gast #1913020
Lesenswert?

Hi, ich habe gesehen, dass hier im Forum schon oft über die 
delay-Funktion diskutiert wurde, aber leider habe ich immernoch keine 
Ahnung wieso es bei mir nicht funktioniert...
1
#include <avr\io.h>
2

3
#define F_CPU 1000000
4
#include <util\delay.h>
5

6

7
int main(void){
8

9
  DDRD   = 0xFF;
10

11
  while(1){
12
    PORTD = 0;
13
    _delay_ms(1000);
14
    PORTD = 255;
15
    _delay_ms(1000);
16
  }    
17
}

Folgendes Problem: die Led an PortD 1 blinkt etwa 4 mal zu schnell

Verwendeter Controller: AtMega 48, 8MHz interner Oszillator, CKDIV8 
gesetzt
AVR Toolchain libc
Gast #1913034
Lesenswert?

Johannes M. schrieb:
> Du schreibst auf der einen Seite "#define F_CPU 1000000" und weiter
> unten "8MHz interner Oszillator", welches von beiden möchtest du denn ?
> Hast du dir die Doku zu delay.h durchgelesen?
> Da steht u.a. sowas wie "The maximal possible delay is 262.14 ms / F_CPU
> in MHz." drin.

Hast du sie denn mal gelesen? Es geht mit dem Satz weiter:

The maximal possible delay is 262.14 ms / F_CPU in MHz.

When the user request delay which exceed the maximum possible one, 
_delay_ms() provides a decreased resolution functionality. In this mode 
_delay_ms() will work with a resolution of 1/10 ms, providing delays up 
to 6.5535 seconds (independent from CPU frequency). The user will not be 
informed about decreased resolution.
Gast #1913050
Lesenswert?

Danke schon mal für die Antwortet.

Der Compiler weiß ja nicht ob das CKDIV 8 Fuse gesetzt ist? Daher die 
1Mhz.
Ich hab mal F_CPU auf 8 MHz gesetzt und nochmal gemessen, eine Periode 
(ja an und aus) dauert jetzt 4 Sekunden.... :-(
Gast #1913125
Lesenswert?

@ Richi:

Du hast nichts zu den Posts von Johannes und Peter gesagt.
Sie haben Dich doch darauf hingewiesen, dass:

_delay_ms() darf maximal mit 262.14 ms verwndet werden.

mach doch mal:

_delay_ms(250);
_delay_ms(250);
_delay_ms(250);
_delay_ms(250);

Tommy
Gast #1913149
Lesenswert?

Richi Abc schrieb:
> oh mann peter du hast natürlich Recht, bin schon total verwirrt...
> 0x03 -> bit 0 und 1 natürlich
> macht auch sinn weil der teiler ja aktiviert ist
Ich denke nicht, das heist ja das es ein Teiler/8 ist, und 8Mhz/8 ist 
1Mhz - also läuft der Interne Takt mit 1Mhz. Oder lieg ich jetzt falsch?
#1913158
Lesenswert?

Peter schrieb:
> Richi Abc schrieb:
>> oh mann peter du hast natürlich Recht, bin schon total verwirrt...
>> 0x03 -> bit 0 und 1 natürlich
>> macht auch sinn weil der teiler ja aktiviert ist
> Ich denke nicht, das heist ja das es ein Teiler/8 ist, und 8Mhz/8 ist
> 1Mhz - also läuft der Interne Takt mit 1Mhz. Oder lieg ich jetzt falsch?

Doch du hast absolut Recht, das war der Grund wieso ich F_CPU auf 1MHz 
gesetzt habe.
#1962609
Lesenswert?

#define F_CPU 8000000

for(int i=0;i<151;i++)
{
_delay_ms(33);
}

Dauert bei mir nur ein Bruchteil einer Sekunde, sollte aber +- 5 
Sekunden dauern. ES handelt sich um einen ATMEGA32 mit internen 8 MHz

Womöglich liegt es an der Compiler Einstellung, da hab ich aber nur 
0,1,2,3,s
Mit 0 ist das Problem immer noch da :(

Wenn der interne Takt mit 1 statt 8 laufen würde, sollte delay dann zu 
lang werden oder?

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