Hallo,
ich bin noch relativ neu in der AVR Szene, und habe eine Frage zu der
Programmlaufzeit von AVRGCC Programmen.
Mir ist schon seit längerem Aufgefallen, dass die _delay_XX() Funktionen
bei mir nicht so ganz richtig laufen.
Hier mal ein kurzes Programm:
1 | #define F_CPU 1000000L
|
2 |
|
3 | #include <avr/io.h>
|
4 | #include <util/delay.h>
|
5 |
|
6 |
|
7 | int main(void)
|
8 | {
|
9 | DDRB=0xff;
|
10 |
|
11 | while(1)
|
12 | {
|
13 | PORTB |=1;
|
14 | _delay_us(30);
|
15 | PORTB &=0;
|
16 | _delay_us(30);
|
17 | }
|
18 | }
|
Der MEGA8 Läuft mit dem internen Oszi auf 1MHz und sollte eine Frequenz
von ca 16kHz erzeugen. (Für die Schlaumichel: ich weiß dass man dafür ne
PWM nimmt.)
Der AVR Simulator sagt mir aber, dass ich ne Schleifendauer von 7,1ms
habe und mein Oszi sagt mir das selbe. Das macht nach Adam Riese eine
Abweichung von etwas mehr als 6ms bzw eine Abw. um das 100fache. So
ungenau kann doch selbst der interne Oszillator nicht sein oder?
Deshalb meine Frage: Ist die Nutzung der delay Funktion richtig?
Na klar, kann ein C-Programm nie so schnell laufen wie ein ASM-Programm,
aber ich finde die Zeiten teilweise ganzschön erschreckend. Wo liegen
bei euch die Typischen Zeiten für eine while(), for() oder if()
anweisung?
Oder ist es normal, dass C-Code soooo lange Programmlaufzeiten hat?
Optimierungsstufe ist null.
Bin dankbar für jeden ernstgemeinten Rat.