Forum: Mikrocontroller und Digitale Elektronik Verzögerungen mit Delay-Befehl oder Timer


von Martin28 (Gast)


Lesenswert?

Hallo zusammen,

wollte eine Verzögerung bei einem Messvorgang einbauen.
Geht eigentlich darum das ein Kondensator sich innerhalb
von dieser Zeit entladen sollte.

Jetzt meine Frage,

kennt AVR Studio den Befehl: _delay_s(1)
oder,                        _delay_ms(1000)

habe alternativ eine Lösung mit dem TIMER0 angestrebt...
habe da einen Vorteiler von 1024 und den höchstmöglichen OC-Wert von 255
drinne. Is ja ein 8-Bit Register.

Damit erreiche Ich aber nur einen Takt von ca. 15 Hz. Um damit auf eine 
Sekunde zu kommen müsste Ich ja nochmal zusätzlich ein 15er Teiler 
einbauen oder einfach ne Schleife durchlaufen...

Kann mir da jemand nen Denkanstoß geben.

Grüße

von Martin28 (Gast)


Lesenswert?

Mein 16-bit TIMER.1 ist schon für ne PWM reserviert....

von 900ss (900ss)


Lesenswert?

Martin28 schrieb:
> kennt AVR Studio den Befehl: _delay_s(1)

AVR-Studio kennt überhaupt keine 'C'-Befehle noch irgendwelche 
Libraries.

Hier ist Hilfe:

http://www.nongnu.org/avr-libc/user-manual/group__util__delay.html

Aufmerksam lesen bitte!

900ss

von Martin28 (Gast)


Lesenswert?

Alles klar. Vielen Dank

von Peter D. (peda)


Lesenswert?

Martin28 schrieb:
> Um damit auf eine
> Sekunde zu kommen müsste Ich ja nochmal zusätzlich ein 15er Teiler
> einbauen

Ja.
Du hast genug SRAM und von dem nimmst ein Byte zum Zählen bis 15.



Peter

von Martin28 (Gast)


Lesenswert?

Ok werde mal beide Varianten testen...

Merci Peter

von Ralph (Gast)


Lesenswert?

Immer diese Delay.

Die Funktion gehört verboten !!!!!

Während diese Delay läuft, macht der µC NICHTS anderes als warten.

Sobald eine programmbedingt notwendige Verzögerung über einige wenige 
µsekunden hinausgeht muss da ein Timer hin.

ALLES ANDERE IST NUR MURKS   !!!!!!!!!!

von Peter II (Gast)


Lesenswert?

Ralph schrieb:
> Immer diese Delay.
>
> Die Funktion gehört verboten !!!!!

was hast du denn für ein Problem. Delay ist oft sinnvoll. Wenn man z.b. 
bei bei einer 1-Wire leitung das timing einhalten muss dann muss man ein 
paar µs warten. Dafür ist ein Timer ungeeignet.

von Ralph (Gast)


Lesenswert?

Peter II schrieb:
> Wenn man z.b.
> bei bei einer 1-Wire leitung das timing einhalten muss dann muss man ein
> paar µs warten. Dafür ist ein Timer ungeeignet.

Hast du wirklich gelesen was ich geschrieben habe ?

von Peter II (Gast)


Lesenswert?

Ralph schrieb:
> Hast du wirklich gelesen was ich geschrieben habe ?

ja, wenn z.b. zur diagnose bei boot eine LED mal 1 sekunden lang 
leuchten soll nutze ich auch ein delay.

delays in der Hauptschleife stören auch niemand, ISR werden immer noch 
abgearbeitet.

von Falk B. (falk)


Lesenswert?

@  Ralph (Gast)

>Immer diese Delay.

Immer dieses Regenwetter.

>Die Funktion gehört verboten !!!!!

Typisch deutsch. Vorschriften und Verbote statt Aufklärung.

>Während diese Delay läuft, macht der µC NICHTS anderes als warten.

Ist eben so.

>Sobald eine programmbedingt notwendige Verzögerung über einige wenige
>µsekunden hinausgeht muss da ein Timer hin.

Käse. So allgemein kann man das gar nicht sagen. Wenn man weiß was man 
tut (tm) sind auch lange Wartezeiten durchaus OK.

>ALLES ANDERE IST NUR MURKS   !!!!!!!!!!

Nö.

von Ralph (Gast)


Lesenswert?

Da die Delay aber nicht mit einem Timer arbeite, sondern die Zeit 
einfach in einer Schleife absitzt hast du bei Interrupts eine 
undefiniert Dauer der Delay.


zb delay auf 1 Sekunde, in der Sekunde kommen 1000 Interrupts a 100 µsec 
(zb Uart Übertragung) ==> Delay dauert damit nicht 1 sondern 1.1 
Sekunden.

Eine wirklich gute Funktion.....


Wo ist das Problem da einen Timer einzusetzen ?
Die 5 Min den Timer zu konfigurieren kann doch nicht das Problem sein, 
aber das Ergebnis ist eine verlässliche Zeit die nicht den ganzen µC 
lahm legt.

Peter II schrieb:
> delays in der Hauptschleife stören auch niemand, ISR werden immer noch
> abgearbeitet.

Das heißt deine Hauptschleife muss also nie Daten aus den Interrupts 
verarbeiten ?
Es ist völlig egal wie lange deine Hauptschleife benötigt ?
Dann gehe ich davon aus das du viel zuviel Logik in den 
Interrruptroutinen hast. Anstatt die Verarbeitung un der Hauptschleife 
zu erledigen.
==> Dioe Delay wird irgendeine Zeit liefern, aber bestimmt nicht die 
Zeit die du einstellst.

von spontan (Gast)


Lesenswert?

Ralph schrieb:
>Während diese Delay läuft, macht der µC NICHTS anderes als warten.

Da muß ich mal mit Radio Eriwan antworten:
Im Prinzip hast Du Recht, aber...

Wie sieht denn Deine Alternative aus, wenn ein Delay erzeugt werden muß. 
Der Prozessor durchläuft weiter die Hauptprogrammschleife und macht 
fleißig Rechenarbeit...

Aber was macht er denn wirklich? Das hängt sehr von der Anwendung ab:

- er kann Uarts bedienen
- AD-Wandler oder DA-Wandler bedienen
- er kann Ausgaben machen zeitgesteuerte, oder durch Verknüpfungen 
festgelegte
- und und und


Aber es gibt auch Fälle, wo er nur durch die HP-Schleife nudelt und nix 
vernünftiges macht, eben weil er wartet, bis Dein vorgeschlagener Timer 
abgelaufen ist. Dann gehts im HP mit einer Verzweigung weiter. In 
solchen Fällen kann es übersichtlicher sein mit einem Delay zu arbeiten.

Ich mag Delays auch nicht sonderlich, aber ich hab die Phantasie mir 
Anwendungen vorzustellen, bei denen Delays
- einfach zum Ziel führen
- übersichtliche Abläufe darstellen
- den Prozessor genausogut auslausten wie eine HP-Schleife.

So what?

von Karl H. (kbuchegg)


Lesenswert?

spontan schrieb:

> Aber es gibt auch Fälle,

Gibt es.

Sind aber eher selten.
Hand aufs Herz: In der Mehrzahl der Fälle, in denen Anfänger mit 
_delay_ms arbeiten, wäre eine Timerlösung besser. Und das fängt bereits 
mit dem gerne gemachten Lauflicht an, das plötzlich zusätzlich noch auf 
Tastendrücke das Muster umschalten soll.

_delay_ms führt gerade bei Anfängern zu einer Programmstruktur, die für 
weitergehende Programmerweiterungen nicht geeignet ist. In dem Moment, 
in dem mehrere Dinge gleichzeitig passieren soll (Lauflicht UND parallel 
dazu soll das Muster zu jedem Zeitpunkt umschaltbar sein), ist dann das 
Rätselraten groß und es werden die tollsten Konstrukte erfunden, die 
dann auch nicht richtig funktionieren nur damit man am delay weiterhin 
kleben kann.


Das es für delays sinnvolle Anwendungsfälle gibt, bestreite ich nicht. 
Bruache ich nur schnell ein Programm, welches irgendwas toggelt um eine 
Hadrware zu testen, nehm ich ein delay. Brauch ich eine Statusanzeige 
vor der Hauptschleife, nehm ich ein delay. Bruach ich was kurzes im µs 
Bereich, nehm ich ein delay. Dagegen hat auch keiner was.
Aber abgesehen davon ist in der überwiegenden Mehrzahl der Fälle, mit 
denen wir uns hier im Forum rumschlagen müssen, _delay_ms nicht die 
Lösung sondern der Problemverursacher. Und der Weg zu einer sauberen 
Lösung beginnt damit, dem Aspiranten den Weg zu einem taktbasiertem, 
eventbasiertem bzw auf einer Statemachine basierendem Programm zu 
zeigen.

von Martin28 (Gast)


Lesenswert?

Also Danke nochmals für die aufklärenden Diskussionen, aber wie Ich 
schon am Anfang des Posts geschrieben habe, will Ich ja nichts anderes 
als warten das sich ein Kondensator entlädt, bevor Ich irgendwelche 
andere Routinen abarbeite...

Ob da nun ein Timer läuft oder eine Delay-Funktion. Da sehe Ich jetzt 
irgendwie kein direkten Vorteil oder Nachteil.
Das bezieht sich jetzt aber auch nur auf meine Anwendung. Sobald da z.B 
Daten per UART übergeben werden sieht das natürlich wieder anders aus.

Grüße

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.