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); } }
- Optimierung beim Compiler aktiviert? - Wie viel schneller ist denn eine "viel höhere Frequenz"?
Hallo, Wie soll sich bei deinem Programm überhaupt etwas ändern, es wird doch immer das selbe an den Port geschrieben. gruß, Bjoern
"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."
Bjoern B. schrieb: > es wird doch > immer das selbe an den Port geschrieben. Sechs, setzen. Man achte auf das ^=. /edit: Hat sich hiermit erledigt :-)
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.
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. |
@... stimmt wohl, aber das sollte auch nur ein Wink sein, da vll mal genauer nachzuschauen
Das Ganze gibt es hier auch auf deutsch: http://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29
Eventuell mal nach den Fuses schauen. Könnte sein, daß da der Watchdog zuschlägt.
... 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. |
Martin schrieb: > okey danke an euch funktioniert jetzt ;) Und? Woran lags jetzt? Obigen Code falsch abgetippt? Falsches File auf den AVR gebrannt?
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 ;-)
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.