"_delay_ms" zu kurz, ATMega48

Gast #1913020
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
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.
Gast
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
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
Richi Abc schrieb:
> oh jetzt ja, 0x91 war das Kalibrierbyte, von CLKPR ist nur Bit 7 un 8
> gesetzt, sollte also passen -> Teiler 1
kann auch nicht sein, denn der Teiler ist ein bit 0,1,2 und 3 - bit 8 
gibt es als Softwareentwickler nicht - da fängt man mit 0 an zu zählen.
Gast
@ 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
Christian L. schrieb:
> Und das auch nur bei einer alten GCC-Version. Bei einer aktuellen ist
> auch das kein Problem mehr!
sicher? Denn was hat der GCC mit der lib-avr zu tun? Das ganze liegt 
doch nicht im Compiler das es etwas ungenauer ist, sondern an der Art 
der Implemtierung.
Gast
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?
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.
#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

Eine eigene Frage? Dieser Thread ist über 16 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.