delay Funktion

Gast #4524267
Lesenswert?

Bin gerade dabei eine delay Funktion zu basteln (Atmega8 8MHz; AVRISP 
mkii), aber irgendwie...
Ich hab das gefühl, dass die Funktion gar nicht angesprungen wird, hat 
das vielleicht irgendwas mit der Optimierung zu tun und wenn wo kann ich 
diese im AVR Studio 7 einstellen? Hier mal der Code:
1
#include <avr/io.h>
2
#include "lcd-routines.h"
3
#include <stdlib.h>
4
#include <stdint.h>
5

6
void dly(int seconds);          
7

8
int main(void)
9
{
10
  DDRB = 0xFF;
11
  
12
    lcd_init();
13
  lcd_clear();
14
  
15
    while (1) 
16
    {
17
    PORTB |= (1<<PB6);
18
    dly(100);
19
    PORTB &= ~(1<<PB6);
20
    }
21
}
22

23
void dly(int seconds)  
24
{
25
  int i=0;
26
  for(i=0; i<seconds; i++);
27
}
#4524275
Lesenswert?

@ jop (Gast)

>Bin gerade dabei eine delay Funktion zu basteln (Atmega8 8MHz; AVRISP

Warum nutzt du nicht die vorhandenen? Die sind getestet und 
funktionieren.

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

>Ich hab das gefühl, dass die Funktion gar nicht angesprungen wird, hat
>das vielleicht irgendwas mit der Optimierung zu tun

Richtig. Der Optimizer schmeißt sie raus, weil sie aus seiner Sicht 
keine Wirkung haben, denn die Variablen i und seconds werden nirgend wo 
weiter verwendet.

@Mods

Bitte mal den Thread verschieben, Danke.
Gast #4524279
Lesenswert?

Hallo erstmal

ich gehe mal davon aus das diese einfach wegoptimiert wurde.
Aber selbst wenn nicht wirst du da im Controller keinen Unterschied 
bemerken.
Nur die Tatsache das du deine Variablele "Sekunden" nennst für noch 
nicht zu einem eindeutigen Zeitverhalten.

Du durchläufst die Schleife einfach 100 mal und die Ausführungszeit ist 
abhängig von der Taktfrequenz.

Ich erwarte hier (aus der Glaskugel heraus) eine verzögerung um den 
millisekunden Bereich.

Als epfehlung es gibt ein delay / delay_ms Funktion

Grüße Hopix
Gast #4524285
Lesenswert?

Ok, vielen Dank. Ich weiß, dass dort eine Zeit ca. im 
Microsekundenbereich entstehen wird, da die Variable nur ein Platzhalter 
ist bzw. noch umbenannt wird.
Sobald ich in die Funktion einen LCD Befehl geschrieben habe, wurde sie 
nämlich ausgeführt. Wie überliste ich dann die Optimierung?
#4524290
Lesenswert?

jop schrieb:
> Sobald ich in die Funktion einen LCD Befehl geschrieben habe, wurde sie
> nämlich ausgeführt. Wie überliste ich dann die Optimierung?

Warum willst du mit Gewalt die Optimierung überlisten? - Falk hat dir 
doch schon eine Lösung für dein Problem dargelegt. In Farbe. Und bunt. 
Mit alles. Und scharf.

Falk B. schrieb:
>>Bin gerade dabei eine delay Funktion zu basteln (Atmega8 8MHz; AVRISP
>
> Warum nutzt du nicht die vorhandenen? Die sind getestet und
> funktionieren.
>
> 
https://www.mikrocontroller.net/articles/AVR-GCC-Tutorial#Warteschleifen_.28delay.h.29
Gast #4524323
Lesenswert?

Falk B. schrieb:
> Viel Spaß beim
> Neuerfinden des Rades!

Genau darum soll es ja gehen.

In der Schule fängt man ja auch mit 1+1 an obwohl das schon so viele 
voher gerechnet haben :-) Lerneffekt halt.

Das wichtige beim neu erfinden des Rades ist zu lernen wie man es rund 
bekommt.
viel Spaß dabei

Hopix
Gast #4524418
Lesenswert?

jop schrieb:
> Und ja es ist halt rein aus technischem Interesse um zu wissen was
> hinter der Funktion steckt, wie sie funktioniert.

Ja, das ist schon in Ordnung. Aber dass der Optimierer die Funktion für 
überflüssig hält, könnte einen auch zu der Überlegung führen, dass der 
Optimierer hier recht hat und der Programmierer unrecht. Ich würde nicht 
so weit gehen wie manche andere, die delay immer als Programmierfehler 
betrachten, aber es ist schon wahr, dass es fast immer eine bessere 
Lösung gibt, gerade im Embedded-Bereich. Bei Betriebssystemen wie Linux 
oder Windows ist das was anderes, da dort eine Delay-Funktion in 
Wirklichkeit den Scheduler aufruft und dadurch an andere Programmteile 
übergibt. Und genau das sollte auch bei einem einfachen µController 
passieren.

Georg
Gast #4524423
Lesenswert?

Georg schrieb:
> Aber dass der Optimierer die Funktion für überflüssig hält, könnte
> einen auch zu der Überlegung führen, dass der Optimierer hier recht
> hat und der Programmierer unrecht.

Der µC macht (leider) immer genau das, was man ihm sagt. Aber oft genug 
ist das nicht das, was man von ihm will.
#4524446
Lesenswert?

GCC kennt für den AVR diverse Intrinsics", z.B.:
1
 void __builtin_avr_delay_cycles (unsigned long ticks)
Damit kann man exakte ticks Takte verplempern. Solange man keine ISR im 
Hintergrund laufen hat. Dann dauert's länger. Aber für kurze 
Verzögerungen ganz brauchbar und vor allem: es funktioniert!

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren