_delay_ms nicht richtig

Gast #2388620
Lesenswert?
• ▲
▼
Hallo,

ich will bei einen Atmega168 mit 14.7456MHz Quarz eine LED im 
1-sek-Rhytmus blinken lassen. Allerdings blinkt die LED im ca. 
5-sek-Rhytmus.
Im AVR-Studio ist bei den Fuses Ext.Crystal.Osc. 8.0- MHz eingestellt.
Hier der Code:

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

#ifndef F_CPU
#define F_CPU 14745600UL
#endif

#define LED PB2

int main(void)
{

  DDRB |= (1<<LED);     //PB2 (LED) als Ausgang
  PORTB &= ~(1<<LED);  //PB2 (LED) ausschalten

  while (1)
  {
    _delay_ms (1000);
    PORTB ^= (1 << LED);
  }
  return 0;
}


Kann mir jemand helfen, warum die LED ca. alle 5 sek blinkt?

Danke von Frank
Gast #2388624
Lesenswert?
• ▲
▼
Warum bin ich auch nicht sicher weil ich um die Delay-Funktionen 
normalerweise einen weiten Bogen machen.
Aber die AVR-Toolchain verhält sich da aus irgendeinem Grund ganz anders 
als WinAVR und demzufolge sind die Delay-Zeiten im Wald.

---
    _delay_ms (1000);
    PORTB ^= (1 << LED);
---

Sind auch 2 Hz Blinken.

Wobei

   PINB = (1<<LED);

etwas eleganter wäre.
Moderator Persönliche Seite #2388641
Lesenswert?
• ▲
▼
Rudolph schrieb:
> Aber die AVR-Toolchain verhält sich da aus irgendeinem Grund ganz anders
> als WinAVR und demzufolge sind die Delay-Zeiten im Wald.

Ja, die war leider einem Bug in der avr-libc aufgesessen.

Gibt's da denn nicht mittlerweile eine neue Version der AVR-Toolchain
von Atmel?  Der Bug stammt aus dem Frühjahr/Sommer 2010 und wurde im
Sommer dann behoben.

mr. mo schrieb:
> Würde das F_CPU auf 8000000UL stellen.

Sehr praktisch, wenn er einen 14,7-MHz-Quarz benutzt. ;-)
Gast #2388646
Lesenswert?
• ▲
▼
Karsten F. schrieb:
> Die delay_ms(xxx) hast einer max für xxx

nein schon lange nicht mehr, es wird nur ungenauer.

> If the user requests a delay greater than the maximal
> possible one, _delay_us() will automatically call _delay_ms()
> instead. The user will not be informed about this case.
Moderator Persönliche Seite #2388647
Lesenswert?
• ▲
▼
Karsten F. schrieb:
> Die delay_ms(xxx) hast einer max für xxx

Inzwischen nicht mehr, sie fällt nun automatisch auf eine solche
Schleife zurück, wie du sie gezeigt hast.

"When the user request delay which exceed the maximum possible one, 
_delay_ms() provides a decreased resolution functionality. [...]"

Allerdings sollte man wohl, wenn man derartig lange Zeiten außerhalb
eine kleinen Test-Applikation benötigt, stattdessen die Benutzung
eines Timers in Erwägung ziehen.

greetings to DK :)

(Edit: Peter war schneller.)
Moderator Persönliche Seite #2388757
Lesenswert?
• ▲
▼
Karsten F. schrieb:
> Hallo Jörg :-) et all.
>
> Ist das von oben (die neue delay_ms ) nicht von avr-libc 1.7.0/1.7.1 ?

Diese Funktionalität ist schon etwas länger dabei:
1
r1453 | joerg_wunsch | 2007-10-29 00:25:56 +0100 (Mon, 29 Oct 2007) | 6 lines
2

3
Submitted by Florin-Viorel Petrov
4
Patch #6236: Improving _delay_us and _delay_ms
5

6
Provide fallback functionality to extend the possible argument range
7
to _delay_us(), and _delay_ms(), respectively.

Antwort schreiben

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.

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.