Forum: Mikrocontroller und Digitale Elektronik delay Funktion


von jop (Gast)


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
}

: Verschoben durch User
von Falk B. (falk)


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.

von hopix (Gast)


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

von jop (Gast)


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?

von Stefan S. (chiefeinherjar)


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

von hopix (Gast)


Lesenswert?

Optimierung ausschalten

-O0  (OH NULL)

Trotz dem nimm die fertigen Funktionen. Da ist das Zeitverhalten sicher, 
vor allem wenn du Optimierung eingeschaltet lässt.

Hopix

von jop (Gast)


Lesenswert?

Ich habe einfach gedacht, dass ich mal selber eine mache wie dieser TO:
Beitrag "1-Wire-Bus-Projekt: DS1820  DS18S20  DS2450  DS2408  unter C und 8051"
Aber dann nutze ich halt die vorhandene delay library.
Trotzdem würde mich es interessieren wie ich diesen nun mit "aller 
Gewalt" überliste.

von hopix (Gast)


Lesenswert?

OK
aus technichem Interresse, das ist was anderes.

Dann würde ich diese jedoch mit  InlineAssembler machen, da hast du ein 
taktgenaues Zeitverhalten.

Grüße Hopix

von Falk B. (falk)


Lesenswert?

@ hopix (Gast)

>Dann würde ich diese jedoch mit  InlineAssembler machen, da hast du ein
>taktgenaues Zeitverhalten.

Genau DAS machen die bestehenden Funktionen schon! Viel Spaß beim 
Neuerfinden des Rades!

von hopix (Gast)


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

von Falk B. (falk)


Lesenswert?

Ob Inline-Assembler das Richtige für Programmieranfänger in C ist?
Das ist so wie Integralrechung in der Grundschule . . .

von jop (Gast)


Lesenswert?

@Falk Brunner
Wer das AVR-Tutorial und das gesamte DB des Atmega8 und 
"Softwareentwicklung in C" von Klaus Schmaranz durchgearbeitet hat, ist 
kein "Programmieranfänger".

von jop (Gast)


Lesenswert?

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

von Sebastian Hepp (Gast)


Lesenswert?

Wenn du den Optimierer überlisten willst, dann versuch die Variable i 
mal zusätzlich als volatile zu deklarieren. Dann kannst du den 
Optimierer sogar angeschalten lassen. ;)

von Georg (Gast)


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

von Wolfgang (Gast)


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.

von Carl D. (jcw2)


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!

von Luis Trenker (Gast)


Lesenswert?

Carl D. schrieb:
> GCC kennt für den AVR diverse Intrinsics

Ich staune! Ist sogar im Winavr 2010 schon drin (manche Dinge
werden ja erst Stück für Stück dazugebastelt ....).

von Falk B. (falk)


Lesenswert?

Das ist schon seit einer kleinen Ewigkeit drin . . .

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.