Forum: Compiler & IDEs Blinklicht zu hohe Frequenz


von Martin (Gast)


Lesenswert?

Hallo hab da ein Problem, mein LED am PORT A, Pin8 (also PA7) sollte 1 
mal in der sec blinken, jedoch blinkt es mit einer viel höheren Frequenz

#define F_CPU 16000000UL

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



void main (void)
{
  DDRA= 0xff;
  PORTA=0xff;


  while(1)
  {
    _delay_ms(1000);
    PORTA^= (1<<PA7);
  }


}

von Nico S. (nico22)


Lesenswert?

- Optimierung beim Compiler aktiviert?
- Wie viel schneller ist denn eine "viel höhere Frequenz"?

von Bjoern B. (per)


Lesenswert?

Hallo,

Wie soll sich bei deinem Programm überhaupt etwas ändern, es wird doch 
immer das selbe an den Port geschrieben.

gruß,
Bjoern

von steffen (Gast)


Lesenswert?

"The macro F_CPU is supposed to be defined to a constant defining the 
CPU clock frequency (in Hertz).

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

von Bjoern B. (per)


Lesenswert?

ahhh,
schon zuspät Du toggelst das bit ja.....

sorry,
Bjoern

von Nico S. (nico22)


Lesenswert?

Bjoern B. schrieb:
> es wird doch
> immer das selbe an den Port geschrieben.

Sechs, setzen. Man achte auf das ^=.

/edit: Hat sich hiermit erledigt :-)

von ... (Gast)


Lesenswert?

Bjoern B. schrieb:
> Wie soll sich bei deinem Programm überhaupt etwas ändern, es wird doch
> immer das selbe an den Port geschrieben.

Schau nochmal genau hin! Das "^" steht da nicht umsonst.

von ... (Gast)


Lesenswert?

steffen schrieb:
> The maximal possible delay is 262.14 ms / F_CPU in MHz."

Wenn schon zitieren, dann aber bitte vollständig!
1
When the user request delay which exceed the maximum possible one,
2
_delay_ms() provides a decreased resolution functionality. In this
3
mode _delay_ms() will work with a resolution of 1/10 ms, providing
4
delays up to 6.5535 seconds (independent from CPU frequency). The
5
user will not be informed about decreased resolution.

von steffen (Gast)


Lesenswert?

@... stimmt wohl,

aber das sollte auch nur ein Wink sein, da vll mal genauer nachzuschauen

von hp-freund (Gast)


Lesenswert?


von ... (Gast)


Lesenswert?

Eventuell mal nach den Fuses schauen. Könnte sein, daß da der Watchdog 
zuschlägt.

von Martin (Gast)


Lesenswert?

okey danke an euch funktioniert jetzt ;)

von ... (Gast)


Lesenswert?

... schrieb:
> Wenn schon zitieren, dann aber bitte vollständig!
Autsch, da hab ich doch selber noch einen Teil unterschlagen :(
1
If the avr-gcc toolchain has __builtin_avr_delay_cycles(unsigned long)
2
support, maximal possible delay is 4294967.295 ms/ F_CPU in MHz. For
3
values greater than the maximal possible delay, overflows results in
4
no delay i.e., 0ms.

von ... (Gast)


Lesenswert?

Martin schrieb:
> okey danke an euch funktioniert jetzt ;)

Und? Woran lags jetzt? Obigen Code falsch abgetippt? Falsches File auf 
den AVR gebrannt?

von hp-freund (Gast)


Lesenswert?

Das würde mich jetzt auch interessieren.

Wenn man die Optimierung nicht ganz ausschalten will geht auch:
1
volatile int d=1000;
2
...
3
_delay_ms(d);

das bläht aber ganz schön ;-)

von Martin (Gast)


Lesenswert?

Die Wartezeit der Funktion _delay_ms() ist auf 262,14ms/F_CPU (in MHz) 
begrenzt, d.h. bei 20 MHz kann man nur max. 13,1ms warten. Die Wartezeit 
der Funktion _delay_us() ist auf 768us/F_CPU (in MHz) begrenzt, d.h. bei 
20 MHz kann man nur max. 38,4us warten. Längere Wartezeiten müssen dann 
über einen mehrfachen Aufruf in einer Schleife gelöst werden.

hab dann genau wie oben beschrieben noch diese schleife programmiert, 
über die _delay_ms das es sich auf eine sekunde ausgeht, siehe 
anwendungsbsp von delay

http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29

von ... (Gast)


Lesenswert?

Dann hast Du aber eine Uraltversion der avr-libc und solltest langsam 
mal updaten. Ab Version 1.6 gilt dieses Limit so nicht mehr und es sind 
delays bis ca. 6,5s möglich (mit der neuesten auch noch mehr) und die 
1.6 gibt es schon seit 2007.

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.